GASで期限リマインド・未対応タスクを自動アラート|Google Chatとメールに通知

スポンサーリンク

タスクや案件をスプレッドシートで管理していると、「気づいたら期限を過ぎていた」「未対応のまま放置されていた」という事態が起きますよね。

毎日シートを開いてチェックすればよいのですが、件数が増えると見落としが必ず発生します。放置すれば対応漏れがクレームや納期遅延につながり、後始末のほうがずっと大変です。

この記事では、GAS(Google Apps Script)を使ってスプレッドシートの「期限が近い行」「未対応のまま放置された行」を自動検出し、Google Chat やメールに毎朝アラートを飛ばす仕組みを作ります。コピペで動くコード付きなので、シートに合わせて少し書き換えるだけで使えます。

この仕組みでできること

GAS とは、Google スプレッドシートやドキュメントを操作できる、Google 公式のプログラム実行環境のことです。Excel でいうマクロ(VBA)の Google 版だと考えると分かりやすいです。

今回作る仕組みのゴールはシンプルです。

  • スプレッドシートのタスク一覧を上から順にチェックする
  • 「期限が3日以内に迫っている」または「期限を過ぎているのに未対応」の行を見つける
  • 該当した行の内容を Google Chat やメールにまとめて通知する
  • これを毎朝決まった時刻に自動実行する
  • 一度通知した行は再通知しないよう「通知済み」フラグを立てる

つまり、自分でシートを見に行かなくても、対応が必要なタスクだけが毎朝手元に届く状態を作るわけです。タスク管理だけでなく、案件の進捗管理や、スプレッドシートから請求書PDFを自動作成する仕組みと組み合わせれば、請求の入金確認など「期限つきで状態を管理する一覧」ならほぼ同じ仕組みで応用できます。

GAS自体がはじめての方は、先に基本操作をおさえておくとスムーズです。スクリプトエディタの開き方や実行・承認の流れは、GASの始め方とすぐ使えるレシピ集で詳しく解説しています。

前提:スプレッドシートの準備

まずは通知対象になるシートを用意します。今回は次のような列構成を前提に進めます。

内容
Aタスク名請求書送付(A社)
B担当者田中
C期限2026-06-10
Dステータス未対応
E通知済みフラグ(空欄でOK)

ポイントは2つあります。

1行目は見出し行にして、2行目からデータを入れてください。コードは2行目以降を処理対象とします。

C列の「期限」は、必ず日付として入力してください。文字列の「6/10」ではなく、日付形式で入れるのがポイントです。セルを選択して右下に日付らしい表示が出ていればOKです。

E列の「通知済みフラグ」は、最初は空欄のままで構いません。GASが通知を送ったときに、自動で「通知済」と書き込みます。これによって、同じタスクを毎朝何度も通知してしまうのを防ぎます。

アラートを検出するコードを書く

それではメインのコードを作ります。ちょっと長く見えますが、やっていることは「上から順に行を見て、条件に合う行を集めて通知する」だけのシンプルな処理です。

スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、次のコードを貼り付けてください。

// ===== 設定(ここだけ環境に合わせて変更)=====
const SHEET_NAME = 'タスク一覧';   // 対象シート名
const DEADLINE_DAYS = 3;          // 期限まで何日以内を「期限間近」とするか
const STATUS_DONE = '完了';        // 完了とみなすステータス名

function checkDeadlineAndAlert() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  if (!sheet) {
    Logger.log('シートが見つかりません: ' + SHEET_NAME);
    return;
  }

  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // データなし

  // 2行目以降のA〜E列をまとめて取得
  const values = sheet.getRange(2, 1, lastRow - 1, 5).getValues();

  // 今日の0時を基準にする(時刻のズレで判定がブレないように)
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  const alerts = [];      // 通知メッセージの材料を貯める
  const flagUpdates = []; // 通知済みフラグを立てる行番号

  for (let i = 0; i < values.length; i++) {
    const [taskName, owner, deadline, status, notified] = values[i];
    const rowNumber = i + 2; // 実際のシート行番号

    // 完了済み・通知済み・期限が空の行はスキップ
    if (status === STATUS_DONE) continue;
    if (notified === '通知済') continue;
    if (!(deadline instanceof Date)) continue;

    // 期限を0時に揃えて、今日との差を「日数」で求める
    const dueDate = new Date(deadline);
    dueDate.setHours(0, 0, 0, 0);
    const diffDays = Math.round((dueDate - today) / (1000 * 60 * 60 * 24));

    let label = '';
    if (diffDays < 0) {
      label = '期限切れ(' + (-diffDays) + '日経過)';
    } else if (diffDays <= DEADLINE_DAYS) {
      label = '期限間近(あと' + diffDays + '日)';
    } else {
      continue; // まだ余裕があるのでスキップ
    }

    alerts.push('・' + taskName + '【' + owner + '】 ' + label + ' / 状態: ' + status);
    flagUpdates.push(rowNumber);
  }

  if (alerts.length === 0) {
    Logger.log('通知対象なし');
    return;
  }

  // 通知本文を組み立てる
  const message = '対応が必要なタスクが ' + alerts.length + ' 件あります。nn'
    + alerts.join('n');

  // 通知を送る(次の見出しで関数を用意します)
  sendChatNotification(message);
  // sendMailNotification(message); // メールで送りたい場合はこちらを使う

  // 通知できた行に「通知済」を書き込む
  flagUpdates.forEach(function(rowNumber) {
    sheet.getRange(rowNumber, 5).setValue('通知済');
  });

  Logger.log(alerts.length + ' 件を通知しました');
}

