副業や個人の仕事で、こんなことに困っていませんか?
- 「支払い期日が近い取引先を、毎回スプレッドシートで目視確認している」
- 「リマインドのメールを送り忘れて、後から気まずくなった」
- 「同じような文面を、毎回一から書いている」
お金まわりの作業は、大事なのに後回しになりがちです。そこで今回は、「期日の確認」と「リマインドの下書き作成」だけをGASに任せる仕組みを作ります。
送信そのものは自分で確認してから行うので、初めてでも安心して試せます。
- 請求まわりで自動化しやすい作業と、人が残すべき作業
- 管理用スプレッドシートの作り方
- 期日が近い取引先にリマインドの下書きを作るGASのコード
- 毎朝自動で動かすトリガー設定と、運用の注意点
どこまで自動化するかを先に決める
お金に関わる作業は、間違えたときの影響が大きいものです。そこで、「機械に任せる部分」と「人がやる部分」を先に分けておきます。
| 作業 | 任せる相手 | 理由 |
|---|---|---|
| 期日が近い取引先を探す | GAS | 毎日同じ条件で確認するだけなので、機械のほうが確実 |
| リマインド文面の下書きを作る | GAS | 定型文に宛名と期日を入れるだけ |
| 下書きを確認して送信する | 人 | 状況に応じて一言添えるなど、判断が必要 |
| 入金を確認してステータスを更新する | 人 | お金の動きは自分の目で確かめる |
ポイントは、GASには「メールを送らせず、下書きを作らせる」ことです。万が一条件を間違えても、送信前に気づけます。
管理用のスプレッドシートを用意する
シート名を「請求管理」にして、1行目に次の見出しを作ります。
| 列 | 見出し | 入力例 |
|---|---|---|
| A | 宛名 | サンプル商事 担当者 |
| B | メール | [email protected] |
| C | 期日 | 2026/05/31 |
| D | ステータス | 未入金 / 入金済 |
| E | リマインド作成日 | (GASが自動で記入) |
C列は「日付」形式にしておきましょう。文字列のままだと、GAS側で日付として扱えません。
また、D列にプルダウン(データの入力規則)を設定しておくと、表記ゆれを防げます。
リマインドの下書きを作るGASのコード
スプレッドシートの「拡張機能」→「Apps Script」からエディタを開き、次のコードを貼り付けます。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
const SHEET_NAME = '請求管理';
const DAYS_BEFORE = 3; // 期日の何日前からリマインドするか
function createReminderDrafts() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const values = sheet.getDataRange().getValues();
const today = new Date();
today.setHours(0, 0, 0, 0);
// 1行目は見出しなので、2行目から確認する
for (let i = 1; i < values.length; i++) {
const [name, email, dueDate, status, remindedAt] = values[i];
// 未入金で、まだリマインドを作っていない行だけが対象
if (status !== '未入金' || remindedAt) continue;
if (!(dueDate instanceof Date) || !email) continue;
const due = new Date(dueDate);
due.setHours(0, 0, 0, 0);
const daysLeft = Math.round((due - today) / (1000 * 60 * 60 * 24));
// 期日まで DAYS_BEFORE 日より先なら、まだ何もしない(期日を過ぎたものは対象)
if (daysLeft > DAYS_BEFORE) continue;
const dueText = Utilities.formatDate(due, 'Asia/Tokyo', 'yyyy年M月d日');
const subject = `【ご確認】お支払い期日(${dueText})のご案内`;
const body = [
`${name} 様`,
'',
'いつもお世話になっております。',
`ご請求分のお支払い期日が ${dueText} となっておりますので、ご案内いたします。`,
'すでにお手続きいただいている場合は、行き違いのご連絡となりますことをご容赦ください。',
'',
'どうぞよろしくお願いいたします。',
].join('\n');
// 送信はせず、Gmailの下書きとして保存する
GmailApp.createDraft(email, subject, body);
// 同じ行で何度も下書きを作らないよう、作成日を記入する
sheet.getRange(i + 1, 5).setValue(new Date());
}
}コードのポイントは次の3つです。
- 対象を絞る:「未入金」かつ「リマインド作成日が空」の行だけを処理する
- 送信しない:
GmailApp.createDraftで下書きを作るだけにしている - 二重作成を防ぐ:作成した日をE列に記入し、次回からはスキップする
初回実行時には、スプレッドシートとGmailへのアクセス許可を求められます。内容を確認して許可してください。
毎朝自動で動かす
動作を確認できたら、毎朝自動で動くようにトリガーを設定します。次の関数を1回だけ実行してください。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
// 毎朝9時台に createReminderDrafts を実行するトリガーを作る(1回だけ実行)
function createDailyTrigger() {
ScriptApp.newTrigger('createReminderDrafts')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}これで、朝にGmailを開くと「今日確認すべきリマインド」が下書きにそろっている状態になります。あとは中身を確認して送るだけです。
時間主導型トリガーの考え方は、Gmailを自動整理する記事でも紹介しています。
GASでGmailを自動整理!ラベル付け&定期実行トリガーで受信箱をスッキリさせる方法
運用前のチェックリスト
もう一歩進めるなら
慣れてきたら、次のような拡張もできます。
- 期日を過ぎた行は、文面を変えて下書きを作る
- 下書きを作ったら、自分宛てに「今日の確認件数」をメモしておく
- 他のサービスとつなぐ場合は、n8nのイベント反応型のワークフローと組み合わせる
n8nで「何かが起きたら動く」仕組みを作る方法は、こちらで紹介しています。
n8nのトリガー設計|Webhookで始める「起きたら動く」自動化
まとめ
今回は、GASで支払い期日の確認とリマインドの下書き作成を自動化する方法を紹介しました。
- 「探す・下書きを作る」はGAS、「送る・入金を確認する」は人
- 送信ではなく下書きにすることで、安心して任せられる
- 作成日を記録して、同じ下書きを何度も作らない
次の一歩は、自分宛てのテスト行を1行だけ作って、下書きができるか試してみることです。GASの基礎から確認したい方は、こちらの学習マップもどうぞ。
※2026年10月追記:副業から自動化、収益化までの流れを地図にした記事と、自動化の道具の使い分けをまとめた記事を公開しました。