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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google Apps Script

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

PDF

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

Google

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

Q&A

解決済

1回答

1640閲覧

スプレッドシートのPDF出力について

otaoma

総合スコア6

Google スプレッドシート

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

Google Apps Script

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

PDF

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

Google

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

0グッド

0クリップ

投稿2021/05/28 00:26

前提・実現したいこと

従業員別に用意されているシートの指定範囲を、毎月指定したフォルダにPDFで出力したい。

ここに質問の内容を詳しく書いてください。
知見が浅い素人にご教授下さい。。。
下記のようなシートが従業員別に用意しており、毎月PDFで指定フォルダに全員分出力したい。
ですが、出力の範囲は毎月変わるため、範囲を特定することはできず、又、毎月範囲を書き換えてもいられない。。。
そこで、「PDF」というシート(画像2枚目)で出力したい月(A1)を指定して実行すれば実現できないかと考えたのですが、頭がパニックになってきました。。。
イメージ説明
イメージ説明

参考にさせていただいたサイトは以下です。
https://moripro.net/gas-export-pdf-range/

質問の仕方がわかりにくくて申し訳ありません。
ご教授の程、宜しくお願いいたします。

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

エラーメッセージ ### 該当のソースコード function exportSheetToPDF(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); // PDF出力するシートを指定 const sheetId = ss.getSheetByName('PDF').getRange('A2').getValue(); const sheetName = ss.getSheetByName(sheetId).getSheetName(); //指定月を抽出し、行数をカウント  const sheetmonth =ss.getSheetByName('PDF').getRange('A1').getValue(); const ssId = ss.getId(); const sheetID = ss.getSheetByName(sheetId).getSheetId(); // スプレッドシートをPDF出力するためのURL const url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?' // PDF出力のオプションを設定 const options = 'exportFormat=pdf&format=pdf' + '&gid=' + sheetID //PDFにするシートの「シートID」 + '&portrait=false' //true(縦) or false(横) + '&size=A4' //印刷サイズ + '&fitw=true' //true(幅を用紙に合わせる) or false(原寸大) + "&top_margin=0.50" //上の余白 + "&right_margin=0.50" //右の余白 + "&bottom_margin=0.50" //下の余白 + "&left_margin=0.50" //左の余白 + "&vertical_alignment=CENTER" //垂直方向の位置 + '&gridlines=false' //グリッドラインの表示有無 + '&range=A5%3ABA36' //★POINT★セル範囲を指定 + "&fzr=true" //固定行の表示有無 + "&fzc=true" //固定列の表示有無; // %3A はコロン(:)を表す const requestUrl = url + options; //API使用のためのOAuth認証 const token = ScriptApp.getOAuthToken(); const params = { 'headers' : {'Authorization':'Bearer ' + token}, 'muteHttpExceptions' : true }; const response = UrlFetchApp.fetch(requestUrl, params); //Blobオブジェクトを作成 const blob = response.getBlob(); blob.setName(sheetName + '.pdf'); //PDFファイル名を設定 //指定のフォルダにPDFファイルを作成 const folder = DriveApp.getFolderById('id'); folder.createFile(blob); } ```言語名 Google APP Script ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

Tatsunosuke

2021/05/28 01:34

> そこで、「PDF」というシート(画像2枚目)で出力したい月(A1)を指定して実行すれば実現できないかと考えたのですが、頭がパニックになってきました。。。 最終的に今どうなっていますか?? お悩みとしては、特定のシートの行列がわかればokでしょうか?
otaoma

2021/05/28 03:04

ご回答ありがとうございます。 現状は書き換えた結果エラーになり、解決していない状況です。 エラーコードを載せることを忘れておりました。 申し訳ありません。 エラーは下記のとおりです。 TypeError: Cannot read property 'getSheetName' of null exportSheetToPDF @ コード.gs:8
Tatsunosuke

2021/05/28 03:12

ありがとうございます。 コードがこんがらがってますので、また後ほど修正してみますね! 取得範囲なんですが、自動で判別できると思いますが、どういうルールでスプレッドシートに記入しているのかがわかりません。 今のスクリーンショットだと5月分と6月以降の時間外が記載されていますが、6月分はどのようなシートの構成になりますか?
otaoma

2021/05/28 04:40

5月以降は、6月~4月までを全く同じ構成で作成しています。 今はグループ化して折りたたんでいるだけになります。
otaoma

2021/05/28 04:41

