GASでスプレッドシートから請求書PDFを自動作成し各ドライブへ保存するツール

数百件単位で発生する請求書作成をGASで自動化し、作業効率化とヒューマンエラーの削減を実現した事例です。

このブログは、Google Apps Script(GAS)を使った自作ツールの記録や、開発の過程での気づきをまとめたものです。
丁寧な解説というより、「こんなこともGASでできるんだ」というアイディアのきっかけになれば幸いです。

やりたかったこと

数百件単位で発生する請求書作成を効率化したと考えました。
従来はPDF出力後のファイル名修正や保存先の振り分けを手作業で行っており、手間もミスも多かったです。
そのため、スプレッドシートのデータをもとに、一括で請求書PDFを作り、顧客ごとのドライブフォルダに自動保存する仕組みを作りたいと思いました。

使ったロジック・ポイント

今回の請求書自動作成ツールでは、GASの複数の機能を組み合わせて以下の流れを実現しています。
処理のポイントを、目的ごとに分けて紹介します。

① PDF化処理の自動化

  • UrlFetchApp を使って、スプレッドシートを PDF としてエクスポート
  • 出力時のサイズ・余白・向きなどを URLパラメータ で細かく調整し、レイアウト崩れを防止
  • PDFファイルの作成処理は関数 CreatePdf() として分離し、他の用途にも再利用可能に設計

② フォルダへの自動保存

  • 顧客ごとに Drive フォルダの ID をスプレッドシートで管理し、保存先を動的に変更
  • PDF ファイル名も動的に設定し、あとから見返しやすく整理された状態で保存

③ 実行管理とエラー対策

  • 完了フラグをスプレッドシートに記録することで、処理済みの行を管理
  • 処理間に Utilities.sleep() を入れて、API の呼び出し制限エラーを回避
  • GAS の 6分制限に対応するため、処理時間を意識して一括実行ではなく、行ごとにループ処理を実装

コード例

以下は、スプレッドシートのデータから請求書PDFを作成し、指定のDriveフォルダに保存するメイン処理とCreatePdf関数の例です。

メイン処理

function exportInvoiceAsPDF() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("請求データ");
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    const row = sheet.getRange(i, 1, 1, 5).getValues()[0];
    const id = row[0];
    const folderId = row[4]; // 保存先フォルダID

    const templateSheet = ss.getSheetByName("請求書テンプレート");
    templateSheet.getRange("B2").setValue(row[1]); // 顧客名など転記

    const fileUrl = CreatePdf(
      DriveApp.getFolderById(folderId),
      ss.getId(),
      templateSheet.getSheetId(),
      `${id}_請求書`
    );

    sheet.getRange(i, 6).setValue("完了");
    sheet.getRange(i, 7).setValue(fileUrl);
    Utilities.sleep(500); // API制限対策
  }
}

CreatePdf 関数

function CreatePdf(folder, ssId, shId, fileName){
  var baseUrl = "https://docs.google.com/spreadsheets/d/"
    + ssId
    + "/export?gid="
    + shId;
  var options = "&exportFormat=pdf&format=pdf"
    + "&size=A4"
    + "&portrait=true"
    + "&scale=4"
    + "&fitw=true"
    + "&top_margin=0"
    + "&right_margin=0"
    + "&bottom_margin=0"
    + "&left_margin=0"
    + "&horizontal_alignment=CENTER"
    + "&vertical_alignment=TOP"
    + "&printtitle=false"
    + "&sheetnames=false"
    + "&gridlines=false"
    + "&fzr=false"
    + "&fzc=false";
  var url = baseUrl + options;
  var token = ScriptApp.getOAuthToken();
  var fetchOptions = {
    headers: { 'Authorization': 'Bearer ' +  token }
  };
  var blob = UrlFetchApp.fetch(url, fetchOptions).getBlob().setName(fileName + '.pdf');
  var pdf = folder.createFile(blob);
  return pdf.getUrl();
}

CreatePdf 関数の解説

CreatePdf 関数は独自に作成した関数です。
Googleスプレッドシートの特定のシートをPDF化し、Googleドライブ内の指定フォルダに保存する処理を行う関数です。

  • folder … 保存先のDrive Folderオブジェクト
  • ssId … PDF化するスプレッドシートのID
  • shId … PDF化するシートのID
  • fileName … PDFファイル名

ポイントは、PDF出力の細かい設定(余白・用紙向き・グリッド線表示の有無など)をURLパラメータで制御できる点です。
今回の請求書作成以外でもPDFを作成する機会が多いと考え、関数を独立させました。
実際に多くの場面でこの関数を使うので、とても重宝しています。

メモ・反省・次回やりたいこと

GASの実行時間制限(6分)があるため、件数が多いときは処理を分割して実行時間を管理しています。
また、API制限エラーを避けるために、Utilities.sleep() を挟んでいます。
PDF化後にファイル名を自動生成して保存することで、手作業でのファイル名修正が不要になりました。
将来的にはHTMLテンプレートを使ってレイアウトをもっと自由にしたり、複数ページ対応も検討したいです。

トップページへ戻る