質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

1580閲覧

GoogleスプレッドシートでPDFの書き出し

Cabe

総合スコア24

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2017/11/02 12:40

###前提・実現したいこと
Googleスプレッドシートでシート毎にPDFに書き出したいです。
現在、開いているページのPDFへの書き出しはできています。
下記サイトを参考にしました。

###該当のソースコード
https://www.virment.com/create-pdf-google-apps-script/
こちらのサイトを参考にしました。
この感じでシート毎にファイルが別れて書き出しができたら嬉しいです。
可能なものでしょうか??

###試したこと
プログラムがあまり詳しくないため試してはいません。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

この感じでシート毎にファイルが別れて書き出しができたら嬉しいです。
可能なものでしょうか??

可能です。コードとしては以下のようなかんじになるでしょう。シート毎にご提示のサイトの記事で紹介されていたcreatePDF メソッドを呼び出し、PDFファイルをマイドライブ直下に保存します。

JavaScript

1function testPDF() { 2 try { 3 // マイドライブ直下に保存 4 var root = DriveApp.getRootFolder(); 5 var folderId = root.getId(); 6 7 // 現在開いているスプレッドシートを取得 8 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 9 var ssId = spreadsheet.getId(); 10 var sheets = spreadsheet.getSheets(); 11 12 // シート分PDFに出力 13 for (var i = 0; i < sheets.length; i++) { 14 var sheetId = sheets[i].getSheetId(); 15 var name = sheets[i].getName(); 16 // 拡張子抜きのファイル名を生成 "S[シート番号]_[シート名]" 17 var baseName = "S" + String(i + 1) + "_" + name; 18 // PDFファイルを出力 19 createPDF(folderId, ssId, sheetId, baseName); 20 } 21 } catch (e) { 22 Logger.log("Exception: " + e); 23 } 24}

簡単に書いたコードなので、実際にはファイル名が重複しないようにしたり、フォルダーを指定したりするようになるかと思います。「全シートをシート毎に処理できる」と言うことを示した限りのものです。

プログラムがあまり詳しくないため試してはいません。。。

実際に書いて試してみましょう。ご自分で書いたコードを提示しないとどこが分からないか回答者も分かりませんし、「要望まる投げ」と受け取られて、回答もつきづらくなります。


「どこを修正すべきか?」とのコメントをいただいたので参考に追記します

ご提示のmyFunctionを修正するのであればこのようなコードになるかと思います。PDFファイルはマイドライブ直下に作ります。動作内容をご確認の上、適当に修正してください。

JavaScript

1function myFunction() { 2 try { 3 // マイドライブ直下に保存 4 var root = DriveApp.getRootFolder(); 5 var folderid = root.getId(); 6 7 var ss = SpreadsheetApp.getActiveSpreadsheet(); 8 9 // 現在開いているスプレッドシートのIDを取得 10 var ssId = ss.getId(); 11 12 // ファイル名に使用する名前を取得(スプレッドシートのA1) 13 var customer_name = ss.getRange("A1").getValue(); 14 15 // ファイル名に使用するタイムスタンプを取得 16 var timestamp = getTimestamp(); 17 18 var sheets = ss.getSheets(); 19 20 // シート分PDFに出力 21 for (var i = 0; i < sheets.length; i++) { 22 // シートIDを取得 23 var sheetId = sheets[i].getSheetId(); 24 // シート名を取得 25 var sheetName = sheets[i].getName(); 26 // 拡張子抜きのファイル名を生成 "[A1セルの内容]_[シート名]_[タイムスタンプ]" 27 // var baseName = "S" + String(i + 1) + "_" + name; 28 var baseName = customer_name + "_" + sheetName + "_" + timestamp; 29 // PDFファイルを出力 30 createPDF(folderid, ssId, sheetId, baseName); 31 } 32 } catch (e) { 33 Logger.log("Exception: " + e); 34 } 35}

投稿2017/11/03 04:30

編集2017/11/03 10:30
dodox86

総合スコア9183

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

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

Cabe

2017/11/03 05:21

ご回答ありがとうございます。 そして、初めてこちらを利用させていただいたため、情報が足りず、すみません。。。 現在こちらのコードで動いています。 function myFunction(){ // PDFの保存先となるフォルダID 確認方法は後述 var folderid = "フォルダURL"; // マイドライブ直下に保存したい場合は以下 // var root= DriveApp.getRootFolder(); // var folderid = root.getId(); ///////////////////////////////////////////// // 現在開いているスプレッドシートをPDF化したい場合// //////////////////////////////////////////// // 現在開いているスプレッドシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在開いているスプレッドシートのIDを取得 var ssid = ss.getId(); // 現在開いているスプレッドシートのシートIDを取得 var sheetid = ss.getActiveSheet().getSheetId(); // getActiveSheetの後の()を忘れると、TypeError: オブジェクト function getActiveSheet() {/* */} で関数 getSheetId が見つかりません。 // ファイル名に使用する名前を取得 var customer_name = ss.getRange("A1").getValue(); // ここで例として使用しているスプレッドシートのA1に顧客の名前が入っているため、それをファイル名用に取得しているだけです。 // ファイル名に使用するタイムスタンプを取得 var timestamp = getTimestamp(); // PDF作成関数 createPDF( folderid, ssid, sheetid, customer_name + "_" + timestamp ); } // PDF作成関数 引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前) function createPDF(folderid, ssid, sheetid, filename){ // PDFファイルの保存先となるフォルダをフォルダIDで指定 var folder = DriveApp.getFolderById(folderid); // スプレッドシートを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: "true", // 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 response = UrlFetchApp.fetch(url + options, { headers: { 'Authorization': 'Bearer ' + token } }); // var blob = response.getBlob().setName(filename + '.pdf'); //} // PDFを指定したフォルダに保存 folder.createFile(blob); } // タイムスタンプを返す関数 function getTimestamp () { var now = new Date(); var year = now.getYear(); var month = now.getMonth() + 1; var day = now.getDate(); var hour = now.getHours(); var min = now.getMinutes(); // var sec = now.getSeconds(); return year + "_" + month; } // スプレッドシートのメニューからPDF作成用の関数を実行出来るように、「スクリプト」というメニューを追加。 function onOpen() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [ { name : "Create PDF", functionName : "myFunction" } ]; sheet.addMenu("スクリプト", entries); }; こちらとは別に新規のスクリプトファイルを作って実装したらよろしいでしょうか??
dodox86

2017/11/03 05:41

> こちらとは別に新規のスクリプトファイルを作って実装したらよろしいでしょうか?? どのように使うか。今のものを修正してもいいでしょうし、新規に作って今のスクリプトをコピーして修正してもいいでしょうし、どちらでもよいと思います。
Cabe

2017/11/03 09:54

このコードを修正する場合はどこを修正するべきかご教授いただけないでしょうか?? 申し訳ありません。。
dodox86

2017/11/03 09:57

質問の内容を越えてませんか。。。?
dodox86

2017/11/03 10:31

追記したのでご確認ください。実際に動作させ、コードの内容を理解された上で質問者様のご要望に沿うように修正してみてください。よろしくお願いします。
Cabe

2017/11/03 10:34

ありがとうございますっ!! ご丁寧にしていただき助かりますっ!!! 試させていただきます!!!
Cabe

2017/11/03 14:30 編集

書き出し成功しましたっ!!!ありがとうございます。 ただ、PDFファイルが6つまでしか生成されないのは何か原因がありますでしょうか? その他は問題なく動きました。
dodox86

2017/11/03 15:39 編集

私が修正したコードの部分ではそのような制限は入れていません。確認しましたが、6つまでと言うより、一定時間の間にたくさんのPDF作成のリクエストを受け付けないよう、GASのサーバー側で拒絶している様子です。(そうでないと大量のPDF作成ができて、負荷がかかってしまう)と言う訳ですので個数は少なく出力するようにしてください。
Cabe

2017/11/03 16:08

そういうことなのですね!!!ありがとうございます!!!個数を少なくして出力するようにします!!! 無知な私とのやりとりで大変詳しく教えてくださりありがとうございます。 勉強指定行きます。ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問