スプレッドシートの“変更”を見逃さない仕組みを作る
チームで共有している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を作成
- Slackで「App管理」→「カスタムアプリを作成」を選択
- 「Incoming Webhooks」を有効化
- 通知したいチャンネルを選び、Webhook URLを発行
- 発行されたURLをコピーしておく
これが、GASからSlackにメッセージを送るためのAPIエンドポイントになります。
GASの基本設定
- Googleスプレッドシートを開く
- メニューから「拡張機能 → Apps Script」を選択
- 新規プロジェクトを作成し、以下のスクリプトを貼り付けます
基本構成: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の管理画面で以下を設定します。
- 時計アイコン(トリガー)をクリック
- 「関数」:
checkDiffAndNotifyを選択 - 「イベントのソース」:時間主導型
- 「時間の種類」: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時代の自動化の基本設計といえるでしょう。

