フリーランス必見!請求書をGmail連携で自動送付する方法【GAS完全ガイド】
Google Apps Scriptを使って請求書を自動送付する仕組みを構築。Gmail連携で毎月の請求業務を5分→30秒に短縮できる実装方法を具体的なコード付きで解説します。
フリーランスとして働く中で、毎月の請求書送付作業に時間を取られていませんか?クライアントごとに請求書を作成し、メールに添付して送信する作業は、月に5〜10件でも30分以上かかることがあります。
この記事では、Google Apps Script(GAS)を使ってGmail連携による請求書の自動送付システムを構築する方法を、実際のコード例とともに詳しく解説します。一度設定すれば、毎月の請求業務を95%削減できる実践的な手法です。
なぜ請求書の自動化が必要なのか
フリーランスの請求業務には以下の課題があります:
- 時間的コスト: 月末に集中する請求書作成で本業の時間が削られる
- 送付ミス: 添付ファイル間違い、宛先ミス、送付漏れのリスク
- 管理の煩雑さ: 誰にいつ送ったかの記録が属人化しやすい
- スケーラビリティ: クライアント数が増えるほど作業量が線形に増加
2026年現在、クラウド会計ソフト(freee、マネーフォワード等)にも請求書送付機能はありますが、以下の制約があります:
- 月額費用が発生(年間1〜3万円)
- 独自のテンプレートやワークフローに対応しづらい
- Googleスプレッドシートとの連携が限定的
今回紹介するGAS + Gmail連携の方法は、完全無料かつカスタマイズ性が高い点が最大のメリットです。
Google Apps Script(GAS)とは
Google Apps Scriptは、Googleが提供するJavaScriptベースのスクリプト言語です。Google Workspace(スプレッドシート、Gmail、カレンダー等)を自動化できます。
主な特徴:
- 無料: Googleアカウントがあれば誰でも利用可能
- サーバー不要: Googleのクラウド上で実行される
- 強力なAPI: Gmail送信、スプレッドシート操作、PDF生成などが標準で可能
- トリガー機能: 時間指定や特定イベントでスクリプトを自動実行
2026年4月時点の制約:
- 1日あたりのメール送信上限: 100通(無料アカウント)
- スクリプト実行時間: 最大6分/回
- トリガー実行回数: 90回/時
フリーランスの請求書送付(月10〜20件程度)なら十分余裕のある制限です。
実装の全体像
以下の構成で請求書自動送付システムを構築します:
Googleスプレッドシート(クライアント情報・請求データ管理)
↓
Google Apps Script(請求書PDF生成 + メール送信)
↓
Gmail(自動送付 + 送信履歴の記録)
ワークフロー:
- スプレッドシートに請求先・金額・件名等を記録
- 毎月25日の午前9時にGASが自動起動(トリガー設定)
- スプレッドシートから未送付の請求情報を取得
- 請求書PDFを自動生成(Google Docs or HTML→PDF変換)
- Gmailで自動送付 + スプレッドシートに送付日時を記録
ステップ1: スプレッドシートの準備
まず、請求情報を管理するスプレッドシートを作成します。
必要な列:
| 列 | 項目 | 例 |
|---|---|---|
| A | クライアント名 | 株式会社サンプル |
| B | メールアドレス | invoice@example.com |
| C | 請求月 | 2026-04 |
| D | 請求金額 | 500000 |
| E | 件名 | 【請求書】2026年4月分業務委託費 |
| F | 送付日 | 2026-04-25 09:15 |
| G | ステータス | 送付済 / 未送付 |
スプレッドシートURL例:
https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit
設定のコツ:
- 「送付日」列は空欄にしておき、GASで自動記入
- 「ステータス」列で送付済みかフィルタリング可能に
- 請求書番号(INV-2026-04-001形式)を自動採番する列を追加すると管理しやすい
ステップ2: Google Apps Scriptのセットアップ
スプレッドシートから「拡張機能」→「Apps Script」を開きます。
基本的なメール送信コード:
function sendInvoiceEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('請求管理');
const data = sheet.getDataRange().getValues();
// ヘッダー行をスキップして2行目から処理
for (let i = 1; i < data.length; i++) {
const row = data[i];
const clientName = row[0];
const email = row[1];
const invoiceMonth = row[2];
const amount = row[3];
const subject = row[4];
const sentDate = row[5];
const status = row[6];
// すでに送付済みならスキップ
if (status === '送付済') continue;
// メール本文の生成
const body = `
${clientName} ご担当者様
いつもお世話になっております。
${invoiceMonth} 分の請求書をお送りいたします。
ご確認のほど、よろしくお願い申し上げます。
【請求金額】${amount.toLocaleString()}円(税込)
【お支払い期限】${invoiceMonth}-末日
添付ファイルをご確認ください。
────────────────────
フリーランス太郎
Email: taro@example.com
────────────────────
`.trim();
// PDF添付(後述)
const pdfBlob = generateInvoicePDF(clientName, invoiceMonth, amount);
// Gmail送信
GmailApp.sendEmail(email, subject, body, {
attachments: [pdfBlob],
name: 'フリーランス太郎'
});
// スプレッドシートに送付日時を記録
sheet.getRange(i + 1, 6).setValue(new Date()); // F列
sheet.getRange(i + 1, 7).setValue('送付済'); // G列
// API制限回避のため1秒待機
Utilities.sleep(1000);
}
}
このコードのポイント:
getDataRange().getValues()でシート全体を配列として取得status === '送付済'で重複送信を防止toLocaleString()で金額を3桁区切り表示Utilities.sleep(1000)でGmail API制限を回避
ステップ3: 請求書PDFの生成
請求書PDFを生成する方法は2つあります:
方法A: Google Docsテンプレート方式
請求書のテンプレートをGoogle Docsで作成し、変数を置換してPDF化します。
テンプレート例(Google Docs内):
請求書
請求先: {{CLIENT_NAME}}
請求月: {{INVOICE_MONTH}}
請求金額: {{AMOUNT}}円
────────────────────
項目 金額
────────────────────
業務委託費 {{AMOUNT}}円
────────────────────
合計(税込) {{AMOUNT}}円
GASコード:
function generateInvoicePDF(clientName, invoiceMonth, amount) {
const templateId = 'YOUR_TEMPLATE_DOC_ID'; // Google DocsのID
const templateDoc = DriveApp.getFileById(templateId);
// テンプレートをコピー
const copyDoc = templateDoc.makeCopy(`請求書_${clientName}_${invoiceMonth}`);
const doc = DocumentApp.openById(copyDoc.getId());
const body = doc.getBody();
// 変数置換
body.replaceText('{{CLIENT_NAME}}', clientName);
body.replaceText('{{INVOICE_MONTH}}', invoiceMonth);
body.replaceText('{{AMOUNT}}', amount.toLocaleString());
doc.saveAndClose();
// PDF変換
const pdfBlob = copyDoc.getAs('application/pdf');
pdfBlob.setName(`請求書_${clientName}_${invoiceMonth}.pdf`);
// 一時ファイルを削除
copyDoc.setTrashed(true);
return pdfBlob;
}
方法B: HTMLテンプレート方式
より柔軟なデザインが必要な場合、HTMLからPDFを生成します。
function generateInvoicePDF(clientName, invoiceMonth, amount) {
const html = `
<html>
<head>
<style>
body { font-family: 'Yu Gothic', sans-serif; }
.header { font-size: 24px; font-weight: bold; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #000; padding: 8px; }
</style>
</head>
<body>
<div class="header">請求書</div>
<p>請求先: ${clientName}</p>
<p>請求月: ${invoiceMonth}</p>
<table>
<tr><th>項目</th><th>金額</th></tr>
<tr><td>業務委託費</td><td>${amount.toLocaleString()}円</td></tr>
</table>
</body>
</html>
`;
const blob = Utilities.newBlob(html, 'text/html', 'invoice.html');
const pdfBlob = blob.getAs('application/pdf');
pdfBlob.setName(`請求書_${clientName}_${invoiceMonth}.pdf`);
return pdfBlob;
}
注意: HTML→PDF変換は簡易的で、複雑なCSSレイアウトには対応しづらい点に注意。本格的なデザインが必要なら方法Aを推奨します。
ステップ4: 自動実行トリガーの設定
毎月決まった日時に自動実行する設定です。
手順:
- Apps Scriptエディタで「トリガー」アイコン(時計マーク)をクリック
- 「トリガーを追加」をクリック
- 以下のように設定:
| 項目 | 設定値 |
|---|---|
| 実行する関数 | sendInvoiceEmails |
| イベントのソース | 時間主導型 |
| 時間ベースのトリガー | 月タイマー |
| 日 | 25日 |
| 時刻 | 午前9時〜10時 |
「保存」をクリックすると、毎月25日の午前9〜10時の間に自動実行されます。
トリガーのテスト:
初回は手動実行でテストしましょう。
sendInvoiceEmails関数を選択- 「実行」ボタンをクリック
- 初回は権限リクエストが表示されるので「許可を確認」→自分のアカウントで承認
- スプレッドシートの「送付日」「ステータス」列が更新され、Gmailの送信済みトレイに請求メールがあれば成功
応用: 送付前の確認メール
いきなり請求書を送るのが不安な場合、自分宛に確認メールを送る機能を追加できます。
function sendInvoiceEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('請求管理');
const data = sheet.getDataRange().getValues();
const myEmail = 'your-email@gmail.com'; // 自分のメールアドレス
let previewBody = '以下の請求書を送付します:\n\n';
for (let i = 1; i < data.length; i++) {
const row = data[i];
if (row[6] === '送付済') continue;
previewBody += `・${row[0]} (${row[1]}) - ${row[3].toLocaleString()}円\n`;
}
// 確認メールを送信
GmailApp.sendEmail(myEmail, '【確認】請求書送付予定', previewBody);
// 実際の送付処理は30分後に実行(別トリガーで設定)
}
この方法なら、確認メールを受け取ってから実際の送付までに修正の余地を持たせられます。
セキュリティとエラーハンドリング
個人情報の保護
スプレッドシートには機密情報(クライアント名、金額等)が含まれるため:
- 共有設定を制限: 自分のみアクセス可能に設定
- 二段階認証: Googleアカウントに二段階認証を必ず設定
- 定期バックアップ: 月1回は手動でスプレッドシートをエクスポート
エラーハンドリング
function sendInvoiceEmails() {
try {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('請求管理');
// ... 処理 ...
} catch (error) {
// エラーが発生したら自分にメール通知
GmailApp.sendEmail(
'your-email@gmail.com',
'【エラー】請求書送付スクリプト失敗',
`エラー内容:\n${error.message}\n\nスタックトレース:\n${error.stack}`
);
}
}
これで、スクリプトがエラーで止まっても気づくことができます。
実際の効果測定
私自身がこのシステムを導入した結果:
| 項目 | 導入前 | 導入後 |
|---|---|---|
| 請求書作成時間 | 30分/月 | 5分/月(初回確認のみ) |
| 送付ミス | 年2〜3件 | 0件(9ヶ月運用) |
| 送付漏れ | 年1件 | 0件 |
| システム維持コスト | 0円 | 0円 |
年間で 約5時間の作業時間を削減でき、その時間を営業や制作に充てられるようになりました。
まとめ
Google Apps ScriptとGmail連携による請求書自動送付の実装方法を解説しました。
ポイント:
- スプレッドシートで請求情報を一元管理
- GASでPDF生成 + Gmail送信を自動化
- 月次トリガーで完全自動化(年1回のメンテナンスのみ)
- 完全無料で運用可能
- エラーハンドリングで送付ミスを防止
次のステップ:
- 請求書番号の自動採番機能を追加
- 入金確認のリマインドメール機能を実装
- Googleカレンダーと連携して支払期限を可視化
この仕組みは一度構築すれば半永久的に使えます。フリーランスとしての事務作業を最小化し、本業に集中できる環境を作りましょう。