GASによる見積書・請求書の自動化で、月8時間の事務作業がゼロになる
Google Apps Script(以下GAS)を使えば、見積書・請求書の作成からPDF化、メール送信までを完全に自動化できます。
必要なのはGoogle Workspaceのアカウントと、Googleスプレッドシート、Googleドキュメントだけです。
外部サービスの契約も追加費用も不要で、すでにGoogle Workspaceを業務利用しているなら今日から始められます。
筆者自身、2024年にこの仕組みを自社の請求業務に導入し、毎月約8時間かかっていた見積書・請求書の作成・送付作業をほぼゼロにしました。
「毎月同じ作業を繰り返している」「Excelで見積書を作ってPDFに変換して、メールに添付して……」という手作業から解放されたい方は、ぜひ最後まで読んでみてください。
なぜ今、見積書・請求書の自動化が必要なのか
中小企業やフリーランスにとって、見積書・請求書の発行業務は「地味だが確実に時間を食う」タスクの代表格です。freee株式会社が2023年に実施した「バックオフィスの業務実態調査」によると、従業員50名以下の企業では経理担当者の月間業務時間のうち約23%が請求書関連業務に費やされていると報告されています。
さらに、2023年10月のインボイス制度開始以降、適格請求書の記載要件が厳格化され、手作業でのミスが税務リスクに直結する状況になりました。登録番号の記載漏れ、税率ごとの区分記載の誤り、端数処理の不一致など、一つひとつは小さなことでも、件数が増えると確認作業だけで相当な時間を消費します。
こうした背景から、クラウド会計ソフトやSaaS型の請求書サービスを導入する企業も増えています。ただし、月額費用が発生する点や、既存の業務フローとの連携に手間がかかる点がハードルになるケースも少なくありません。
GASで自動化するメリットと制約
GAS(Google Apps Script)はGoogleが提供するJavaScriptベースのスクリプト環境で、Googleスプレッドシート、ドキュメント、Gmail、Googleドライブなど、Google Workspaceの各サービスをプログラムから操作できます。最大のメリットは「追加コストゼロで、すでに使っているツールの中だけで完結する」という点です。
一方で、GASには1回の実行時間が最大6分(Google Workspace有料プランでは30分)という制限があります。また、1日あたりのメール送信数にも上限があり、無料のGoogleアカウントでは100通/日、Google Workspaceアカウントでは1,500通/日です(2026年5月時点)。月に数十件程度の請求書発行であれば十分対応可能ですが、数百件規模になる場合はクラウド請求書サービスとの併用を検討すべきでしょう。
筆者の場合、月間の発行件数は15〜25件程度のため、GASで十分に運用できています。むしろ、Google Workspaceの環境内ですべてが完結するため、ファイル管理やメール送信の一元化という副次的なメリットが大きいと感じています。
GASで見積書・請求書を自動化する3ステップ
ここからは実際の構築手順を解説します。全体像は「スプレッドシートにデータを入力 → ドキュメントのテンプレートに差し込み → PDF変換してメール送信」というシンプルな流れです。
ステップ1:スプレッドシートとドキュメントテンプレートを準備する
まず、請求データを管理するGoogleスプレッドシートを作成します。シートの構成例は以下のとおりです。
「請求データ」シートの列構成:
- A列:請求書番号(INV-2026-001 のような採番ルール)
- B列:取引先名
- C列:取引先メールアドレス
- D列:件名(案件名)
- E列:品目
- F列:数量
- G列:単価
- H列:小計(数量×単価の計算式)
- I列:税率(10%または8%)
- J列:発行日
- K列:支払期限
- L列:送信ステータス(未送信/送信済み)
次に、Googleドキュメントで請求書のテンプレートを作成します。テンプレート内には、GASで置換するためのプレースホルダーを記述します。例えば {{会社名}}、{{請求書番号}}、{{合計金額}} のように二重波括弧で囲んだ文字列を配置しておきます。
ここで筆者が最初に失敗したのが、テンプレートのレイアウト設計です。Googleドキュメントは印刷用のレイアウトがやや弱く、表の罫線やセル幅がPDF変換時に微妙にずれることがあります。対策として、テンプレート内の表は「固定列幅」を設定し、フォントはNoto Sans JPに統一しました。游ゴシックやヒラギノ角ゴなどローカルフォントを指定すると、環境によって表示が崩れる原因になります。
ステップ2:GASでテンプレートへのデータ差し込みとPDF変換を実装する
GASのスクリプトエディタを開き、以下の処理を記述します。コアとなる関数の構造を示します。
function generateInvoice() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('請求データ');
const data = sheet.getDataRange().getValues();
const templateId = 'ここにテンプレートのドキュメントIDを記載';
for (let i = 1; i data.length; i++) {
if (data[i][11] === '送信済み') continue; // L列が送信済みならスキップ
// テンプレートをコピー
const templateFile = DriveApp.getFileById(templateId);
const copyFile = templateFile.makeCopy('請求書_' + data[i][0], DriveApp.getFolderById('出力先フォルダID'));
const copyDoc = DocumentApp.openById(copyFile.getId());
const body = copyDoc.getBody();
// プレースホルダーを置換
body.replaceText('{{請求書番号}}', data[i][0]);
body.replaceText('{{取引先名}}', data[i][1]);
body.replaceText('{{件名}}', data[i][3]);
body.replaceText('{{品目}}', data[i][4]);
body.replaceText('{{数量}}', String(data[i][5]));
body.replaceText('{{単価}}', Number(data[i][6]).toLocaleString());
body.replaceText('{{小計}}', Number(data[i][7]).toLocaleString());
body.replaceText('{{発行日}}', Utilities.formatDate(new Date(data[i][9]), 'Asia/Tokyo', 'yyyy年MM月dd日'));
body.replaceText('{{支払期限}}', Utilities.formatDate(new Date(data[i][10]), 'Asia/Tokyo', 'yyyy年MM月dd日'));
copyDoc.saveAndClose();
// PDF変換
const pdfBlob = DriveApp.getFileById(copyFile.getId()).getAs('application/pdf');
pdfBlob.setName('請求書_' + data[i][0] + '.pdf');
// メール送信
GmailApp.sendEmail(data[i][2], '【請求書送付】' + data[i][3],
data[i][1] + ' 御中\n\nいつもお世話になっております。\n請求書を添付にてお送りいたします。\nご査収のほどよろしくお願いいたします。',
{attachments: [pdfBlob]}
);
// 送信ステータスを更新
sheet.getRange(i + 1, 12).setValue('送信済み');
// テンプレートコピーを削除(PDFのみ残す場合)
// DriveApp.getFileById(copyFile.getId()).setTrashed(true);
}
}このコードのポイントをいくつか補足します。
まず、makeCopyでテンプレートを都度コピーしている理由ですが、元のテンプレートを直接編集してしまうと、2件目以降の処理で置換対象のプレースホルダーが消失するためです。意外と見落としがちな点で、筆者も初期に原本を壊してしまい慌てて復旧した経験があります。
次に、金額のフォーマットです。toLocaleString()でカンマ区切りにしていますが、GAS環境ではtoLocaleString()の挙動がブラウザと異なる場合があります。確実にカンマ区切りにしたい場合は、以下のようなヘルパー関数を用意しておくと安全です。
function formatCurrency(num) {
return '¥' + String(num).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');
}もう一つ、実務で運用して気づいた重要な点があります。replaceTextは正規表現として処理されるため、プレースホルダーに正規表現の特殊文字(.、*、+など)を含めると意図しない置換が発生します。二重波括弧 {{}} を使うのは、この問題を回避しやすいという実用上の理由もあります。
ステップ3:トリガー設定で定期実行を自動化する
作成した関数を定期的に自動実行するには、GASのトリガー機能を使います。スクリプトエディタの左メニューから「トリガー」を選択し、以下のように設定します。
- 実行する関数:generateInvoice
- イベントのソース:時間主導型
- 時間ベースのトリガータイプ:月ベースのタイマー(例:毎月1日の午前9時〜10時)
筆者の場合は月末締めの翌月1日発行というサイクルのため、毎月1日の朝9時にトリガーを設定しています。加えて、スプレッドシートのカスタムメニューからも手動実行できるようにしておくと、イレギュラーな請求にも対応できます。
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('請求書ツール')
.addItem('請求書を生成・送信', 'generateInvoice')
.addToUi();
}このonOpen関数をスクリプトに追加しておけば、スプレッドシートを開くたびにメニューバーに「請求書ツール」が表示されます。経理担当者がスクリプトエディタを開く必要がなくなるため、非エンジニアへの引き継ぎもスムーズです。
GAS自動化 vs クラウド請求書サービス:どちらを選ぶべきか
| 比較項目 | GAS自動化 | クラウド請求書サービス(例:freee、マネーフォワード) |
|---|---|---|
| 初期コスト | 無料(Google Workspace契約済みの場合) | 無料〜月額2,980円程度 |
| 月額コスト | なし | 月額500〜4,980円(プランによる) |
| カスタマイズ性 | 高い(コードで自由に設計可能) | テンプレート内で制限あり |
| 導入難易度 | 中(JavaScriptの基礎知識が必要) | 低(GUI操作のみ) |
| インボイス制度対応 | 自分でテンプレートに要件を反映する必要あり | 自動対応 |
| 会計ソフト連携 | API連携を自作する必要あり | 標準搭載 |
| 月間発行件数の目安 | 〜50件程度が快適 | 制限なし(プランによる) |
筆者の見解としては、月間発行件数が30件以下で、すでにGoogle Workspaceを業務の基盤にしている場合はGAS自動化のコストパフォーマンスが圧倒的に高いです。逆に、50件を超える規模で会計ソフトとの自動連携が必須の場合は、クラウド請求書サービスのほうが運用負荷は低くなります。
なお、Google Workspaceをまだ導入していない方や、これから契約を検討している方は、Google Workspaceのプロモーションコードを利用して初年度15%割引で始めるのがおすすめです。Business Starterプランなら月額800円からGASを含むすべての機能が使えるため、請求書自動化の基盤として十分な環境が整います。
運用して分かった「教科書に載っていない」5つの実務ノウハウ
1. PDF変換後のフォント崩れを防ぐ設定
Googleドキュメントのテンプレートで日本語フォントを使用する場合、PDF変換時に文字間隔が微妙に広がることがあります。これはドキュメントの「ページ設定」で余白を適切に確保し、フォントサイズを10.5pt以上にすることでほぼ解消できました。9pt以下の小さな文字は特に崩れやすいので注意が必要です。
2. 送信エラー時のリカバリー処理
GASでGmailApp.sendEmailを実行した際、宛先アドレスの形式エラーやGoogleの送信制限に引っかかってスクリプトが途中で停止することがあります。筆者は導入3ヶ月目に、取引先のメールアドレスに全角スペースが混入していたことに気づかず、5件目で処理が止まるという事態を経験しました。対策として、try-catch文でエラーをハンドリングし、エラーが発生した行をスプレッドシートの別シートにログとして記録する仕組みを追加しています。
3. 請求書番号の自動採番ルール
請求書番号の重複は税務調査で指摘される可能性があるため、採番ルールは慎重に設計すべきです。筆者は「INV-年4桁-月2桁-連番3桁」(例:INV-2026-05-001)の形式を採用し、スプレッドシートの関数で自動生成しています。年月が変わると連番がリセットされるため、過去データとの重複リスクを排除できます。
4. テスト送信の仕組みを必ず用意する
本番データで直接テストすると、取引先に誤って請求書を送ってしまう事故が起こりえます。筆者はスプレッドシートに「テストモード」列を追加し、テストモードがONの場合は宛先を自分のメールアドレスに強制的に差し替える処理を入れています。些細な工夫ですが、これがなかったら確実に事故を起こしていたと思います。
5. Google Workspaceのプランによる実行時間の違い
無料のGoogleアカウントではGASの1回の実行時間上限が6分ですが、Google Workspaceの有料アカウントでは30分に拡張されます。請求書の件数が多い場合、この差は致命的です。20件以上の請求書を一括処理する場合は、Google Workspaceの有料プランを利用したほうが安定します。Google Workspaceプロモーションコードで割引を適用すれば、Business Standardプラン(月額1,600円)でも初年度は月額1,360円から利用可能です。2TBのGoogle Driveストレージが付くため、PDF化した請求書のアーカイブ保管にも余裕が持てます。
導入前後のビフォーアフター:筆者の実例
筆者が2024年4月にGASによる請求書自動化を導入した前後の変化を、具体的な数値で振り返ります。
| 項目 | 導入前 | 導入後 |
|---|---|---|
| 請求書1件あたりの作成時間 | 約15分(Excel入力→PDF変換→メール添付) | 約1分(スプレッドシートにデータ入力のみ) |
| 月間の請求関連作業時間 | 約8時間(20件×15分+確認作業) | 約30分(データ入力+実行確認) |
| 送付ミス(宛先・金額誤り) | 年2〜3回 | 導入後ゼロ |
| 請求書の保管場所 | ローカルPC+外付けHDD | Google Drive(自動整理) |
特に効果が大きかったのは、ヒューマンエラーの削減です。手作業でExcelに金額を入力し、PDFに変換し、メールに添付するという工程では、どうしても転記ミスや添付忘れが発生していました。GASでは一度スプレッドシートにデータを入れれば、あとは機械的に処理されるため、「確認のための確認」という非生産的な作業から解放されました。
よくある質問
Q. GASでの請求書自動化にプログラミング経験は必要ですか?
A. JavaScriptの基礎的な知識(変数、ループ、関数の概念)があれば十分です。この記事で紹介しているコードをコピーして、テンプレートIDやフォルダIDを自社のものに書き換えるだけで動作します。完全な未経験の場合でも、Google公式のGAS入門チュートリアルを2〜3時間学べば理解できるレベルです。
Q. インボイス制度(適格請求書等保存方式)に対応できますか?
A. 対応可能です。Googleドキュメントのテンプレートに登録番号、適用税率、税率ごとの消費税額を記載する欄を設け、スプレッドシート側で税率区分ごとの集計を行えば、インボイス制度の記載要件を満たす請求書を自動生成できます。ただし、要件の正確性は自身で確認する必要があるため、初回は税理士にテンプレートをチェックしてもらうことを推奨します。
Q. 見積書と請求書の両方を同じ仕組みで自動化できますか?
A. できます。スプレッドシートに「書類種別」列を追加し、見積書用と請求書用のテンプレートを別々に用意すれば、同じスクリプトで両方を処理可能です。筆者は見積書のテンプレートに「有効期限」欄を、請求書のテンプレートに「支払期限」欄をそれぞれ設けて運用しています。
Q. Google Workspaceの無料アカウントでも使えますか?
A. 個人向けの無料Googleアカウントでも基本的な機能は動作しますが、GASの実行時間が6分に制限される点と、1日のメール送信上限が100通である点に注意が必要です。業務利用であれば、Google Workspaceの有料プラン(Business Starter:月額800円〜)を利用することで、実行時間が30分に拡張され、メール送信上限も1,500通/日に増加します。
Q. 送信済みの請求書PDFはどこに保存されますか?
A. スクリプト内で指定したGoogle Driveのフォルダに自動保存されます。フォルダを年度・月ごとに分けるようスクリプトを設計しておけば、確定申告や税務調査の際にも必要な書類をすぐに見つけられます。電子帳簿保存法の要件を満たすためには、検索性の確保(取引先名・日付・金額での検索)も意識した命名規則にしておくとよいでしょう。
まとめ:GASで請求業務を自動化する最初の一歩
GASによる見積書・請求書の自動化は、「スプレッドシートでデータ管理 → ドキュメントテンプレートに差し込み → PDF変換してメール送信」の3ステップで構築できます。特別なツールや有料サービスを追加する必要がなく、Google Workspaceの標準機能だけで完結するのが最大の強みです。
まずはテンプレートの作成と、1件だけの手動実行から始めてみてください。動作を確認できたら、トリガー設定で自動実行に切り替え、テストモードやエラーログなどの安全装置を追加していくのがおすすめの進め方です。
Google Workspaceをまだ利用していない方は、プロモーションコードを使った初年度15%割引を活用して、コストを抑えた状態から始めるのが賢い選択です。月額800円のBusiness Starterプランでも、GAS・Googleドキュメント・スプレッドシート・Gmail・Google Driveのすべてが揃うため、この記事で紹介した自動化の仕組みをフルに活用できます。
