毎月の請求書発行、お疲れ様です。
請求書をメールで送った後、「支払期日に、忘れず対応してもらえるだろうか…」と、お客様の状況が見えないことに不安を感じていませんか?
顧客リストをExcelで管理し、一件一件メールを送る。この方法では、件数が少ないうちは問題ありません。しかし、事業が成長し顧客が増えるにつれて、確認の連絡を入れるべきか迷ったり、不要な連絡でお客様に手間をかけさせてしまったりと、コミュニケーションに課題を感じる場面が増えてきます。
かといって、高機能な請求管理システムを導入するのはコストも手間もかかります。
そこで今回は、多くの企業で使われているGoogleスプレッドシートと、GAS(Google Apps Script)を使って、お客様の請求書確認状況を”見える化”し、双方にとってストレスのないやり取りを実現する仕組みを、4つのステップでご紹介します。
この記事を読めば、高価なツールに頼ることなく、請求管理の不安から解放され、より良い顧客関係の構築にも繋がります。
なぜ、請求に関するコミュニケーションは難しいのか?
手作業での請求管理には、避けがたい課題が潜んでいます。
- 顧客の対応状況がわからない
請求書をメールで送っただけでは、お客様が内容を確認したか、経理部門へ共有済みかまでは分かりません。「支払期日が近いけれど、連絡すべきだろうか…」と、次のアクションに迷ってしまいます。 - 不要な確認連絡による心理的負担
支払期日前に良かれと思って確認の連絡を入れても、お客様が既に対応済みだった場合、「もう済んでいます」という不要なやり取りをさせてしまい、申し訳なさを感じるものです。 - チーム内での情報共有のズレ
請求書の確認状況を個人の記憶やメールの受信箱だけで管理していると、「〇〇社はもう確認済みだっけ?」という情報がチームで共有できません。その結果、担当者によって認識がズレてしまい、お客様を混乱させてしまう可能性があります。 - 確認作業の属人化
請求管理のプロセスが特定の担当者の経験や記憶に依存してしまうと、その担当者が不在の際に業務が滞ってしまいます。誰が見ても状況がわかる、標準化された仕組みが必要です。
これらの課題は、これからご紹介する「仕組み」で解決できます。
【4ステップ】スプレッドシートとGASで作る「自動請求管理」の仕組み
ここからは、具体的な構築手順を解説します。
この仕組みの目的は、お客様が請求書の内容を確認し、支払処理を行う担当部署へ共有したことを、こちら側で把握することです。
完成イメージは、お客様がメール内のリンクをクリックするだけで、スプレッドシートのステータスが自動で「確認済み」に変わるという、非常にシンプルなものです。
Step 1: 全ての情報を集約する「請求管理簿」を作成する
まずは、すべての請求情報を一元管理するための土台となる、Googleスプレッドシートを用意します。
シート名を「請求管理簿」とし、以下の項目を作成しましょう。これらは一例なので、自社の運用に合わせて項目を追加・削除してください。
列 | 項目名 | 内容 |
A | 請求書ID | 請求書を一位に特定するための番号(例: 202408-001) |
B | 請求日 | 請求書を発行した日付 |
C | 請求先 | お客様の会社名 |
D | 案件名 | 請求内容がわかる案件名 |
E | 請求額 | 税込みの請求金額 |
F | 支払期日 | 契約で定められた支払いの期日 |
G | 確認ステータス | お客様の確認状況を記録(この列をGASで自動更新します) |
H | 確認日時 | お客様が確認リンクをクリックした日時(この列もGASで自動更新) |
I | 入金日 | 実際に入金があった日付(手入力) |
J | 入金ステータス | 入金状況を管理(数式で自動更新) |
K | 備考 | その他特記事項 |
【注意】請求書IDはユニークな値に!
請求書IDは、後ほどGASで「どの請求書がクリックされたか」を特定するために非常に重要です。必ず重複しないユニークな値を設定してください。
Step 2: IF関数で「入金ステータス」を自動更新する
次に、経理担当者が入金を確認してI列の「入金日」を入力したら、J列の「入金ステータス」が自動で変わるように設定します。
J2セルに、以下のIF関数を入力してください。
=IF(
I2 <> "",
"入金済み",
IF(
TODAY() > F2,
"支払期日超過",
"未入金"
)
)

