tsunagio

スプレッドシートから請求書PDFを作る手順(テンプレート差し込み方式)

公開日:2026年9月

請求書の宛先や金額が変わるたびに、Google ドキュメントを開いて数字を打ち直すのは手間です。ここでは、あらかじめ用意したテンプレートに値を差し込んでPDF化する方法を、Google Apps Script のコードつきで説明します。Apps Script の編集画面を開いたことがあれば、コピーして自分のスプレッドシートで動かせます。

請求書を管理するスプレッドシートの画面例(本記事のコードとは別の実装です)
参考:請求書を1行ずつ管理するスプレッドシートの例

仕組み:テンプレートに差し込んでPDFにする

仕組みは単純です。金額や宛先の代わりに {{宛先}} のような印(プレースホルダー)を書いた Google ドキュメントを1つ用意し、実行のたびにそのドキュメントをコピーして、印を実際の値に置き換えてからPDFとして保存します。テンプレート自体は編集せず、コピーのほうだけを書き換えるので、次の請求でも同じひな形を使い回せます。

手順

  1. Google ドキュメントを新規作成し、本文に {{宛先}}・{{件名}}・{{合計金額}} などの印を書く。
  2. 請求書を管理するスプレッドシートを開き、メニュー「拡張機能」→「Apps Script」でエディタを開く。
  3. 左側の「サービス」の+ボタンから「Drive API」(v3)を追加する。追加しないと Drive.Files.* の呼び出しがエラーになる。
  4. 歯車の「プロジェクトの設定」で「"appsscript.json" マニフェスト ファイルをエディタで表示する」を ON にし、appsscript.json の oauthScopes を次の2つだけにする。書かないと、Apps Script が広い Drive の権限を勝手に要求することがある。
    "oauthScopes": [
      "https://www.googleapis.com/auth/drive.file",
      "https://www.googleapis.com/auth/documents"
    ]
  5. 下のコードを貼り付け、createTemplate() を一度だけ実行する。権限の承認画面が出るので、表示される権限が上の2つ(「このアプリで作成したファイル」と「ドキュメント」)だけであることを見てから許可する。
  6. 請求のたびに createInvoicePdf(宛先, 件名, 合計金額) を実行する。マイドライブ直下にPDFが保存される。

最小のコード例

テンプレートを作る関数と、コピーして差し込む関数の2つです。

function createTemplate() {
  var file = Drive.Files.create({ name: '請求書テンプレート',
    mimeType: 'application/vnd.google-apps.document' });
  var doc = DocumentApp.openById(file.id);
  var body = doc.getBody();
  body.appendParagraph('請求書');
  body.appendParagraph('{{宛先}} 御中');
  body.appendParagraph('件名:{{件名}}');
  body.appendParagraph('合計金額:{{合計金額}}');
  doc.saveAndClose();
  PropertiesService.getScriptProperties()
    .setProperty('templateId', file.id);
}

function createInvoicePdf(addressee, subject, total) {
  var templateId = PropertiesService.getScriptProperties()
    .getProperty('templateId');
  var copy = Drive.Files.copy({ name: 'tmp_invoice' }, templateId);
  var doc = DocumentApp.openById(copy.id);
  var body = doc.getBody();
  body.replaceText('{{宛先}}', addressee);
  body.replaceText('{{件名}}', subject);
  body.replaceText('{{合計金額}}', total + '円');
  doc.saveAndClose();
  var pdf = DocumentApp.openById(copy.id).getAs('application/pdf');
  Drive.Files.create({ name: addressee + '_請求書.pdf', mimeType: 'application/pdf' }, pdf);
  Drive.Files.remove(copy.id);
}

権限について

このコードは、手順4のとおりマニフェストで絞れば drive.file と documents の2つの権限で動きます。documents は Google ドキュメントの中身を開いて書き換えるための権限で、Drive 上のどのドキュメントにも使えます。drive.file は「このスクリプトが作ったファイルだけ」に絞られた権限です。createTemplate() が Drive.Files.create でテンプレートを作るため、そのテンプレートとコピー、生成したPDFは、すべて「スクリプトが作ったファイル」としてこの権限の範囲に収まります。手元で先に作った Google ドキュメントのIDを直接 Drive.Files.copy に渡すと、drive.file の範囲外なので失敗します。テンプレートは、必ずこのコードから作ってください。

自分でやる場合の範囲

この最小コードでできないことも書いておきます。消費税の端数処理と8%・10%の混在、支払期日を過ぎた請求の一覧化、入金CSVとの突き合わせは含まれていません。複数件をまとめて処理する場合は、Apps Script の実行時間の上限(1回6分)に当たることがあります。件数が多いときは、途中で止めて続きから再実行する仕組みを自分で足す必要があります。

同じ差し込みの仕組みに、入金の消込・督促文面の作成・体験版の件数上限などを足したキットも配っています。体験版(0円)と有料版はBOOTHで確認できます。