- 締切済み
GoogleAppsScriptでPDF変換エラー
Google Apps Scritptで、スプレッドシートをPDFに変換してGoogleドライブの特定のフォルダに保存するスクリプトを書いています。 ところが、何度試みても、以下の行で止まってしまい、エラーの表示もされず、終了の表示もされないままずっと止まってしまい、対処が分かりません。 [14-08-18 09:39:48:230 JST] OAuthConfig.hashCode() [0 秒] どなたかどのようにすれば対処できるのか、お教えくださると助かります。以下、関係する実行トランスクリプトとスクリプトを引用します(初心者なので間違っている箇所もあると思います)。 もう少々実行トランスクリプトを引用すると、以下のとおりです。 [14-08-18 09:39:48:096 JST] OAuthConfig.setRequestTokenUrl([https://www.google.com/accounts/OAuthGetRequestToken?scope=https://docs.google.com/feeds]) [0 秒] [14-08-18 09:39:48:096 JST] OAuthConfig.setAuthorizationUrl([https://accounts.google.com/OAuthAuthorizeToken]) [0 秒] [14-08-18 09:39:48:096 JST] OAuthConfig.setAccessTokenUrl([https://www.google.com/accounts/OAuthGetAccessToken]) [0 秒] [14-08-18 09:39:48:099 JST] Browser.hashCode() [0 秒] [14-08-18 09:39:48:159 JST] CacheService.hashCode() [0 秒] [14-08-18 09:39:48:159 JST] CalendarApp.hashCode() [0 秒] (中略) [14-08-18 09:39:48:181 JST] NicknameManager.hashCode() [0 秒] [14-08-18 09:39:48:181 JST] PropertiesService.hashCode() [0 秒] [14-08-18 09:39:48:182 JST] ScriptApp.hashCode() [0 秒] [14-08-18 09:39:48:183 JST] ScriptDb.hashCode() [0 秒] [14-08-18 09:39:48:184 JST] ScriptProperties.hashCode() [0 秒] [14-08-18 09:39:48:185 JST] Session.hashCode() [0 秒] [14-08-18 09:39:48:185 JST] SitesApp.hashCode() [0 秒] [14-08-18 09:39:48:186 JST] SoapService.hashCode() [0 秒] [14-08-18 09:39:48:188 JST] SpreadsheetApp.hashCode() [0 秒] [14-08-18 09:39:48:189 JST] UiApp.hashCode() [0 秒] [14-08-18 09:39:48:191 JST] UrlFetchApp.hashCode() [0 秒] [14-08-18 09:39:48:192 JST] UserManager.hashCode() [0 秒] [14-08-18 09:39:48:192 JST] UserProperties.hashCode() [0 秒] [14-08-18 09:39:48:193 JST] Utilities.hashCode() [0 秒] [14-08-18 09:39:48:193 JST] Xml.hashCode() [0 秒] [14-08-18 09:39:48:194 JST] XmlService.hashCode() [0 秒] [14-08-18 09:39:48:197 JST] Spreadsheet.hashCode() [0 秒] [14-08-18 09:39:48:198 JST] Sheet.hashCode() [0 秒] [14-08-18 09:39:48:198 JST] (class).hashCode() [0 秒] [14-08-18 09:39:48:198 JST] Sheet.hashCode() [0 秒] [14-08-18 09:39:48:199 JST] Spreadsheet.hashCode() [0 秒] [14-08-18 09:39:48:230 JST] Sheet.hashCode() [0 秒] [14-08-18 09:39:48:230 JST] OAuthConfig.hashCode() [0 秒] (ここで止まってしまい、エラーもでず、終了の表示も出ない) コード: function PDFSeisei(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("シート名あり"); SpreadsheetApp.setActiveSheet(sheet); var sheetID = sheet.getSheetId(); var key = ss.getId(); var name = "ファイル名.pdf"; // PDF生成 var oauthConfig = UrlFetchApp.addOAuthService("spreadsheets"); var scope = "https://docs.google.com/feeds"; oauthConfig.setConsumerKey("グーグルで設定したキー"); // anonymousでも同じ症状 oauthConfig.setConsumerSecret("グーグルで設定したシークレット"); // anonymousでも同じ症状 oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope); oauthConfig.setAuthorizationUrl("https://accounts.google.com/OAuthAuthorizeToken"); oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken"); var Para = { oAuthServiceName: 'spreadsheets', oAuthUseToken: 'always', }; //PDF出力をするURLをFetchする var pdffile = UrlFetchApp.fetch('https://docs.google.com/a/(ここにドメイン名あり)/spreadsheets/d/'+key+'/export?gid='+sheetID+ '&format=pdf&portrait=true&size=A4&gridlines=false&fitw=true', Para).getBlob().setName(name); //作成したPDFをフォルダに格納する var folder = DocsList.getFolderById("フォルダのIDを記載しています"); var file = folder.createFile(pdffile); }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
>アドバイスいただいた方法では、スプレッドシートの中で任意のシートだけをPDFにできるのでしょうか。 これはSpreadsheetをまるごとPDFとして取得するので、シート単位での取得はできないと思います。またSheetオブジェクトではまだPDF取得のメソッドはなかったと思います。 >また、回答No.1のご質問について回答します。結論的には、別のスプレッドシートでは、同じコードで、指定のフォルダにPDF出力できていることが確認できていますし、実際に使っています(スプレッドシートから請求書出力に使っています)。 >ところが、同じように書いても、今回のスプレッドシートではうまくいかないというわけです。 なるほど、実際に動いているのですね。ただ、動かないシートもある、ということですね。こちらでも少し調べまして、ようやくURLの意味がわかりました。Google Documents List APIだったんですね。 https://developers.google.com/google-apps/documents-list/#downloading_documents_and_files Google Documents List API version 3.0で定義されたもので、指定の型式でURLにアクセスすることでファイルを特定のフォーマットでダウンロードできるようですね。勉強不足で知りませんでした。 ただ、ドキュメントに記述されていますが、Version 3 of the Google Documents List API has been officially deprecatedとなっており、既にこの機能は2012年9月にdeprecated(非推奨)となっています。まだ使えるようですが、今後いつ使えなくなるかわかりませんので、すみやかに別の方法を検討されたほうがいいように思えます。 また、動かないというのは、既にこのAPIがメンテナンスから外されており、またGoogleドライブのファイルフォーマットも何度となく更新されていることから、対応できていないケースが生じているのかも知れません。(あくまで憶測ですが)
スクリプトを見ましたが、UrlFetchApp.fetchでPDF出力をフェッチする、ということ自体がちょっとわかりませんでした。そんなやり方を初めてみましたが、これでPDFデータの取得ができることはわかっているのでしょうか。 普通は、SpreadSheetを取得したら、getAs('application/pdf')でPDFとしてデータが取れるはずです。ですので、こんな感じでPDF保存できると思います。 DocsList.createFile([Spreadsheetオブジェクト].getAs('application/pdf')).rename(名前);
補足
早速ご回答ありがとうございました。貴重なお時間を割いてアドバイスをくださり、心より感謝申し上げます。 適用して試みてみたいと思います。1点だけ補足なのですが、アドバイスいただいた方法では、スプレッドシートの中で任意のシートだけをPDFにできるのでしょうか。お教えくださると助かります。 また、回答No.1のご質問について回答します。結論的には、別のスプレッドシートでは、同じコードで、指定のフォルダにPDF出力できていることが確認できていますし、実際に使っています(スプレッドシートから請求書出力に使っています)。 ところが、同じように書いても、今回のスプレッドシートではうまくいかないというわけです。 両者のどこに違いがあるのかを探せば答えが出るのかという気もしますが、相違点は今のところ分かりません。 また、どのサイトを見ても答えもヒントもなくて、ご質問した次第です。 お手を煩わせ恐縮ですが、ヒントだけでもいただけるとありがたいです。