スプレッドシートから定期レポートをPDFで自動作成する方法

GASスプレッドシートPDF自動化
スプレッドシートから定期レポートをPDFで自動作成する方法のサムネイル

こんにちは、GASおじです。今回は中小企業の経営者さんやフリーランスの方に向けて、Googleスプレッドシートのデータを使って定期的にPDFレポートを自動作成する方法を解説しようと思います。
おじさんもSaaS課金には厳しいので、できるだけGoogleアカウントの利用枠内、追加の専用SaaS料金なしで効率化したいところ。Apps Scriptの実行上限はありますが、うまく使えば十分便利ですよ。


なぜスプレッドシートからPDF自動作成?

スプレッドシートで日々の売上や業務データを管理している方は多いはず。でも、報告用のレポートを毎回手動でPDF化してメール送信…これが結構な手間ですよね。
そこでGAS(Google Apps Script)を使って、指定日時に自動でPDF化し、メールやGoogleドライブに保存する仕組みを作れば、時間短縮・ヒューマンエラーの削減に繋がります。


初期設定と必要権限の確認

  1. Googleスプレッドシートを用意する
     レポートの元データが入ったスプレッドシートを用意してください。既存データは消さずに、新しいシートやファイルを作成して結果を書き込みます。

  2. スクリプトエディタを開く
     スプレッドシートのメニュー「拡張機能」→「Apps Script」でスクリプトエディタを開きます。

  3. 必要な権限について
     - Driveへのファイル作成・アクセス権
     - Gmail送信権限(メール送信する場合)
     - スプレッドシート編集権限(新しいシート追加など)

  4. installable triggerの設定
     GAS単体の時間トリガーは実行時間が短く、頻度も制限されます。
     スクリプトエディタの「トリガー」メニューから「時間主導型トリガー」を設定し、定期的にスクリプトが実行されるようにしましょう。

  5. 個人情報の取り扱い
     社内の個人情報や顧客情報を扱う際は、スクリプトのログや共有設定に注意しましょう。
     Driveの共有設定は必要最小限のメンバーに限定してください。


バックアップとロールバックを考慮した安全設計

既存データを直接消したり更新するのはリスクが高いです。
おじさん流の定石は以下の通り:

  • 元データはそのまま残す
  • PDF化するデータは新しい日時付きシートにコピーしてから処理
  • もしエラーが起きても元データは安全
  • バックアップをDrive内で自動的に保存
  • 何かあれば元のスプレッドシートから再度やり直せる

コード例:スプレッドシートの内容をPDF化し新ファイルで保存

以下は、元シートの指定範囲をコピーして新しい日時付きのシートに貼り付け、そのシートをPDF化してGoogleドライブに保存するサンプルコードです。

function createPdfReport() {
  try {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sourceSheet = ss.getSheetByName('レポート元データ'); // 元データシート名
    if (!sourceSheet) {
      throw new Error('元データシートが見つかりません。');
    }

    // 日時付き新シート名作成
    const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
    const newSheetName = 'レポート_' + timestamp;
    
    // 新シート作成(既存のシートをコピーしてデータを移す)
    const newSheet = ss.insertSheet(newSheetName);
    
    // 元シートのデータ範囲を取得(例:A1:D50)
    const range = sourceSheet.getRange('A1:D50');
    const values = range.getValues();

    // まとめて書き込み(batch write)
    newSheet.getRange(1, 1, values.length, values[0].length).setValues(values);

    // PDF化のためのファイル名
    const pdfName = newSheetName + '.pdf';

    // Driveのフォルダ(任意で指定。ルートに作成してもOK)
    const folderName = '定期レポートPDF';
    let folder = DriveApp.getFoldersByName(folderName);
    let targetFolder;
    if (folder.hasNext()) {
      targetFolder = folder.next();
    } else {
      targetFolder = DriveApp.createFolder(folderName);
    }

    // PDF化のためのURL作成
    const ssId = ss.getId();
    const sheetId = newSheet.getSheetId();
    const url_base = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?';
    const exportUrl =
      url_base +
      'format=pdf' + // PDF形式
      '&gid=' + sheetId +
      '&size=A4' + // 用紙サイズ
      '&portrait=true' + // 縦向き
      '&fitw=true' + // 幅に合わせる
      '&sheetnames=false&printtitle=false&pagenumbers=false' +
      '&gridlines=false' +
      '&fzr=false'; // 固定行列なし

    // OAuthトークン取得
    const token = ScriptApp.getOAuthToken();

    // PDFファイルを取得しDriveに保存
    const response = UrlFetchApp.fetch(exportUrl, {
      headers: {
        Authorization: 'Bearer ' + token,
      },
      muteHttpExceptions: true,
    });

    if (response.getResponseCode() !== 200) {
      throw new Error('PDF生成に失敗しました。HTTPコード: ' + response.getResponseCode());
    }

    const blob = response.getBlob().setName(pdfName);
    targetFolder.createFile(blob);

    // 完了ログ
    Logger.log('PDFレポートを作成しました: ' + pdfName);
  } catch (e) {
    Logger.log('エラーが発生しました: ' + e.message);
  }
}

コスト削減の考え方と注意点

  • この方法は追加のSaaS料金なし、Googleアカウントの利用枠内で動作します。
  • Apps Scriptの実行時間やAPI呼び出し回数に制限があるため、超大量データや頻繁な実行には注意。
  • 例えば、月4回のレポート作成で1回あたり手動作業に30分かかっていたとすると、
    「30分×4回=2時間/月の作業削減」と仮定できます。
  • 時給2000円換算なら、4000円/月の効率化。年間で約48,000円。
  • もちろん環境によって差はありますが、手動作業削減によるコスト軽減の一例です。

復元手順とメンテナンス

  • もしスクリプトに不具合や誤動作があった場合は、
    • まずログを確認しエラー箇所を特定
    • 新規作成した日時付きシートやPDFファイルは元の元データに影響しないため安全
    • 変更履歴やバックアップを使い、元データを復元可能
  • トリガー設定の変更やスクリプトのバージョン管理も必ず行いましょう。
  • 定期的にスクリプトの動作確認をするのがおすすめです。

まとめ

  • Googleスプレッドシートのデータを元に、日時付きの新しいシートを作成し、そこからPDFファイルを生成・Drive保存する方法を紹介しました。
  • 既存データを直接消さず、batch writeで安全に処理することでリスクを抑えています。
  • 追加のSaaSコストなし、Googleアカウント利用枠内でできるのは大きなメリット。
  • installable triggerで定期実行を設定すれば、完全自動化も可能です。

ぜひ自社の業務効率化に役立ててくださいね。


GASおじラボで500ツール使い放題 →