GASでシートの差分監視→Slackに自動通知する方法|変更検知とアラート設計ガイド

GASでスプレッドシートの変更を検知してSlackにアラート通知を送る自動化フローを表すイラスト。シートとSlackのアイコンを矢印でつないだデザイン。
目次

スプレッドシートの“変更”を見逃さない仕組みを作る

チームで共有しているGoogleスプレッドシート。
誰かが更新したり、データを上書きしたりするたびに「気づくのが遅れた」「ミスに気づかなかった」という経験はないでしょうか。

特に在宅勤務やリモート環境では、複数人が同時に作業することが増え、
「どこが、いつ、誰によって変更されたのか」を把握するのが難しくなります。

そこで役立つのが、GAS(Google Apps Script)で差分を自動監視し、Slackに通知を飛ばす仕組みです。
この方法を使えば、スプレッドシートの変更をリアルタイムに検知し、
重要な更新や削除があった場合に自動でSlackアラートを送ることができます。


手作業チェックでは限界がある

スプレッドシートには「バージョン履歴」機能がありますが、
実際にはそれをいちいち確認するのは手間がかかります。
さらに、複数のシートやブックを扱う場合、「どのデータが変わったのか」を見つけるのは現実的ではありません。

また、業務の現場では次のような課題が起こりがちです。

  • 毎日誰かが更新しているため、どの変更が重要かわからない
  • データの削除・上書きが誤って行われても、すぐに気づけない
  • メール通知だと埋もれてしまい、リアルタイムで見落とす

つまり、「シートの変化を自動で見張り、チームに即時共有する」仕組みが求められています。

Slackはリアルタイム通知に最適なツールですが、Googleスプレッドシートと直接連携する機能はありません。
そこで登場するのがGAS(Google Apps Script)による差分監視システムです。


GASを使えば差分検知と通知がすべて自動化できる

GAS(Google Apps Script)は、Googleの提供するスクリプト環境で、
スプレッドシートやドキュメント、Gmailなどを自動操作できる仕組みです。
JavaScriptライクな文法で動くため、プログラミング初心者でも扱いやすいのが特徴です。

この仕組みを使うことで、
「前回の状態」と「現在の状態」を比較し、差分があればSlackへメッセージを送る処理を完全自動化できます。


自動化の全体像をつかむ

まずは、GASで実現する流れを整理しておきましょう。

処理ステップ内容使用する仕組み
① データ取得スプレッドシートの全行を取得SpreadsheetApp.getActiveSpreadsheet()
② 差分判定前回データとの違いを比較JSON比較または配列比較
③ 差分保存最新データを保存PropertiesServiceまたは別シート
④ 通知送信Slackに差分内容をメッセージ送信Slack Webhook
⑤ 定期実行時間トリガーで自動実行ScriptApp.newTrigger()

この5ステップを組み合わせれば、
「毎日・毎時間、自動でスプレッドシートの変更を監視し、Slackに通知する」環境を構築できます。


Slack通知を組み合わせるメリット

メール通知よりもSlackが圧倒的に便利な理由は以下の通りです。

  • リアルタイム性:即座に変更内容を把握できる
  • チャンネル運用:部署・目的ごとに分けて通知できる
  • 履歴が残る:後から「いつ何が変更されたか」を確認可能
  • Botで拡張できる:AI要約や承認ワークフローとの連携も簡単

たとえば「売上管理シートの金額が変更されたとき」や
「顧客情報の削除が発生したとき」など、
業務に直結する重要な変化をSlackに即通知できるのは非常に強力です。


実装準備:Slack WebhookとGASの環境を整える

まず、Slack側とGAS側で事前準備をしておきます。

SlackでIncoming Webhookを作成

  1. Slackで「App管理」→「カスタムアプリを作成」を選択
  2. 「Incoming Webhooks」を有効化
  3. 通知したいチャンネルを選び、Webhook URLを発行
  4. 発行されたURLをコピーしておく

これが、GASからSlackにメッセージを送るためのAPIエンドポイントになります。

GASの基本設定

  1. Googleスプレッドシートを開く
  2. メニューから「拡張機能 → Apps Script」を選択
  3. 新規プロジェクトを作成し、以下のスクリプトを貼り付けます

基本構成:GASスクリプトのテンプレート

以下は、差分監視とSlack通知の基本スクリプトです。

const SHEET_NAME = "メインデータ"; // 監視対象シート名
const WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX"; // Slack Webhook URL
const PROP_KEY = "prevData"; // 前回データ保存キー