説明下手で申し訳ないです。。。。
otaoma

2021/05/28 04:46

1つのシートに5~4月まで画像と同様の構成になっており、同様のシートが従業員ごとにある状態です。 一つ一つをシート切り替えて出力してたら大変な時間を要するので、5月なら5月と指定したら全員分出力できないかなと思いまして。
guest

回答1

0

ベストアンサー

追記

日付型に対応するのを忘れておりました。
失礼いたしました。

gas

1function myFunction(){ 2 // PDF出力するシートを指定 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getSheetByName('***') //[todo] シート名を入れる。 5 6  //シート内の値を全てを取得 7 var values = sheet.getDataRange().getValues() 8 9 var startMonth = 5 //[todo] 抽出したい月を数字で入力する。 10 var nextMonth = startMonth == 12 ? 1: startMonth+1 //翌月 11 startMonth +="月度" 12 nextMonth += "月度" 13 14 var [startRow,endRow,column] = [0,0,0] //該当範囲の開始行と終了行と最終列用の変数 15  //取得したシートの値を確認する。 16 for(var i in values){ 17 if(String(values[i][0]).match(new RegExp(startMonth))){ //開始する月が入っているセルを確認 今回だと"A5 18 startRow = Number(i)+1 //i は0スタートなので+1 19 }else if(String(values[i][0]).match(new RegExp(nextMonth))){ //次月が入っているセルを確認 今回だと"A37" 20 endRow = i //こちらは該当する行のひとつ前の行の番号が欲しいのでプラスしない。 21 } 22 23 //開始行と終了行が取得できたら。 24 if(startRow != 0 && endRow!=0){ 25 //終了列を取得 26 column = values[i].length 27 //for文終了 28 break; 29 } 30 } 31 32 console.log("開始行 : "+startRow) 33 console.log("終了行 : "+endRow) 34 console.log("最終列 : "+column) 35}

これで必要な範囲が取得できます。
これを元にPDFを出力してみてはいかがでしょうか?

//[todo]のところだけいじって貰えば大丈夫です!

gas

1function myFunction(){ 2 // PDF出力するシートを指定 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getSheetByName('***') //[todo] シート名を入れる。 5 6  //シート内の値を全てを取得 7 var values = sheet.getDataRange().getValues() 8 9 var startMonth = 5 //[todo] 抽出したい月を数字で入力する。 10 var nextMonth = startMonth == 12 ? 1: startMonth+1 //翌月 11 startMonth +="月度" 12 nextMonth += "月度" 13 14 var [startRow,endRow,column] = [0,0,0] //該当範囲の開始行と終了行と最終列用の変数 15 16  //取得したシートの値を確認する。 17 for(var i in values){ 18 if(values[i][0].match(new RegExp(startMonth))){ //開始する月が入っているセルを確認 今回だと"A5" 19 startRow = Number(i)+1 //i は0スタートなので+1 20 }else if(values[i][0].match(new RegExp(nextMonth))){ //次月が入っているセルを確認 今回だと"A37" 21 endRow = i //こちらは該当する行のひとつ前の行の番号が欲しいのでプラスしない。 22 } 23 24 //開始行と終了行が取得できたら。 25 if(startRow != 0 && endRow!=0){ 26 //終了列を取得 27 column = values[i].length 28 //for文終了 29 break; 30 } 31 } 32 33 console.log("開始行 : "+startRow) 34 console.log("終了行 : "+endRow) 35 console.log("最終列 : "+column) 36}

投稿2021/05/28 06:58

編集2021/05/28 09:19
Tatsunosuke

総合スコア599

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

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

otaoma

2021/05/28 08:30

ご親切に回答していただき、ありがとうございますm(__)m 記載していただいたコードをのtodoを【テスト】として使わせていただきました。 function myFunction(){ // PDF出力するシートを指定 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('田中 太郎') //[todo] シート名を入れる。 下記のようなエラーが発生したのですが何が間違いなのかわかりません。 教えていただけると幸いです。 宜しくお願いいたします。 TypeError: values[i][0].match is not a function myFunction @ コード.gs:18
Tatsunosuke

2021/05/28 09:11

すみません、微妙に間違えてます。少々お待ちください。
Tatsunosuke

2021/05/28 09:16

判明しました。回答に追記いたしますね
otaoma

2021/06/05 02:16

ご返事が遅くなり大変申し訳ございません。 教えていただいたコードで取得でき、それを基に書いてみたところ解決いたしました!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問