スプレッドシートの一覧から請求書PDFを自動で作る方法

スプレッドシートの一覧から請求書PDFを自動で作る方法

記事
IT・テクノロジー
毎月、請求書の宛名や金額を書き換えて、1枚ずつPDFに保存する作業は、件数が増えるほど時間がかかります。請求先の一覧と請求書のひな形をスプレッドシートで用意しておけば、GAS(Google Apps Script)でまとめて作れます。

シートの準備

・「一覧」シート:A列に宛名、B列に金額、C列に件名を入れます。D列は空けておきます(作成済みの印が入る列です)
・「請求書」シート:請求書のひな形です。宛名・件名・金額を入れるセルを決めておきます(この記事では、宛名をB3、件名をB5、金額をE10とします)
・PDFを保存するドライブのフォルダを1つ作っておきます

コード

スプレッドシートの「拡張機能」→「Apps Script」に貼り付けます。「保存先フォルダのID」は、ドライブでそのフォルダを開いたときのアドレスの、最後の英数字の部分です。
function createInvoicePdfs() {
  const ss = SpreadsheetApp.getActive();
  const list = ss.getSheetByName('一覧');
  const tpl = ss.getSheetByName('請求書');
  const folder = DriveApp.getFolderById('保存先フォルダのID');
  const last = list.getLastRow();
  if (last < 2) return;

  const rows = list.getRange(2, 1, last - 1, 4).getValues();
  rows.forEach((r, i) => {
    if (!r[0] || r[3]) return; // 宛名が空、または作成済みなら飛ばす
    tpl.getRange('B3').setValue(r[0]); // 宛名
    tpl.getRange('B5').setValue(r[2]); // 件名
    tpl.getRange('E10').setValue(r[1]); // 金額
    SpreadsheetApp.flush();

    // 請求書シートだけを一時ファイルにコピーしてPDFにする
    const tmp = SpreadsheetApp.create('tmp_invoice');
    tpl.copyTo(tmp);
    tmp.deleteSheet(tmp.getSheets()[0]);
    SpreadsheetApp.flush();
    const file = DriveApp.getFileById(tmp.getId());
    folder.createFile(file.getAs('application/pdf').setName('請求書_' + r[0] + '.pdf'));
    file.setTrashed(true);

    list.getRange(i + 2, 4).setValue('済');
  });
}

使い方

関数「createInvoicePdfs」を実行すると、一覧のうちD列が空の行について請求書のPDFが作られ、D列に「済」が入ります。もう一度実行しても、作成済みの行は飛ばすので、二重に作られることはありません。
初めて実行するときは、許可を求める画面が出ます。自分のアカウントを選んで許可してください。

注意点

・この方法では、PDFの用紙サイズや余白、枠線の表示を細かく指定できません。見た目を細かく決めたい場合は、別の書き方が必要です
・ひな形の中で、ほかのシートを参照する数式を使っていると、コピーしたときに表示が崩れることがあります。金額などは、コードで値として書き込む形にしておくと安全です
・請求書に載せる項目(登録番号や税の書き方など)は、ご自身の状況に合わせて確認してください

作り込みが必要な場合は

明細が複数行ある、取引先ごとにメールで送りたい、毎月自動で作りたい、といった場合は、ご依頼でもお受けしています。
▶ スプレッドシートから請求書PDFを自動作成します
サービス数100万件のスキルマーケット、あなたにぴったりのサービスを探す