function checkDiffAndNotify() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const values = sheet.getDataRange().getValues();
  const newData = JSON.stringify(values);
  const props = PropertiesService.getScriptProperties();
  const oldData = props.getProperty(PROP_KEY);

  if (oldData && oldData !== newData) {
    const diff = getDiff(JSON.parse(oldData), values);
    sendToSlack(diff);
  }

  // 最新データを保存
  props.setProperty(PROP_KEY, newData);
}

// 差分を抽出する
function getDiff(oldArr, newArr) {
  let diffText = "";
  for (let i = 0; i < newArr.length; i++) {
    if (JSON.stringify(oldArr[i]) !== JSON.stringify(newArr[i])) {
      diffText += `行${i + 1}が変更されました:\n${JSON.stringify(newArr[i])}\n\n`;
    }
  }
  return diffText || "変更なし";
}

// Slackへ送信
function sendToSlack(message) {
  const payload = {
    text: `🟢 *スプレッドシート更新検知*\n${message}`
  };
  UrlFetchApp.fetch(WEBHOOK_URL, {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  });
}

このスクリプトを貼り付けて保存すれば、
あとは「時間トリガー」を設定するだけで自動実行できます。


時間トリガーで定期実行する

GASの管理画面で以下を設定します。

  1. 時計アイコン(トリガー)をクリック
  2. 「関数」:checkDiffAndNotify を選択
  3. 「イベントのソース」:時間主導型
  4. 「時間の種類」:1時間ごと/1日1回 など任意設定

この設定により、GASが定期的にシートを監視し、
差分が見つかった場合のみSlackへ通知を送るようになります。


差分検知の精度を高める工夫

実務で使う場合は、不要な変更(例:数式更新・空白行)まで通知すると煩雑になります。
以下のように条件を追加すると、精度が上がります。

  • 特定列だけ監視values.map(row => row[2]) などで列指定
  • ヘッダー行を除外for (let i = 1; i < newArr.length; i++)
  • 空白行スキップif (row.join("") === "") continue;

また、通知メッセージをSlackのリッチフォーマット(Block Kit)に変更すると、
見やすく・わかりやすいアラートが実現できます。

Slack通知を「見やすく・わかりやすく」するデザイン改善

GASから送るSlack通知は、シンプルなテキストでも機能しますが、
視認性を高めたい場合にはBlock Kit形式を利用すると便利です。
これは、Slackが提供するリッチメッセージ形式で、タイトル・色分け・区切りを使って構造的に通知を表示できます。

改良版:Slack通知コード

function sendToSlack(diffText) {
  const payload = {
    blocks: [
      {
        type: "header",
        text: { type: "plain_text", text: "📢 スプレッドシートの変更を検知しました!" }
      },
      {
        type: "section",
        text: {
          type: "mrkdwn",
          text: `*変更内容:*\n${diffText}`
        }
      },
      {
        type: "context",
        elements: [
          { type: "mrkdwn", text: `実行時刻:${new Date().toLocaleString("ja-JP")}` }
        ]
      }
    ]
  };

  UrlFetchApp.fetch(WEBHOOK_URL, {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  });
}

このように書き換えると、Slackの通知が以下のように整います。

  • 太字や絵文字を使って重要な変更を目立たせる
  • 実行時刻を表示し、いつ変更が起きたのかを明示
  • チャンネル内で複数通知があっても、見やすく整理

見た目を工夫するだけで、アラートとしての信頼性が格段に上がります。


差分を記録しておく「変更履歴シート」の作成

Slack通知だけでは、後から過去の変更内容を追うのが難しくなります。
そこで、スプレッドシート内に「履歴シート」を作り、すべての変更をログとして保存しておくのがおすすめです。

ログ保存のサンプルコード

function saveChangeLog(diffText) {
  const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("変更履歴");
  if (!logSheet) {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet("変更履歴");
  }
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("変更履歴");
  sheet.appendRow([new Date(), diffText]);
}

上記をcheckDiffAndNotify()内に組み込むことで、
Slack通知を送るたびに「変更履歴」シートへログが追記されます。

日時変更内容
2025/05/15 10:00行3の顧客名が「田中」→「佐藤」に変更
2025/05/15 14:00行7が削除されました

このように履歴を残すことで、後から原因分析や修正確認が簡単になります。
監査ログ的にも有効で、チーム内のトラブル防止につながります。


