契約更新や提出物の期限を担当者へ個別に伝えている場合、伝え忘れによる遅延や対応漏れが起きやすくなります。
Google Apps Scriptで期限が近いタスクを自動でメール通知する仕組みを、送信条件の書き換え方と送信しすぎを防ぐ設計まで整理しています。
完成イメージと仕組み
完成すると、期限を書き込んだスプレッドシートを毎朝スクリプトがチェックし、指定した日数前に達したタスクの担当者だけへ自動でメールが届きます。
仕組みはシンプルで、シートの各行から期限日と担当者のメールアドレスを読み取り、今日の日付との差が設定した日数と一致した行だけメールを送信します。
送信が終わった行には通知済みの印を付けるため、翌日以降スクリプトを再実行しても同じ通知が重複して届くことはありません。
受信メールをスプレッドシートへ転記する仕組みと組み合わせれば、問い合わせから期限管理までを一続きで自動化できます。

手順
シートの準備からトリガー設定まで、4つのステップで完成します。
Step1. 期限リストのシートを準備する
新しいスプレッドシートを作成し、1行目に「期限日」「担当者名」「担当者メール」「タスク内容」「通知済み」の見出しを入れます。
2行目以降に、期限のあるタスクを1件1行で入力します。
続けてスプレッドシート上部のメニューから拡張機能を開き、Apps Scriptを選ぶとスクリプトエディタが立ち上がります。
Step2. コードを貼り付ける(コード全文)
スクリプトエディタに表示されているコードを全て消し、次のコードを貼り付けます。
function remindUpcomingDeadlines() {
const sheetName = '期限管理'; // ★ここを変える: 対象シート名
const reminderDaysBefore = 3; // ★ここを変える: 何日前に通知するか
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
throw new Error(`シート「${sheetName}」が見つかりません`);
}
const lastRow = sheet.getLastRow();
if (lastRow < 2) {
return;
}
const data = sheet.getRange(2, 1, lastRow - 1, 5).getValues();
const today = new Date();
today.setHours(0, 0, 0, 0);
data.forEach((row, index) => {
const [dueDate, assigneeName, assigneeEmail, taskName, notified] = row;
if (notified === '送信済み') {
return;
}
if (!(dueDate instanceof Date)) {
return;
}
const targetDate = new Date(dueDate);
targetDate.setHours(0, 0, 0, 0);
const diffDays = Math.round((targetDate - today) / (1000 * 60 * 60 * 24));
if (diffDays !== reminderDaysBefore) {
return;
}
const subject = `期限リマインド:${taskName}`;
const body = [
`${assigneeName}様`,
'',
`タスク「${taskName}」の期限が${reminderDaysBefore}日後に迫っています。`,
`期限日:${Utilities.formatDate(dueDate, 'JST', 'yyyy/MM/dd')}`,
'',
'対応をお願いします。',
].join('\n');
GmailApp.sendEmail(assigneeEmail, subject, body);
sheet.getRange(index + 2, 5).setValue('送信済み');
});
} data.forEach の中で行ごとに期限日と今日の日付の差を計算し、その差が reminderDaysBefore と一致した行だけメールを送信します。
最後の sheet.getRange(index + 2, 5).setValue('送信済み') が、通知済みの印を付ける部分です。
この印があるため、翌日以降に同じスクリプトを実行しても同じタスクへ二重に通知が届きません。
Step3. 送信条件を自分の業務に合わせる(書き換え表)
書き換える箇所は主に reminderDaysBefore の値と、通知タイミングの判定式です。
| 通知したいタイミング | 変更する箇所 | 設定例 |
|---|---|---|
| 期限の3日前に通知する | reminderDaysBefore | 3 |
| 期限当日の朝に通知する | reminderDaysBefore | 0 |
| 3日前と当日の2回に分けて通知する | diffDaysの判定式 | [3, 0].includes(diffDays) |
| 担当者以外にも通知先を増やす | GmailApp.sendEmailの宛先 | カンマ区切りで複数指定 |
複数日に分けて通知したい場合は、判定式を配列との照合に書き換えれば同じ行が複数回シートを通過してもタイミングごとに送信できます。
ただし1回送るごとに通知済みの印を上書きしてしまうと2回目が送れなくなるため、複数回通知したい場合は列を分けるなどの調整が必要です。
Step4. 時間トリガーを設定する
スクリプトエディタの左側にある時計マークの「トリガー」を開き、右下の「トリガーを追加」から設定します。
実行する関数にはremindUpcomingDeadlinesを選び、イベントのソースは時間主導型、種類は日付ベースのタイマーを選んで、毎日の実行時刻を指定します。
保存すれば、指定した時刻に期限チェックと通知が自動で繰り返される状態になります。
どの業務から自動化に着手すべきか迷う場合は、判断基準を別記事で整理しています。

送信しすぎを防ぐ条件設計
このスクリプトが通知を送りすぎないのは、日数の一致判定と通知済み列の2箇所が連動しているためです。
diffDays !== reminderDaysBefore の条件が、設定した日数からずれた日には送信そのものをスキップします。
そして送信が終わった直後に通知済み列へ印を付けることで、同じ行が翌日以降のチェックで再び送信対象にならない状態を作っています。
期限リストを毎回手作業で転記している場合、受信メールを自動転記する仕組みと組み合わせると管理表の更新まで自動化できます。
トリガーの実行回数を増やしても、この2箇所の仕組みがある限り同じタスクが重複して通知されることはありません。
逆に通知済み列への書き込みを削除してしまうと、実行のたびに同じタスクへ通知が届き続けるため、条件を調整するときはこの2箇所を残したまま変更してください。
ちなみに、期限日が土日祝と重なるケースをどう扱うかは業務によって判断が分かれます。
そのまま3日前ルールで送ってしまい担当者側で調整してもらう運用も、祝日リストと照合して前倒しする運用も、どちらも成立します。
Google Apps Scriptでの期限管理について相談してみませんか?
「どの日数前に通知すればちょうど良いか判断できない」「複数の担当者ごとに条件を分けたい」「社内にGoogle Apps Scriptを設計できる人材がいない」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 複数の担当者へ別々のリマインドを送れますか?
送れます。
シートの各行に担当者ごとのメールアドレスを入力しておけば、行単位で宛先を切り替えられるため担当者ごとに異なる内容を送れます。
チーム全体に同じ内容を送りたい場合は、Step3の表にある宛先の書き換え方を参考にカンマ区切りで複数指定してください。
Q. 通知済みの印は毎回手動でリセットする必要がありますか?
新しいタスクを追加する場合は「通知済み」列を空欄のまま入力すれば、リセット作業は不要です。
既存のタスクの期限日を変更して再通知したい場合だけ、その行の通知済み列を手動で空欄に戻してください。
Q. 期限日が土日と重なる場合の調整はできますか?
コード自体には土日を除外する処理は入っていません。
祝日や土日を避けて前倒し通知したい場合は、祝日リストとの照合処理を追加し、判定日を平日側にずらす分岐を組み込む必要があります。
Q. トリガーの実行時刻はいつに設定すればよいですか?
始業前に担当者が確認できるよう、平日の朝7時から8時台に設定している運用が多いです。
実行時刻の候補には幅を持たせられるため、日付ベースのタイマーで1時間程度の実行時間帯を指定して調整してください。