← 作品一覧に戻る
業務自動化 / 帳票作成

請求書 一括作成ツール(デモ)

取引先ごとにバラバラの明細を貼り付けるだけで、請求書を人数分まとめて作成します。 消費税(10%・軽減8%)の計算と請求番号の採番も自動です。作成後はそのまま印刷・PDF保存できます。

※ このページはポートフォリオ用のデモです。会社名・金額・振込先はすべて架空のものです。
入力したデータはブラウザの中だけで処理され、サーバーには一切送信されません。

1. 明細データを貼り付ける

3. 同じ仕組みを実務で使う場合

スプレッドシートで運用する

GASで請求書をPDF化し、取引先ごとにGoogleドライブへ保存、メール送信まで自動化できます。

Excelのひな形がある場合

既存のExcelテンプレートに差し込んで、取引先の数だけファイルを書き出します(Python / VBA)。

毎月決まった日に作る

定期実行を設定し、締め日に自動で当月分を作成、担当者には確認用の通知だけを届けます。

// 明細シートから取引先ごとの請求書PDFを作り、Driveに保存する
const TAX = { normal: 0.10, reduced: 0.08 };

function 請求書を一括作成() {
  const ss    = SpreadsheetApp.getActive();
  const rows  = ss.getSheetByName('明細').getDataRange().getValues();
  const head  = rows.shift();
  const col   = name => head.indexOf(name);
  const folder = DriveApp.createFolder('請求書_' + Utilities.formatDate(new Date(), 'JST', 'yyyyMM'));

  // 取引先ごとに明細をまとめる
  const groups = {};
  rows.forEach(r => {
    const client = r[col('取引先名')];
    if (!client) return;
    (groups[client] = groups[client] || []).push({
      item: r[col('品目')],
      qty:  Number(r[col('数量')]),
      unit: Number(r[col('単価')]),
      rate: String(r[col('税率')]).indexOf('8') >= 0 ? TAX.reduced : TAX.normal
    });
  });

  const tpl = ss.getSheetByName('請求書テンプレート');
  Object.keys(groups).forEach((client, i) => {
    const lines = groups[client];
    const subtotal = lines.reduce((s, l) => s + l.qty * l.unit, 0);
    const tax      = Math.floor(lines.reduce((s, l) => s + l.qty * l.unit * l.rate, 0));

    tpl.getRange('B3').setValue(client + ' 御中');
    tpl.getRange('B5').setValue('INV-' + Utilities.formatDate(new Date(), 'JST', 'yyyy')
                                + '-' + ('000' + (i + 1)).slice(-4));
    tpl.getRange('B7').setValue(subtotal + tax);
    tpl.getRange('A10:D' + (9 + lines.length))
       .setValues(lines.map(l => [l.item, l.qty, l.unit, l.qty * l.unit]));
    SpreadsheetApp.flush();

    // シートをPDFにしてフォルダへ保存
    const url = ss.getUrl().replace(/\/edit.*$/, '')
      + '/export?format=pdf&gid=' + tpl.getSheetId() + '&portrait=true&fitw=true';
    const pdf = UrlFetchApp.fetch(url, {
      headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }
    }).getBlob().setName(client + '_請求書.pdf');
    folder.createFile(pdf);
  });

  SpreadsheetApp.getUi().alert(
    Object.keys(groups).length + '件の請求書を作成しました。\nフォルダ: ' + folder.getName());
}