← ポートフォリオに戻る

解決する課題

毎月30件の請求書をExcelで作成し、PDF化してメール送信する作業に半日かかっていた。
宛名・金額の転記ミスや送信先の間違いも月に数回発生。

導入効果

Before

手作業で請求書を1件ずつ作成
所要時間: 約4時間/月
転記ミス: 月2〜3件発生

After

ボタン1つで全件自動生成+送信
所要時間: 約30秒
転記ミス: ゼロ

使い方

1
請求データを入力

スプレッドシートに顧客名・品目・金額・メールアドレスを入力します。

ファイル 編集 表示 挿入 表示形式 請求書ツール
A1 | 顧客名
A B C D
1 顧客名 品目 金額 メールアドレス
2 株式会社ABC Webサイト制作 330,000 abc@example.com
3 田中商店 ロゴデザイン 55,000 tanaka@example.com
4 鈴木工業 LP制作+広告運用 220,000 suzuki@example.com
2
メニューから一括発行

カスタムメニュー「請求書ツール」から「未送信を一括発行」を選択します。

ファイル 編集 表示 挿入 表示形式
請求書ツール
選択行を発行
未送信を一括発行
送信済みフラグをリセット
3
PDF生成+メール送信が完了

テンプレートに差し込み → PDF変換 → メール送信が自動で行われます。

機能一覧

技術構成

項目 内容
ランタイムGoogle Apps Script (V8)
データソースGoogle スプレッドシート
テンプレートGoogle ドキュメント(差し込み変数)
PDF変換DriveApp.getAs('application/pdf')
メール送信GmailApp.sendEmail(HTML本文 + PDF添付)
トリガーカスタムメニュー(手動実行)

ソースコード抜粋

// ===== 1行分の処理 =====
function processRow_(sheet, rowNum, row) {
  const customerName = row[0];
  const amount = row[4];
  const email = row[5];

  // 請求番号を生成
  const today = new Date();
  const dateStr = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyyMMdd');
  const invoiceNo = 'INV-' + dateStr + '-' + String(rowNum).padStart(3, '0');

  // テンプレートをコピーして差し込み
  const templateDoc = DriveApp.getFileById(CONFIG.TEMPLATE_ID);
  const copyFile = templateDoc.makeCopy(invoiceNo + '_' + customerName);
  const doc = DocumentApp.openById(copyFile.getId());
  const body = doc.getBody();

  body.replaceText('{{顧客名}}', customerName);
  body.replaceText('{{金額}}', Number(amount).toLocaleString());
  body.replaceText('{{請求番号}}', invoiceNo);
  doc.saveAndClose();

  // PDF に変換してメール送信
  const pdfBlob = DriveApp.getFileById(copyFile.getId())
    .getAs('application/pdf')
    .setName(invoiceNo + '_' + customerName + '.pdf');

  GmailApp.sendEmail(email, '【請求書】' + customerName + '様', '', {
    htmlBody: buildEmailBody_(customerName, invoiceNo, amount),
    attachments: [pdfBlob],
  });

  // 送信済みフラグを記録
  sheet.getRange(rowNum, 7).setValue('済');
}