[GAS][Spreadsheet] スプレッドシートを PDF に変換する方法ふたつ

最近は 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 のみの対応ですね。要注意。