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

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

詳細はこちら
Google Apps Script

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

PDF

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

Q&A

解決済

1回答

25746閲覧

スプレッドシートで範囲を選択したセルだけPDF化する方法

ran_net

総合スコア17

Google Apps Script

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

PDF

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

0グッド

0クリップ

投稿2018/12/14 06:55

前提・実現したいこと

スプレッドシート上で、セルの範囲を指定した部分だけをPDF化し保存したいです。

今の段階でできていること

  • シート全体をPDF化してGoogleドライブへ保存
  • データ値が入っているセルの範囲だけを選択した状態にする

今の状態は、テキストが入っているセルの範囲の選択はできているものの
PDF化を実行させても、選択されたセルの範囲ではなくシート全体がPDF化してしまいます。

該当のソースコード

gs

1 2function chosepdf(){ 3 4//セルの範囲指定をする 5var ss = SpreadsheetApp.getActiveSpreadsheet(); 6// そのスプレッドシートにある最初のシートを取得 7var sheet = ss.getSheets()[0]; 8//データ値を持つセルの範囲を指定(空白も含まれる) 9var range = SpreadsheetApp.getActiveSheet().getDataRange(); 10// そのシートにある A1:D10 のセル範囲を取得 11//var range = sheet.getRange("B4:J61"); 12// そのセル範囲をアクティブに設定 13range.activate(); 14 15} 16 17function myFunction(){ 18 19 // マイドライブ直下に保存 20 var root= DriveApp.getRootFolder(); 21 var folderid = root.getId(); 22 23 24 // 現在開いているスプレッドシートを取得 25 var ss = SpreadsheetApp.getActiveSpreadsheet(); 26 // 現在開いているスプレッドシートのIDを取得 27 var ssid = ss.getId(); 28 // 現在開いているスプレッドシートのシートIDを取得 29 var sheetid = ss.getActiveSheet().getSheetId(); 30 var range = SpreadsheetApp.getActiveSheet().getDataRange(); 31// そのセル範囲をアクティブに設定 32 range.activate(); 33 34 // PDF作成関数 35 createPDF( folderid, ssid, sheetid,customer_name + "_"+ timestamp ); 36} 37 38 39 var ss = SpreadsheetApp.getActiveSpreadsheet(); 40//ファイル名になるセルの位置 41 var customer_name = ss.getRange("A1").getValue(); 42 43// PDF作成関数 44//引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前) 45function createPDF(folderid, ssid, sheetid, filename){ 46 47 //PDFファイルの保存先となるフォルダをフォルダIDで指定 48 var folder = DriveApp.getFolderById(folderid); 49 50 51 // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成 52 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); 53 54 // PDF作成のオプションを指定 55 var opts = { 56 exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 57 format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 58 size: "A4", // 用紙サイズの指定 legal / letter / A4 59 portrait: "false", // true → 縦向き、false → 横向き 60 fitw: "true", // 幅を用紙に合わせるか 61 sheetnames: "false", // シート名をPDF上部に表示するか 62 printtitle: "false", // スプレッドシート名をPDF上部に表示するか 63 pagenumbers: "false", // ページ番号の有無 64 gridlines: "false", // グリッドラインの表示有無 65 fzr: "false", // 固定行の表示有無 66 gid: sheetid // シートIDを指定 sheetidは引数で取得 67 }; 68 69 var url_ext = []; 70 71 // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 72 for( optName in opts ){ 73 url_ext.push( optName + "=" + opts[optName] ); 74 } 75 76 // url_extの各要素を「&」で繋げる 77 var options = url_ext.join("&"); 78 79 80 // API使用のためのOAuth認証 81 var token = ScriptApp.getOAuthToken(); 82 83 // PDF作成 84 var response = UrlFetchApp.fetch(url + options, { 85 headers: { 86 'Authorization': 'Bearer ' + token 87 } 88 }); 89 90 // 91 var blob = response.getBlob().setName(filename + '.pdf'); 92 93 //} 94 95 // PDFを指定したフォルダに保存 96 folder.createFile(blob); 97 98} 99 100 // タイムスタンプを返す関数 101 function getTimestamp () { 102 var now = new Date(); 103 var year = now.getYear(); 104 var month = now.getMonth() + 1; 105 var day = now.getDate(); 106 var hour = now.getHours(); 107 var min = now.getMinutes(); 108 // var sec = now.getSeconds(); 109 // return year + month + day + "_" + hour + min; 110 111 } 112 113

プログラミング初心者で勉強中です。

セルの選択とPDF化がバラバラの動作になっている状態ですので
PDF化の際の、範囲の指定方法があれば教えていただきたいです。

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

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

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

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

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

papinianus

2018/12/14 08:11

このurlによるexportは、指定できるパラメータが明示的な文書になっていないのですが、多分できないように思います
ran_net

2018/12/14 08:27

上記にあるurlによるexportでは、PDFにできないということでしょうか? 該当のソースコードで実行すると、ドライブにPDFはちゃんと保存されているのですが・・ 理解力がなくてすみません。。。。
papinianus

2018/12/14 09:00

誤解を招いてもうしわけないです。記載のものは動作すると思います。シート単位では。ただ、領域選択みたいなパラメータを上手くやればできるかもしれないし、できないかもしれない、みたいなことについては、仕様をgoogleが開示していないので、今回のものはできないだろう、という意味です。
ran_net

2018/12/17 00:08

そうなのですね・・ Googleが使用を開示してないとなると、どうしようもないですね。 ご意見ありがとうございました。
guest

回答1

0

ベストアンサー

アイデアとして、選択範囲を新規に作成したシートにコピーし、その新規シートのみをPDF化してみてはどうでしょうか?

投稿2018/12/14 06:59

kikukiku

総合スコア529

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

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

papinianus

2018/12/14 08:10

多分これしかない
ran_net

2018/12/14 08:40

選択範囲を新規シートにコピー・・・! 私にはまたハードルが高そうですが調べてみます。 ありがとうございます!
papinianus

2018/12/14 09:31

コピーしたあとに一度SpreadsheetApp.flush()しないとコピー後のデータが取れないと思いますので注意してください
ran_net

2018/12/17 00:09

まだ、コピーする方法を見出せてませんが、SpreadsheetApp.flush()忘れないようにします。 ありがとうございます!
kikukiku

2018/12/17 00:38

新規にシートを作る方法、コピーする方法などわからないことがあったら、具体的に質問すると良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問