毎月30件の請求書をExcelで作成し、PDF化してメール送信する作業に半日かかっていた。
宛名・金額の転記ミスや送信先の間違いも月に数回発生。
手作業で請求書を1件ずつ作成
所要時間: 約4時間/月
転記ミス: 月2〜3件発生
ボタン1つで全件自動生成+送信
所要時間: 約30秒
転記ミス: ゼロ
スプレッドシートに顧客名・品目・金額・メールアドレスを入力します。
| 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 |
カスタムメニュー「請求書ツール」から「未送信を一括発行」を選択します。
テンプレートに差し込み → 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('済');
}