コードの上部にある「設定」エリアの3つの変数を、自分のシートに合わせて変えてください。

  • SHEET_NAME:通知したいシートの名前(タブの名前)に変更します
  • DEADLINE_DAYS:期限の何日前から通知するかです。「3」なら3日前から知らせます
  • STATUS_DONE:完了を表すステータス名です。シートで使っている言葉に合わせてください

判定のコツは、今日も期限も「0時」に揃えてから引き算している点です。こうしないと、時刻のわずかな差で「あと0日」と「あと1日」がブレてしまいます。setHours(0, 0, 0, 0) で時刻部分をリセットしているのが、地味ですが大事なポイントです。

Google Chatに通知する設定

検出したアラートを Google Chat に飛ばすには、Webhook(ウェブフック)という仕組みを使います。Webhook とは、特定の URL に文章を送ると、その内容が自動でチャットに投稿される仕組みのことです。

Webhook URLを取得する

通知を受け取りたい Google Chat のスペースを開きます。スペース名をクリックして「アプリと統合」を選び、「Webhook を管理」から新しい Webhook を追加します。名前(例:タスクアラート)を付けて保存すると、URL が発行されます。

この URL は外部に漏れると誰でも投稿できてしまうので、扱いには注意してください。

通知用の関数を追加する

取得した URL を使って、先ほどのコードに次の関数を追加します。

function sendChatNotification(message) {
  // 発行したWebhook URLに置き換える
  const webhookUrl = 'https://chat.googleapis.com/v1/spaces/XXXX/messages?key=...';

  const payload = { text: message };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(webhookUrl, options);
  Logger.log('Chat送信結果: ' + response.getResponseCode());
}

webhookUrl の部分を、先ほど発行した URL に書き換えてください。これで checkDeadlineAndAlert が実行されると、対象タスクがチャットにまとめて投稿されます。

メールで受け取りたい場合

Google Chat を使っていない場合は、Gmail への通知に切り替えられます。次の関数を追加し、メインコードのコメントアウトを切り替えてください。

function sendMailNotification(message) {
  const to = Session.getActiveUser().getEmail(); // 自分宛て
  const subject = '【タスクアラート】対応が必要なタスクがあります';

  GmailApp.sendEmail(to, subject, message);
  Logger.log('メールを送信しました: ' + to);
}

メインコードの sendChatNotification(message); をコメントアウトし、sendMailNotification(message); のコメントを外せば、メール通知に切り替わります。両方を有効にして、チャットとメールの両方に送ることもできます。

毎朝自動で実行する(時間主導トリガー)

ここまでで、手動で実行すれば通知が飛ぶ状態になりました。最後に「毎朝決まった時刻に勝手に動く」ように設定します。これに使うのが時間主導トリガーです。

トリガーとは、「決まった条件になったら自動でこの関数を動かす」という予約設定のことです。Apps Script エディタの左メニューにある時計のアイコン(トリガー)をクリックします。

右下の「トリガーを追加」を押し、次のように設定してください。

  1. 実行する関数:checkDeadlineAndAlert を選ぶ
  2. イベントのソース:「時間主導型」を選ぶ
  3. 時間ベースのトリガーのタイプ:「日付ベースのタイマー」を選ぶ
  4. 時刻:「午前8時〜9時」など、出社前後の時間帯を選ぶ

保存すれば完了です。これで毎朝、その時間帯に自動でシートがチェックされ、対応が必要なタスクだけが通知されるようになります。

トリガーの種類や、フォーム送信を起点に動かす方法など、もっと詳しい使い分けはGASのトリガーで集計・通知を自動化する方法で解説しています。あわせて読むと、自動化の幅が一気に広がります。

重複通知を防ぐ仕組みと注意点

今回のコードでは、通知した行の E 列に「通知済」と書き込むことで、翌日以降に同じタスクを何度も通知しないようにしています。

ただし、運用していると「一度通知したけれど、まだ対応していないタスクをもう一度知らせてほしい」という場面も出てきます。そのときは、考え方を切り替えて使い分けてください。

  • 1回だけ知らせれば十分なら:今回のコードのまま使う(通知済フラグで重複防止)
  • 対応するまで毎日しつこく知らせたいなら:if (notified === '通知済') continue; の行を削除する

毎日通知する運用にする場合は、フラグ書き込みの処理も不要になるので、合わせて外しておくと動作がすっきりします。

そのほか、運用前に確認しておきたい点をまとめます。

  • 期限のセルは必ず日付形式にする。文字列だと deadline instanceof Date の判定で弾かれ、通知されません
  • シート名・列の順番を変えた場合は、コード上部の設定や列番号も合わせて直す
  • Webhook URL やメールアドレスは外部に共有しない(不正利用を防ぐため)
  • 初回実行時は GAS の承認画面が出るので、内容を確認して許可する

まとめ

スプレッドシートの一覧から「期限が近い行」「未対応で放置された行」を自動検出し、Google Chat やメールに毎朝通知する仕組みを作りました。

ポイントを振り返ります。

  • 行を上から順にチェックし、期限と今日の差を「日数」で判定する
  • Webhook を使えば Google Chat に、GmailApp を使えばメールに通知できる
  • 時間主導トリガーで毎朝自動実行できる
  • 通知済みフラグで、同じタスクの重複通知を防げる

一度作ってしまえば、あとはシートを更新するだけで対応漏れを自動で拾ってくれます。タスク管理だけでなく、案件の進捗や入金チェックなど、期限つきで状態を管理する一覧ならそのまま応用できます。フォームと連携した自動化に興味があれば、GASでフォーム予約をGoogleカレンダーに自動登録する方法もあわせてどうぞ。まずは自分のシートに合わせてコードを書き換え、手動実行で動きを確かめてから、トリガーで自動化してみてください。

タイトルとURLをコピーしました