タスクや案件をスプレッドシートで管理していると、「気づいたら期限を過ぎていた」「未対応のまま放置されていた」という事態が起きますよね。
毎日シートを開いてチェックすればよいのですが、件数が増えると見落としが必ず発生します。放置すれば対応漏れがクレームや納期遅延につながり、後始末のほうがずっと大変です。
この記事では、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 エディタの左メニューにある時計のアイコン(トリガー)をクリックします。
右下の「トリガーを追加」を押し、次のように設定してください。
- 実行する関数:
checkDeadlineAndAlertを選ぶ - イベントのソース:「時間主導型」を選ぶ
- 時間ベースのトリガーのタイプ:「日付ベースのタイマー」を選ぶ
- 時刻:「午前8時〜9時」など、出社前後の時間帯を選ぶ
保存すれば完了です。これで毎朝、その時間帯に自動でシートがチェックされ、対応が必要なタスクだけが通知されるようになります。
トリガーの種類や、フォーム送信を起点に動かす方法など、もっと詳しい使い分けはGASのトリガーで集計・通知を自動化する方法で解説しています。あわせて読むと、自動化の幅が一気に広がります。
重複通知を防ぐ仕組みと注意点
今回のコードでは、通知した行の E 列に「通知済」と書き込むことで、翌日以降に同じタスクを何度も通知しないようにしています。
ただし、運用していると「一度通知したけれど、まだ対応していないタスクをもう一度知らせてほしい」という場面も出てきます。そのときは、考え方を切り替えて使い分けてください。
- 1回だけ知らせれば十分なら:今回のコードのまま使う(通知済フラグで重複防止)
- 対応するまで毎日しつこく知らせたいなら:
if (notified === '通知済') continue;の行を削除する
毎日通知する運用にする場合は、フラグ書き込みの処理も不要になるので、合わせて外しておくと動作がすっきりします。
そのほか、運用前に確認しておきたい点をまとめます。
- 期限のセルは必ず日付形式にする。文字列だと
deadline instanceof Dateの判定で弾かれ、通知されません - シート名・列の順番を変えた場合は、コード上部の設定や列番号も合わせて直す
- Webhook URL やメールアドレスは外部に共有しない(不正利用を防ぐため)
- 初回実行時は GAS の承認画面が出るので、内容を確認して許可する
まとめ
スプレッドシートの一覧から「期限が近い行」「未対応で放置された行」を自動検出し、Google Chat やメールに毎朝通知する仕組みを作りました。
ポイントを振り返ります。
- 行を上から順にチェックし、期限と今日の差を「日数」で判定する
- Webhook を使えば Google Chat に、
GmailAppを使えばメールに通知できる - 時間主導トリガーで毎朝自動実行できる
- 通知済みフラグで、同じタスクの重複通知を防げる
一度作ってしまえば、あとはシートを更新するだけで対応漏れを自動で拾ってくれます。タスク管理だけでなく、案件の進捗や入金チェックなど、期限つきで状態を管理する一覧ならそのまま応用できます。フォームと連携した自動化に興味があれば、GASでフォーム予約をGoogleカレンダーに自動登録する方法もあわせてどうぞ。まずは自分のシートに合わせてコードを書き換え、手動実行で動きを確かめてから、トリガーで自動化してみてください。
