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

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

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

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

Q&A

1回答

3300閲覧

GAS 複数ページのPDF出力

hiroshiorz

総合スコア15

Google スプレッドシート

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

0グッド

0クリップ

投稿2023/06/22 14:36

実現したいこと

GASによって請求書の発行の自動化を行う。
表紙の範囲:A1:AK58
別紙1の範囲:AL1:BV58
別紙2の範囲:BW1:DG58

別紙の入力がない場合は表紙の範囲のみPDF化
別紙1に入力があれば、表紙と別紙1の2ページをPDF化
別紙2に入力があれば、表紙と別紙1,2の3ページをPDF化
したい。

該当のソースコード

function generateInvoicePDF() { 省略 // チェックボックスごとに処理を実行 for (let i = 0; i < checkBoxValues.length; i++) { const checkbox = checkBoxValues[i]; if (checkbox === true) { const invoiceSheetName = sheetNames[i]; const invoiceSheet = spreadsheet.getSheetByName(invoiceSheetName); const checkboxName = sheetNames[i]; const pdfBlobs = []; const fileNames = []; let fileName = `${formattedDate}_${invoiceNumber}_${checkboxName}_${client} 御中.pdf`; // 請求書のPDFを作成して保存 pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("A1:AK58"))); fileNames.push(fileName); // 条件1: BO45<>0, CZ45=0 if (templateSheet.getRange(`BO45`).getValue() !== "") { pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("AL1:BV58"))); fileNames.push(`${formattedDate}_${invoiceNumber}_${checkboxName}_別紙1_${client} 御中.pdf`); } // 条件2: BO45<>0, CZ45<>0 if (templateSheet.getRange(`CZ45`).getValue() !== "") { pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("BW1:DG58"))); fileNames.push(`${formattedDate}_${invoiceNumber}_${checkboxName}_別紙2_${client} 御中.pdf`); } // まとめてファイルを作成して保存 const createdFiles = []; let file; for (let i = 0; i < pdfBlobs.length; i++) { const createdFile = newFolder.createFile(pdfBlobs[i]).setName(fileNames[i]); createdFiles.push(createdFile); Utilities.sleep(5000); // 一つ作成するごとに5秒待機 if (i === 0) { file = createdFile; } } }
// 請求書のPDFを作成する関数 function createInvoicePDF(invoiceSheet, spreadsheetId, range) { const options = 'exportFormat=pdf&format=pdf' + '&gid=' + invoiceSheet.getSheetId() + '&portrait=true' + '&size=A4' + '&scale=4' + '&gridlines=false' + '&range=' + encodeURIComponent(range.getA1Notation()); const url = 'https://docs.google.com/spreadsheets/d/' + spreadsheetId + '/export?' + options; const blob = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }, contentType: 'application/pdf' }).getBlob(); return blob; }

試したこと

それぞれの範囲でのPDFを出力し、結合後のファイルを削除するということを考えたが実現できず。。。
ググってみても複数ページのPDF化が見当たらなかったのでそもそも出来ないのでしょうか?

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

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

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

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

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

guest

回答1

0

この回答はGPT-4による自動生成回答です

複数ページのPDFを作成することは可能ですが、Google Apps ScriptのUrlFetchApp.fetch()を使用して複数の範囲を1つのPDFに結合することはできません。代わりに、それぞれの範囲を個別のPDFとして生成し、それらを結合する方法を試すことができます。

以下のコードは、表紙、別紙1、別紙2をそれぞれPDF化し、Google Drive上でそれらを結合する方法を示しています。

javascript

1// 必要なライブラリを追加する 2// https://github.com/tanaikech/DocsServiceApp 3const DocsServiceApp = require('DocsServiceApp'); 4 5function generateInvoicePDF() { 6 // 省略 7 8 // チェックボックスごとに処理を実行 9 for (let i = 0; i < checkBoxValues.length; i++) { 10 const checkbox = checkBoxValues[i]; 11 if (checkbox === true) { 12 const invoiceSheetName = sheetNames[i]; 13 const invoiceSheet = spreadsheet.getSheetByName(invoiceSheetName); 14 15 const checkboxName = sheetNames[i]; 16 const pdfBlobs = []; 17 const fileNames = []; 18 let fileName = `${formattedDate}_${invoiceNumber}_${checkboxName}_${client} 御中.pdf`; 19 20 // 請求書のPDFを作成して保存 21 pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("A1:AK58"))); 22 fileNames.push(fileName); 23 24 // 条件1: BO45<>0, CZ45=0 25 if (templateSheet.getRange(`BO45`).getValue() !== "") { 26 pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("AL1:BV58"))); 27 fileNames.push(`${formattedDate}_${invoiceNumber}_${checkboxName}_別紙1_${client} 御中.pdf`); 28 } 29 30 // 条件2: BO45<>0, CZ45<>0 31 if (templateSheet.getRange(`CZ45`).getValue() !== "") { 32 pdfBlobs.push(createInvoicePDF(invoiceSheet, spreadsheetId, invoiceSheet.getRange("BW1:DG58"))); 33 fileNames.push(`${formattedDate}_${invoiceNumber}_${checkboxName}_別紙2_${client} 御中.pdf`); 34 } 35 36 // PDFを結合 37 const combinedPdf = DocsServiceApp.concatPdfBlobs(pdfBlobs); 38 const createdFile = newFolder.createFile(combinedPdf).setName(fileName); 39 Utilities.sleep(5000); // 一つ作成するごとに5秒待機 40 } 41 } 42}

このコードでは、tanaikech/DocsServiceAppという外部ライブラリを使用しています。このライブラリをプロジェクトに追加するには、スクリプトエディタで「リソース」>「ライブラリ」を選択し、1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSX7lX3M4C3I3i9aを「スクリプトID」に入力してください。そして、最新のバージョンを選択して「追加」をクリックします。

この方法で、表紙、別紙1、別紙2を含む1つのPDFファイルを作成できます。ただし、外部ライブラリを使用しているため、実行速度が若干遅くなることがあります。

投稿2023/06/22 14:37

teratail-ai

Powered by GPT-4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問