はい。Google Apps Scriptでメール送信関数と月次トリガーを1回設定すれば、以後は自動で送信できます。この記事では、重複トリガーを防ぎ、送信前に残り宛先数も確認するコードを使います。
振込、請求、定期点検など、毎月忘れたくない作業を自分宛てのメールで知らせる仕組みです。Googleアカウントがあれば追加サービスなしで作れます。
最初は必ず自分宛てにテストしてください。
宛先、件名、本文が正しいことを確認してからトリガーを設定します。Apps Scriptの時間主導トリガーは、秒単位の定刻実行には向きません。
月次リマインダーの仕組み
今回作るスクリプトには、メールを送る関数と、その関数を毎月呼び出す設定用関数の2つがあります。
| 関数 | 役割 | 実行する回数 |
|---|---|---|
sendMonthlyReminder | 宛先、件名、本文を使ってメールを送る | 初回テストは手動、以後は自動 |
setupMonthlyTrigger | 月次トリガーを作り直す | 設定時に1回 |
指定時刻には実行幅がある
Google公式仕様では、時間主導トリガーの時刻は少しランダム化されます。たとえば9時を指定すると、通常は9時から10時の間に実行されます。nearMinute(0)を追加すると9時0分付近へ寄せられますが、それでも前後15分程度の幅があります。
厳密な締切直前ではなく、作業に余裕を持てる時刻へ設定してください。仕様はGoogle公式のインストール型トリガーとClockTriggerBuilderリファレンスで確認できます。
メール送信には日次上限がある
Apps Scriptのメール上限は送信通数ではなく宛先数で数えられます。現行の公式表では、個人向けGoogleアカウントが1日100宛先、Google Workspaceが1日1,500宛先です。上限は変更される場合があるため、記事のコードでは実行時の残り宛先数を確認します。
最新値はGoogle公式のApps Script割当量を確認してください。
Apps Scriptプロジェクトを作る
-
STEP1Apps Scriptを開く
リマインダーを送るGoogleアカウントへログインし、Apps Scriptのホームを開きます。「新しいプロジェクト」をクリックしてください。

-
STEP2プロジェクト名を付ける
エディタが開いたら、「無題のプロジェクト」をクリックし、「月次リマインダー」など用途が分かる名前へ変更します。

コードを貼り付けて内容を変更する
完成コード
Code.gsに最初から入っているコードを消し、次のコードへ置き換えます。コードブロック右上のボタンでコピーできます。
const recipientAddress = 'example@gmail.com';
const subjectText = '月末処理のリマインド';
const messageText = '振込と請求書の確認を行ってください。';
const monthDate = 28;
const startHour = 9;
const minuteMark = 0;
const timeZone = 'Asia/Tokyo';
function sendMonthlyReminder() {
const remainingRecipients = MailApp.getRemainingDailyQuota();
if (remainingRecipients < 1) {
throw new Error('本日のメール送信可能数が残っていません。');
}
MailApp.sendEmail(recipientAddress, subjectText, messageText);
}
function setupMonthlyTrigger() {
const handlerName = 'sendMonthlyReminder';
const triggerItems = ScriptApp.getProjectTriggers();
for (let pos = 0; pos < triggerItems.length; pos++) {
const item = triggerItems[pos];
if (item.getHandlerFunction() === handlerName) {
ScriptApp.deleteTrigger(item);
}
}
ScriptApp.newTrigger(handlerName)
.timeBased()
.onMonthDay(monthDate)
.atHour(startHour)
.nearMinute(minuteMark)
.inTimezone(timeZone)
.create();
}
変更する7項目
| 設定 | 入力内容 | 例 |
|---|---|---|
recipientAddress | 送り先のメールアドレス | 自分のGmail |
subjectText | メールの件名 | 月末処理のリマインド |
messageText | メール本文 | 振込と請求書を確認 |
monthDate | 毎月の日付 | 28 |
startHour | 開始する時間帯 | 9 |
minuteMark | 寄せたい分 | 0 |
timeZone | 基準のタイムゾーン | Asia/Tokyo |
日付は28日以前がおすすめです。
29日、30日、31日は存在しない月があります。「毎月末日」の実行が必要なら、日次トリガーで翌日が翌月か判定する別設計が必要です。
重複トリガーを防ぐ仕組み
setupMonthlyTriggerは、同じ送信関数を呼び出す既存トリガーを先に削除してから、新しいトリガーを1つ作ります。設定を変更して再実行しても、同じメールが複数回送られにくい構成です。
入力が終わったら保存します。プロジェクト名とコードが保存された状態を確認してください。

自分宛てにテスト送信する
送信関数を手動実行する
- 1上部の関数選択欄で
sendMonthlyReminderを選びます。 - 2「実行」をクリックします。
- 3初回だけ表示される承認画面で、使用するGoogleアカウントを選びます。
- 4表示された権限内容を確認し、自分で作ったプロジェクトであることを確かめて許可します。
- 5受信メールとGmailの送信済みトレイを確認します。

承認画面は表示内容を確認して進める
承認画面の文言や順番はGoogle側の変更で変わります。古い画面例のボタン位置を追うのではなく、プロジェクト名、利用アカウント、メール送信権限の内容を確認してください。
自分で作っていないスクリプトや、目的に合わない権限を要求するスクリプトは承認しません。詳細はGoogle公式の承認ガイドで確認できます。
月次トリガーを設定する
設定用関数を1回実行する
テストメールが正しく届いたら、関数選択欄を setupMonthlyTrigger に変更し、「実行」をクリックします。この関数はトリガーを設定するだけなので、実行した瞬間にリマインドメールは送信されません。
インストール型トリガーは、トリガーを作成したGoogleアカウントの権限で動きます。共同編集者がコードを変更しても、送信元と送信上限はトリガー作成者側が基準です。

トリガー画面で登録内容を確認する
左側の目覚まし時計アイコン「トリガー」を開き、sendMonthlyReminderの時間主導型トリガーが1件だけ表示されていることを確認します。

右側の編集ボタンから、イベントのソース、月の日付、時刻を確認できます。コード側で設定を変えた場合は、setupMonthlyTriggerをもう一度実行してください。

届かない・重複するときの確認
メールが届かない
宛先の入力、迷惑メール、Gmailの送信済みトレイを確認します。次にApps Script左側の「実行数」を開き、該当時刻の実行が「完了」か「失敗」かを確認してください。
インストール型トリガーの失敗は、その場の画面には表示されません。Google公式仕様では、失敗通知メールと実行履歴からエラーを確認します。
同じメールが複数届く
トリガー一覧に同じ送信関数が複数登録されていないか確認します。記事の設定用関数を再実行すると、同じ関数の既存トリガーを削除して1件へ作り直します。
設定した日や時刻に届かない
29日以降を指定している場合は、その日が存在しない月があります。また、時刻には実行幅があります。プロジェクト設定のタイムゾーンと、コードの Asia/Tokyo も確認してください。
送信上限のエラーになる
MailApp.getRemainingDailyQuota()は、その実行時点で送信できる残り宛先数を返します。上限が戻るまで待ち、複数アカウントへ分散して制限を回避する運用はしません。
MailApp公式リファレンスでは、残り宛先数の取得とメール送信メソッドを確認できます。
まとめ
- 送信関数を自分宛てに手動実行し、内容と権限を先に確認する
- 設定用関数を1回実行し、月次トリガーを1件だけ登録する
- 日付は28日以前にし、時刻には実行幅がある前提で設定する
- 届かないときは「実行数」と失敗通知メールを確認する
- 送信上限は宛先数で数え、実行時の残り宛先数を確認する



