案件管理シートを複数人で共有しているのに、更新に気づくのはシートを開いた人だけ、という状態になっていないでしょうか。
Slackを見ている時間の方が長いのに、更新確認のためだけにスプレッドシートを開きに行く。
この往復が積み重なると、地味に時間を取られます。
この記事では、Google Apps ScriptとSlackのIncoming Webhookを使い、特定の列が特定の値になったときだけSlackへ自動通知する仕組みを整理しています。
コードは全文をそのまま貼り付けて動く形で載せています。
完成イメージと仕組み
案件管理シートのステータス列を「完了」に変更すると、Slackの指定チャンネルに更新内容が自動投稿される動きを作ります。
仕組みは3段階です。
Slack側でIncoming Webhookを発行し、スクリプト側で編集を検知するトリガーを設定し、条件に合致した編集のときだけ通知データを送ります。
全編集を通知すると鳴りすぎて無視されるため、条件を絞るところまでを本命として作ります。
手順
Step1. SlackでWebhook URLを発行する
Slackの管理画面から「アプリを追加」でIncoming Webhookアプリを検索し、投稿先チャンネルを選んで追加します。
発行された https://hooks.slack.com/services/ から始まるURLをコピーしておきます。
このURLは知っている人なら誰でも該当チャンネルに投稿できる、パスワード同然の情報です。
シートのコメント欄や共有ドライブの説明文など、シート閲覧者の目に触れる場所には絶対に書かないでください。
Step2. コードを貼り付ける(コード全文)
対象のスプレッドシートで「拡張機能」から「Apps Script」を開き、以下のコードを全文貼り付けます。
WEBHOOK_URL にStep1で発行したURLを、TARGET_SHEET_NAME に監視したいシート名を入力してください。
function notifySlackOnEdit(e) {
const TARGET_SHEET_NAME = "案件管理";
const TARGET_COLUMN = 5; // E列: ステータス
const TARGET_VALUE = "完了";
const WEBHOOK_URL = "ここにWebhook URLを貼り付ける";
const sheet = e.range.getSheet();
if (sheet.getName() !== TARGET_SHEET_NAME) return;
if (e.range.getColumn() !== TARGET_COLUMN) return;
if (e.value !== TARGET_VALUE) return;
const row = e.range.getRow();
const rowData = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
const message = `【ステータス更新】${sheet.getName()}シートの${row}行目が「${TARGET_VALUE}」になりました\n内容: ${rowData.join(" / ")}`;
UrlFetchApp.fetch(WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify({ text: message }),
});
} 編集セルのシート名・列番号・値をまず確認し、条件に合わないときはそこで処理を止めます。
合致したときだけ編集行を丸ごと読み取り、メッセージを組み立てて送信します。
Step3. 通知する条件を絞る(特定列・特定値)
コード上部の3つの定数を書き換えるだけで、監視対象を変えられます。
列番号はA列を1として数えるため、E列を見たい場合は5です。
値の比較は完全一致なので、シート側のセルに余分な空白が入っていると条件に一致しません。
プルダウンで入力を固定しているシートであれば、この問題は起きにくいです。
なお、このコードはプルダウンで1セルずつ更新する運用を前提にしており、複数セルへの一括貼り付けでは編集値を取得できず通知されません。
3つの定数それぞれの役割と書き換え例を整理すると、次のようになります。
| 変える場所 | 意味 | 変更例 |
|---|---|---|
|
| 監視するシート名 |
|
|
| 監視する列番号 |
|
|
| 通知する値 |
|
Step4. トリガーを設定する
Apps Scriptエディタ左側の時計アイコンから「トリガー」を開き、「トリガーを追加」をクリックします。
実行する関数に notifySlackOnEdit を選び、イベントの種類を「スプレッドシートから」「編集時」にして保存します。
この登録が抜けていると、コードを貼っただけでは動きません。
関数名を onEdit にしても同様で、外部通信を伴う処理はインストーラブルトリガーとして明示的に登録する必要があります。
通知が鳴りすぎるときの調整
調整の方向は3つあります。
- 監視したい列が複数ある場合は、
TARGET_COLUMNを配列にしてincludesで判定する形に変えれば対応できます - シート自体を複数監視したい場合も、
TARGET_SHEET_NAMEを配列にして同じように判定します - チーム全体が同じチャンネルで鳴りすぎるようなら、Webhookをプロジェクトごとに分けて発行し、通知先チャンネルごと分離する方法もあります
ここまでで条件付き通知の仕組みは完成です。
Slack通知の前段として、そもそもどこから自動化に着手すべきかを整理したい場合は、こちらが参考になります。

スプレッドシートへの転記自体を自動化したい場合は、受信メールを転記する仕組みも近い構成で作れます。

営業案件の進捗管理に組み込んだ場合の想定効果は、こちらのモデルケースで試算しています。
シートの更新確認、まだ人力で回っていませんか?
「更新に気づかず対応が1日遅れた」「通知の仕組みを作りたいが手が回らない」「他にも自動化できそうな確認作業が眠っている」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、業務自動化に関するお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. Webhook URLが漏れた場合はどうすればいいですか?
Slackの管理画面から該当のWebhookを削除し、新しいURLを再発行してコードを書き換えてください。
削除した時点で古いURLは無効になります。
Q. 通知は編集した本人にも届きますか?
届きます。
Incoming Webhookは投稿先チャンネル単位の設定のため、本人にだけ黙って処理したい場合は分報(自分の作業実況用のチャンネル)など通知先自体を分ける必要があります。
Q. 複数のスプレッドシートをまとめて監視できますか?
このコードはシートに紐づくコンテナバインド型のスクリプトなので、シートごとにコピーして貼り付けるのが基本です。
案件が多い場合は、監視対象のシートを1つの管理シートに集約してから通知する設計の方が保守しやすくなります。