スプレッドシート×GASで複数クライアントの締切を3段階アラート化

「見落とし、なくなった。」案件の締切をGASで毎日チェックしSlackに自動通知する仕組みのアイキャッチ画像

結論:「案件一覧(同期)」シートの締切列をGASで毎日チェックし、3日前・1日前・当日の3段階でSlackに自動アラートを飛ばす仕組みを作りました。締切をうっかり忘れる不安がなくなりました。

この記事でわかること

  • 締切管理を誤った実際の失敗談
  • アラートの設計方針(何日前に、どう知らせるか)
  • GASでSlackアラートを飛ばす実装コード
  • 運用してみて調整した点

前回の記事で、月次の実績を自動でレポート化しました。今回は「振り返り」ではなく「今後の締切」に目を向けて、抜け漏れを防ぐ仕組みを作ります。

締切管理を誤った実際の失敗談

案件数が増えてくると、Notion側で締切を設定していても、開いて見ない限り気づけません。実際、先月は1件、締切の2日前まで着手していないことに気づかず、慌てて対応したことがありました。見れば分かる状態と、実際に気づける状態は別だと痛感しました。

アラートの設計方針

当日にアラートが来ても手遅れなことが多いので、今回は3段階で知らせる設計にしました。

  • 3日前:準備を始める合図
  • 1日前:最終確認の合図
  • 当日:念押し

対象は「案件一覧(同期)」シートのうち、ステータスが「完了」になっていない案件だけに絞っています。

GASでSlackアラートを飛ばす実装

function checkDeadlines() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('案件一覧(同期)');
  const data = sheet.getDataRange().getValues();
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  const alerts = [];

  data.slice(1).forEach(row => {
    const [name, status, amount, deadline] = row;
    if (!deadline || status === '完了') return;

    const deadlineDate = new Date(deadline);
    if (isNaN(deadlineDate.getTime())) return;
    deadlineDate.setHours(0, 0, 0, 0);

    const diffDays = Math.round((deadlineDate - today) / (1000 * 60 * 60 * 24));

    if (diffDays === 3 || diffDays === 1 || diffDays === 0) {
      alerts.push({ name, diffDays });
    }
  });

  if (alerts.length === 0) return;

  const message = alerts.map(a => {
    const label = a.diffDays === 0 ? '本日締切' : `あと${a.diffDays}日`;
    return `・${a.name}(${label})`;
  }).join('\n');

  postToSlack_(`締切アラート\n${message}`);
}

function postToSlack_(text) {
  const SLACK_WEBHOOK_URL = 'ここにSlackのIncoming Webhook URLを入れる';
  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({ text })
  });
}

トリガーは「時間主導型・日タイマー・午前9時」あたりに設定しています。

つまずいたポイント:Notion側の日付フォーマットのばらつきが原因で、締切列の値が正しく日付として認識されずInvalid Dateになるケースがありました。isNaN(deadlineDate.getTime())でチェックして、不正な値はスキップするようにして解決しました。

運用してみて調整した点

最初は当日だけの通知にしていましたが、それだと結局間に合わないことがあり、3日前・1日前・当日の3段階に変更しました。まだ運用し始めたばかりですが、少なくとも「気づいたら締切が過ぎていた」という事態は防げるようになりました。

よくある質問

土日も通知されますか?

はい、現状は毎日実行しているので土日も届きます。曜日を絞りたい場合は、コード側に曜日判定を追加するか、トリガーの設定を平日のみに変更することで対応できます。

複数の締切が同じ日に重なった場合はどうなりますか?

1回のSlackメッセージにまとめて表示されるので、通知が埋もれる心配はありません。

ステータスが「完了」の案件でも通知されますか?

完了ステータスの案件は除外する処理を入れているので、通知されません。

次回は、案件管理をNotion×スプレッドシートの使い分けで運用する話をまとめます。