応用①:承認フローやAI連携への発展

GASによる差分監視の仕組みは、Slack通知にとどまらず、さまざまな業務フローに発展させることが可能です。

🔹 承認フロー連携

変更内容を検知した際に、Slackで「承認ボタン」を表示させ、
承認結果を再びシートに反映する構成も実現できます。

  • GAS → Slackへ変更通知+ボタン送信
  • 承認ボタン押下 → SlackのWebhookがGASに返信
  • GAS → シートに「承認済み」や「差戻し」を反映

これにより、Slack上で完結するワークフローが構築できます。


🔹 ChatGPT APIを使ったAI要約連携

差分の内容が長くなる場合、Slack通知に全文を載せると読みにくくなります。
その場合はOpenAI API(ChatGPT)を活用して、変更内容を自動で要約して通知する方法もおすすめです。

function summarizeWithAI(diffText) {
  const API_KEY = "sk-xxxx"; // OpenAI APIキー
  const url = "https://api.openai.com/v1/chat/completions";
  const payload = {
    model: "gpt-4o-mini",
    messages: [
      { role: "system", content: "以下の変更内容を簡潔に要約してください。" },
      { role: "user", content: diffText }
    ]
  };

  const response = UrlFetchApp.fetch(url, {
    method: "post",
    headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` },
    payload: JSON.stringify(payload)
  });

  const json = JSON.parse(response.getContentText());
  return json.choices[0].message.content.trim();
}

この関数をSlack通知前に呼び出すことで、
AIが要約した読みやすいメッセージをSlackに投稿できます。

例)
🟢 スプレッドシート更新検知
「顧客Aのステータスが「契約中」→「解約済み」に変更されました。」


応用②:複数シートをまとめて監視する

大規模な管理表では、複数のシートを監視対象にしたい場合もあります。
この場合、以下のようにループ処理で複数シートを一括監視できます。

const TARGET_SHEETS = ["顧客管理", "売上データ", "契約一覧"];

function monitorMultipleSheets() {
  TARGET_SHEETS.forEach(name => {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
    if (sheet) {
      checkDiffAndNotifyForSheet(sheet, name);
    }
  });
}

function checkDiffAndNotifyForSheet(sheet, name) {
  const values = sheet.getDataRange().getValues();
  const props = PropertiesService.getScriptProperties();
  const key = `prev_${name}`;
  const oldData = props.getProperty(key);
  const newData = JSON.stringify(values);

  if (oldData && oldData !== newData) {
    const diff = getDiff(JSON.parse(oldData), values);
    sendToSlack(`【${name}】\n${diff}`);
  }
  props.setProperty(key, newData);
}

これで、1つのGASスクリプトで複数のデータ監視を自動化できます。
顧客・契約・請求など、異なる業務領域を一括でモニタリング可能です。


導入の実践手順まとめ

最後に、この記事全体の流れを手順として整理します。

手順内容使用ツール
Slack Webhook URLを発行Slack
GASプロジェクトを新規作成Googleスプレッドシート
差分比較スクリプトを貼り付けApps Script
Slack通知コードを組み込みBlock Kit形式推奨
トリガーで定期実行設定1時間ごとなど
通知・ログ動作を確認Slack/履歴シート
必要に応じてAI要約や承認連携を追加OpenAI APIなど

これらを一度構築しておけば、
シートの更新を完全に自動監視し、Slackでチーム全体に共有する「止まらない監視体制」が整います。
特にデータ改ざん防止や情報漏洩対策としても、有効な仕組みです。


今後の拡張アイデア

  • 差分ごとに担当者へDM送信(SlackユーザーIDをマッピング)
  • Google ChatやDiscordにも多重通知
  • 変更箇所を自動で色付け(シート側に視覚反映)
  • MakeやZapierと連携して、通知後に他アプリをトリガー

GASの可能性は無限大です。
今回紹介した「差分検知+通知」はその第一歩にすぎません。


まとめ:シート監視×Slack通知でチームの信頼性を高める

Googleスプレッドシートの変更を自動監視してSlackに通知する仕組みを導入することで、
チームの情報共有スピードと信頼性が大幅に向上します。

項目効果
差分検知更新・削除を即検知
Slack通知チーム全体への即時共有
ログ保存変更履歴の可視化
拡張連携AI・承認フロー・多重通知など

“人が気づかなくてもシステムが見張る”状態をつくることが、
これからのAI時代の自動化の基本設計といえるでしょう。

目次