🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

2回答

2530閲覧

GASで出力したPDFファイルが”undefined.pdf”で展開されてしまう

1997tami

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2021/01/07 03:14

編集2021/01/07 05:30

前提・実現したいこと

下記のようなPDF出力システムを構築しています。

①クライアント情報をスプレッドシートに入力
②①の情報をキーに、別シート上に資料を作成
③②のシート上にある資料をPDF化
④指定のGoogleドライブに格納

発生している問題・エラーメッセージ

④のステップにて、PDFがundefined.pdfと出力されます。
PDF内の情報もエラーメッセージのみで資料は出力されていません。

ただ②までのステップは正しく実行されているので、
おそらく③④で使用しているPDF作成関数かGoogleの設定にミスがあるのだと思います。

エラーメッセージ 「ページが見つかりません。リクエストされたファイルは存在しません。URLが間違っておらず、ファイルが存在することをご確認ください。」

該当のソースコード

function myFunction(){ // PDFの保存先となるフォルダID 確認方法は後述 //var folderid = "1fX3XxLPH9kc193_KliYMdGZd4TwoUVkN"; var folderid = "1EiuWusfhsM9jihvCgLp81z6kXL6R7sp6"; // マイドライブ直下に保存したい場合は以下 // var root= DriveApp.getRootFolder(); // var folderid = root.getId(); // スプレッドシートを取得 var ss = SpreadsheetApp.openById('1UpS5S_1U7G3JonVZyVlKTb_G1KwTOuiz50BrhFFzA48'); // スプレッドシートの名前を取得 var spereadsheet = SpreadsheetApp.openById('1UpS5S_1U7G3JonVZyVlKTb_G1KwTOuiz50BrhFFzA48'); //SpreadsheetのID var sheetfrom = spereadsheet.getSheetByName('単独_from/sendリスト'); //シート名 var sheetpdf = spereadsheet.getSheetByName('旅館_☆☆以上_宿コン'); //シート名 // 最後の行取得 var lastRow = sheetfrom.getLastRow(); // PDF化したいスプレッドシートのID var ssid = "1UpS5S_1U7G3JonVZyVlKTb_G1KwTOuiz50BrhFFzA48";// スプレッドシートのID // シートID(gid)を取得 var sheetid = "947953356"; // ファイル名に使用するタイムスタンプを取得 var timestamp = getTimestamp(); // タイムスタンプを返す関数 function getTimestamp () { var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; var day = now.getDate(); var hour = now.getHours(); var min = now.getMinutes(); var sec = now.getSeconds(); return year + "_" + month + "_" + day; } for(i = 2; i <= lastRow; i++){ // ファイル名に使用する名前を取得 var customer_name = sheetfrom.getRange(i,2).getValue(); // 施設IDを取得 var hotelid = sheetfrom.getRange(i,1).getValue(); // 施設IDを転記入力する。 sheetpdf.getRange(3,10).setValue(hotelid); SpreadsheetApp.flush(); //値取得のため一時休止させる。 //Utilities.sleep(2000); var filename = customer_name + "さま" + "_" + timestamp // PDF名を転記する。 sheetfrom.getRange(i,3).setValue(filename + ".pdf"); //エラーは起きないように一時休止させる。 Utilities.sleep(15000); // PDF作成関数 createPDF(folderid, ssid, sheetid, filename ); } } // PDF作成関数 引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前) function createPDF(folderid, ssid, sheetid, filename){ // PDFファイルの保存先となるフォルダをフォルダIDで指定 var folder = DriveApp.getFolderById('1EiuWusfhsM9jihvCgLp81z6kXL6R7sp6'); // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); // PDF作成のオプションを指定 var opts = { exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx size: "A4", // 用紙サイズの指定 legal / letter / A4 portrait: "false", // true → 縦向き、false → 横向き fitw: "true", // 幅を用紙に合わせるか sheetnames: "false", // シート名をPDF上部に表示するか printtitle: "false", // スプレッドシート名をPDF上部に表示するか pagenumbers: "false", // ページ番号の有無 gridlines: "false", // グリッドラインの表示有無 fzr: "false", // 固定行の表示有無 gid: sheetid // シートIDを指定 sheetidは引数で取得 }; var url_ext = []; // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 for( optName in opts ){ url_ext.push( optName + "=" + opts[optName] ); } // url_extの各要素を「&」で繋げる var options = url_ext.join("&"); // optionsは以下のように作成しても同じです。 // var ptions = 'exportFormat=pdf&format=pdf' // + '&size=A4' // + '&portrait=true' // + '&sheetnames=false&printtitle=false' // + '&pagenumbers=false&gridlines=false' // + '&fzr=false' // + '&gid=' + sheetid; // API使用のためのOAuth認証 var token = ScriptApp.getOAuthToken(); // PDF作成 //var blob = UrlFetchApp.fetch(url + options, { headers: { 'Authorization': 'Bearer ' + token }, muteHttpExceptions: true }).getBlob().setName(filename); var response = UrlFetchApp.fetch(url + options, { headers: { 'Authorization': 'Bearer ' + token }, muteHttpExceptions: true }) var blob = response.getBlob().setName(filename + '.pdf'); // PDFを指定したフォルダに保存 folder.createFile(blob); }

試したこと

・「URLが間違っている」とのことなので「var url」の変数内容(URLなど)が間違ってはいないか確認
・参照シートに問題があるのかと思い、他シート参照するも同じ結果に

存在しているシートのPDFが「undefied」になってしまう理由ご存知の方いらっしゃいましたら
ご教示願います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

試してないのですが、
function createPDF(...){}
に渡される引数に問題があるように見えます。

ssidが存在しないidの場合は、ファイルが存在しないと思いますし、
かつ、
filenameに初期化されていない変数を指定した場合、

が重なったとき、

ページが見つかりません。

という内容のPDFが作成されて、
undefied.pdfという名前になる。

そうなんじゃなかろうかと予想を立ててみました。

以下を試してみるのはどうでしょうか?

code

1function test(){ 2 createPDF("存在するフォルダのID", "存在するファイルのID", "存在するシートのID", "希望するファイル名"); 3}

それでは失礼いたします。

投稿2021/01/07 04:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1997tami

2021/01/07 04:45 編集

ご回答ありがとうございます! ご指摘いただきましたテストコードを試したところ、やはりundefinedでしたので 引数に問題があるようです。 (とはいえ、その引数の問題が解明できていないのですが・・・) 一旦テストコードでundefinedにならないよう、ミスがないか確認してみます。
退会済みユーザー

退会済みユーザー

2021/01/07 10:44

1997tami様、こんにちは。 私の方で、 上記再アップされたコードをそのままコピーしつつ、 フォルダのidなど必要だと思われる個所を変更したのち、 実行してみました。 filenameはundefinedにはならず、 pdfの作成も行っており、 意図した動作自体は問題なく行っているように見えました。 不思議ですね。 考えられる事としては、 他に記載していないコードがあって、 そのコードが人知れず変数をいじっちゃうとかを思いついてみました。 不思議な現象なので、他の視点から何かしら調べてみたいと思います。 あと、一つ、訪ねたいことがありました。 Utilities.sleep(15000); とありますが、この間に何か他の事を行ってたりはしないでしょうか? もし思い当たる事があるのであれば教えていただければと思います。 それでは失礼いたします。
guest

0

サイズ指定が全角文字になっています。

diff

1- size: "A4", // 用紙サイズの指定 legal / letter / A4 2+ size: "A4", // 用紙サイズの指定 legal / letter / A4

投稿2021/01/07 04:10

shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1997tami

2021/01/07 04:25

ご回答ありがとうございます! 下記のように半角修正し、再度実行致しましたが変わらずundefinedのままでした。 "size: "A4", // 用紙サイズの指定 legal / letter / A4" 全角文字も要修正でしたが 他にメインの原因があるようです…
shozi3

2021/01/07 04:47

akirayonahaさんの回答にあるようにパラメーターをチェックしてみてください。 createPDF()の先頭に console.log(folderid, ssid, sheetid, filename) を追加して、メニューの「実行数」でログを確認してください。
shozi3

2021/01/07 05:06

あと、folderidが使われていませんね。 DriveApp.getFolderById(folderid) として、呼び出し側でID指定するようにしてください。
1997tami

2021/01/07 05:09

ご丁寧に本当にありがとうございます・・! 上記の通り、表示>実行数からcreatePDFの実行数を確認いたしました。 すると、全てundefined と表示されてしまっていたので引数全てにエラーがあるということかと思います… ▼実行数での表記 Cloud のログ 2021/01/07 14:03:50 デバッグ undefined undefined undefined undefined フォルダID、シートIDなどはもちろん存在するものを記入しているつもりですが 何かしらのエラーで認識されていないんですね。 ツールの①②ステップの関数では正しく認識、作動しているのですが…
1997tami

2021/01/07 05:13

>あと、folderidが使われていませんね。 DriveApp.getFolderById(folderid) として、呼び出し側でID指定するようにしてください。 ソースコードの上から4行目に、folderidを指定する下記のコード記載しておりますが こちらとは別でしょうか・・。 var folder = DriveApp.getFolderById('1EiuWusfhsM9jihvCgLp81z6kXL6R7sp6');
shozi3

2021/01/07 05:16

どのようにcreatePDF()を実行していますか? 呼び出し側のソースコードを質問に追記してください。
1997tami

2021/01/07 05:32

ありがとうございます。 質問のソースコード記載欄に、コード全文を記載いたしました。 (ご指定の該当コードが理解が曖昧でしたので、全文記載しています。)
shozi3

2021/01/07 06:25

それを実行したのなら undefined にはならないはずです。
1997tami

2021/01/07 06:43

そうですよね・・・ コード自体に問題がないとしたら、他に原因があるのかもしれません。 なんどもご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問