最近は PDF 化案件を多くもらいます。インボイスに伴う電子化対応でしょうか。PDF を生成するにあたっては PHP や ASP.NET などからはライブラリに頼ることになりますが、GAS からは標準の機能で簡単に行うことができます。今回は Google Spreadsheet から PDF を生成する、二つの方法を案内します。
ひとつ目は、Spreadsheet オブジェクトの getAs を使います。getAs は指定形式に変換することができる機能で、Blob 型で返ってきます。そのまま DriveApp を使って Google Drive に格納する方法が便利です。デメリットとして、スプレッドシート全体が変換対象となってしまうので、必要なシートを絞る場合は以下のような対応が必要です。また、細かい印刷設定はできません。
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 印刷対象のシート一覧
const arr = ['Sheet1', 'Sheet2'];
// 非表示シートの取得
const hids = spreadsheet.getSheets().filter(function (_sheet) {
return arr.indexOf(_sheet.getName()) === -1
});
try {
// シート非表示
hids.forEach(function (_sheet) { _sheet.hideSheet() });
// PDF 変換したものを BLOB データで抽出
const blob = spreadsheet.getAs('application/pdf');
DriveApp.createFile(blob).setName('sheet.pdf');
} finally {
// 変換後に再表示
hids.forEach(function (_sheet) { _sheet.showSheet() });
}
ふたつ目は、シートの URL を操作します。各シートごとの URL を以下のように変更し、PDF として表示させることができます。このとき、細かい設定をすることができます。
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const url = spreadsheet.getUrl();
// 印刷対象のシート一覧
const arr = ['Sheet1', 'Sheet2'];
// 印刷対象のシート抽出
const urls = spreadsheet.getSheets().filter(function (_sheet) {
return arr.indexOf(_sheet.getName()) > -1
}).map(function (_sheet) {
return url.replace(/\/?(edit)?$/, '/export?' + Object.entries({
gid: _sheet.getSheetId(),
format: 'pdf',
portrait: false, //縦
size: 'A4', //用紙サイズ
gridlines: false, //ガイドライン表示
fitw: true //幅に合わせる
}).map(function (_entry) {
return encodeURIComponent(_entry[0]) + '=' + encodeURIComponent(_entry[1]);
}).join('&'));
});
console.log(urls);
urls にシートの一覧が入ります。この URL をリクエストすると、シートの内容をオンデマンドに変換してダウンロードします。
※スマホでSpreadsheet アプリが入っている場合、直接アプリが起動してしまうようです。URL の方法は PC のみの対応ですね。要注意。