【関数の解説】
- IF(I2 <> “”, “入金済み”, …)
- もしI2セル(入金日)が空でなければ「入金済み」と表示します。
- … , IF(TODAY() > F2, “支払期日超過”, “未入金”))
- もしI2セルが空の場合に、今日の日付(TODAY())がF2セル(支払期日)を過ぎていたら「支払期日超過」、そうでなければ「未入金」と表示します。
入力後、J2セルの右下の青い■(フィルハンドル)をドラッグして、下の行にも数式をコピーしましょう。
【ワンポイント】毎回数式をコピーするのが面倒なときは
行が増えるたびに数式をコピーするのが手間に感じる場合は、ARRAYFORMULA(アレイフォーミュラ)関数を使うと便利です。この関数を列の先頭のセルに一度入力するだけで、列全体に数式が自動で適用されるようになります。
ARRAYFORMULA関数について、より詳しく知りたい方はこちらの記事をご覧ください。
Step 3: GASで「ワンクリック確認」のプログラムを作成する
ここがこの仕組みの核心部分です。GASを使って、お客様のアクションをスプレッドシートに自動反映させるプログラムを作成します。
- スプレッドシートのメニューから「拡張機能」>「Apps Script」を選択し、スクリプトエディタを開きます。

- 表示されたコード(function myFunction() {…})をすべて削除し、以下のコードを貼り付けます。
// スプレッドシートのIDとシート名を指定
const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; // スプレッドシートのIDに書き換えてください
const SHEET_NAME = '請求管理簿'; // シート名が違う場合は変更してください
// Webアプリとしてアクセスされたときに実行されるメインの関数
function doGet(e) {
// URLのパラメータから請求書IDを取得
const invoiceId = e.parameter.invoiceId;
// 請求書IDがない場合は、エラーメッセージを表示
if (!invoiceId) {
return HtmlService.createHtmlOutput('エラー: 請求書IDが指定されていません。');
}
// スプレッドシートを更新する関数を呼び出す
const result = updateSheet(invoiceId);
// 結果に応じた完了メッセージページを生成して表示
const template = HtmlService.createTemplateFromFile('完了ページ');
template.message = result;
return template.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
// スプレッドシートを更新する関数
function updateSheet(invoiceId) {
try {
// スプレッドシートとシートを取得
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
// A列(請求書ID)の全データを取得
const idColumn = sheet.getRange('A:A').getValues();
let targetRow = -1;
// 該当する請求書IDが何行目にあるか探す
for (let i = 0; i < idColumn.length; i++) {
if (idColumn[i][0] == invoiceId) {
targetRow = i + 1;
break;
}
}
// 請求書IDが見つかった場合
if (targetRow !== -1) {
// G列(確認ステータス)とH列(確認日時)を更新
sheet.getRange(targetRow, 7).setValue('確認済み'); // G列
sheet.getRange(targetRow, 8).setValue(new Date()); // H列
return '請求書のご確認、誠にありがとうございます。お手続きが完了いたしました。';
} else {
return 'エラー: 該当する請求書が見つかりませんでした。';
}
} catch (e) {
// エラーが発生した場合
return 'エラーが発生しました。管理者にお問い合わせください。エラー詳細: ' + e.message;
}
}

- コード内のYOUR_SPREADSHEET_IDを、あなたのスプレッドシートのIDに書き換えます。
- https://docs.google.com/spreadsheets/d/ここに表示されている長い文字列/edit
の部分がIDです。
【重要】ここを正しく設定しないとエラーになります
- https://docs.google.com/spreadsheets/d/ここに表示されている長い文字列/edit
- 次に、HTMLファイルを作成します。スクリプトエディタの左側にある「ファイル」の「+」をクリックし、「HTML」を選択します。

- ファイル名を「完了ページ.html」として、以下のコードを貼り付けます。このファイルは、お客様がリンクをクリックした後に表示されるメッセージのためだけに使います。
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
body { font-family: sans-serif; text-align: center; padding-top: 50px; }
.container { max-width: 600px; margin: auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; background-color: #f9f9f9;}
</style>
</head>
<body>
<div class="container">
<h2>お手続き完了</h2>
<p><?= message ?></p>
</div>
</body>
</html>

- 最後に、このプログラムをWebアプリケーションとして公開します。
- エディタ右上の青い「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。
- 「種類の選択」で歯車アイコンをクリックし、「ウェブアプリ」を選択します。
- 「アクセスできるユーザー」を「全員」に設定します。
【重要】これをしないとお客様がアクセスできません - 「デプロイ」ボタンをクリックします。
- 承認を求められたら、画面の指示に従って許可してください。
- 表示されたウェブアプリのURLをコピーして、どこかに控えておきます。これがお客様に送るリンクの元になります。




【注意】コードを修正した場合は、再度「デプロイ」>「デプロイを管理」から、新しいバージョンをデプロイし直す必要があります。
Step 4: お客様に送る「専用確認リンク」を作成し、運用する
いよいよ最終ステップです。お客様に送るメールに記載する、お客様専用のリンクを作成します。
Step 3でコピーしたウェブアプリのURLの末尾に、?invoiceId=と、お客様の請求書IDを付け加えることで、専用リンクが完成します。
【リンク作成例】
ウェブアプリのURLが https://script.google.com/macros/s/XXXXXXXX/exec で、
請求書IDが 202408-001 の場合、お客様に送る専用リンクは以下のようになります。
https://script.google.com/macros/s/XXXXXXXX/exec?invoiceId=202408-001
【メール文面例】
株式会社〇〇
経理ご担当者様
いつも大変お世話になっております。
株式会社△△の〇〇です。
請求書をお送りいたしますので、ご査収のほどよろしくお願い申し上げます。
請求書番号:202408-001 お支払期日:2024年8月31日
お手数ではございますが、請求書の内容をご確認いただけましたら、
以下のリンクをクリックして、ご確認の旨をお知らせください。
▼請求書ご確認リンク
<ここに専用確認リンクを貼りつけ>
※本リンクをクリックいただくと、お手続きが完了いたします。
【運用フローの再確認】
- あなた: 請求書を作成し、管理簿に記録。専用リンクを作成してメールで送信。
- お客様: メールを受け取り、請求書を確認後、リンクをクリック。
- GAS: スプレッドシートの「確認ステータス」と「確認日時」を自動で更新。
- あなた: 管理簿を見て、支払期日が近づいても「未確認」のお客様にだけ、状況確認の連絡を入れる。

これで、請求書の確認状況が自動で把握できる仕組みが完成しました。
この仕組みを定着させるための2つの運用ルール
最後に、この便利な仕組みを形骸化させず、チーム全体で効果的に運用していくための簡単なルールを2つご紹介します。
ルール①:入金確認後、即時「入金日」を更新する
経理担当者は、銀行口座などで入金を確認したら、すぐに管理簿の「入金日」を更新するルールを徹底しましょう。これにより、「入金ステータス」が正確に保たれ、社内での情報共有がスムーズになります。
ルール②:定期的に「管理簿」を確認する日を決める
「毎週金曜日の午前中」など、チームで管理簿を確認するタイミングを決めましょう。支払期日が近づいているにもかかわらず、「確認ステータス」が空欄のままのお客様がいないかチェックします。これにより、闇雲に連絡するのではなく、本当にフォローが必要なお客様だけに的を絞って、丁寧なコミュニケーションをとることができます。
まとめ
今回は、GoogleスプレッドシートとGASを活用して、顧客の請求書対応状況を”見える化”し、管理業務を効率化する仕組みをご紹介しました。
- 請求情報をスプレッドシートで一元管理する
- IF関数で入金ステータスを可視化する
- GASのウェブアプリ機能でお客様の確認状況を自動で取得する
高価なシステムを導入しなくても、身近なツールを少し工夫するだけで、業務は劇的に改善できます。最初は設定が少し大変に感じるかもしれませんが、一度仕組みを構築してしまえば、毎月の請求管理業務の不安から解放されるはずです。
ぜひ、今回の記事を参考に、自社の請求管理プロセスを見直してみてはいかがでしょうか。
※Googleサービスは、Google LLC の商標であり、この記事はGoogleによって承認されたり、Google と提携したりするものではありません。