GASでスプレッドシートの更新をSlack通知する
中小企業の経営者やフリーランスの皆さん、こんにちは。GASおじです。今回は「スプレッドシートの更新をSlackに通知する」仕組みを作る方法を解説するよ。業務の見える化とリアルタイム連携ができれば、コミュニケーションの効率アップにもつながる。さあ、さっそく始めよう。
■ なぜスプレッドシートの更新通知が必要か?
多くの中小企業やフリーランスは、売上や進捗、在庫などをGoogleスプレッドシートで管理しているよね。でも、更新したことをわざわざSlackで報告したり、わかるまで待ったりするのは時間のムダ。そこで、更新を検知して自動的にSlackに通知が飛ぶ仕組みがあれば、情報共有が格段にラクになる。
しかもGAS(Google Apps Script)なら追加の専用SaaS料金なしで、Googleアカウントの利用枠内で使える。もちろんquotaや実行上限はあるけど、うまく設計すれば十分実用的だ。
■ 初期設定と必要な権限
・Slackで通知用のIncoming Webhookを作成するSlackのワークスペース管理者権限があれば、Webhook URLを発行可能。Slackの「App管理」から「Incoming Webhook」を追加し、通知したいチャンネルを指定しよう。
・Googleスプレッドシートを用意する更新を検知したいスプレッドシートを用意し、GASエディタを開く(メニュー「拡張機能」→「Apps Script」)。
・スクリプトの権限承認初回実行時にスプレッドシートの読み書きや外部URLへの接続権限を許可する必要がある。これはGoogleのOAuth認証なので安心してほしい。
・Installable Trigger(インストール型トリガー)を設定する編集時にスクリプトを動かすため、スクリプトエディタの「編集」→「現在のプロジェクトのトリガー」から「onEdit」関数を編集トリガーに設定しよう。
■ 入力検証と既存データを上書きしない運用設計
スプレッドシートの更新を通知する際、既存データの削除や上書きは避けたいところ。そこでこのサンプルでは、更新があった内容を 新しい日時付きのシート にコピーし、そのデータをSlackに通知する方式を採用する。
また、入力内容のバリデーションも行い、不正なデータを通知しない工夫をしよう。例えば数値が負の値であればスキップするなどだ。
■ バッチ書き込みとバックアップ・ロールバックの考え方
GASのAPI呼び出しは1回ごとに実行時間やquotaが消費される。大量のデータを処理するときは、まとめて書き込む「batch write」が効率的。ここでは更新行をまとめて新規シートに書き込み、一度に処理を終わらせる。
また、バックアップとしては、通知用の新シートを残し続けることで過去の更新履歴を保持。何か問題があれば、該当シートごと削除やロールバックも手動で可能だ。
■ コスト削減のイメージ
仮に手動で更新通知をSlackに報告する作業が1件あたり2分かかるとしよう。おじさんが見積もる平均時給は2,500円。手動通知1件あたりのコスト=2,500円 ÷ 60分 × 2分 = 約83円これが自動化でゼロになると、通知100件で約8,300円の時間削減効果。もちろん環境や業務内容によるが、積み重なると大きな節約になるね。
□ 実際のコード例
下記のコードは編集時に変更行を抽出し、新規の日時付きシートへ書き込み、Slackに通知を送る例だ。既存データは変更しないので安心して使ってほしい。
const SLACK_WEBHOOK_URL = 'SLACK_WEBHOOK_URL_HERE'; // 自分のWebhookに差し替え
function onEdit(e) {
try {
const sheet = e.source.getActiveSheet();
const editedRange = e.range;
const editedRow = editedRange.getRow();
const editedValues = sheet.getRange(editedRow, 1, 1, sheet.getLastColumn()).getValues()[0];
// 入力検証:1列目が空欄なら通知しない(例)
if (!editedValues[0]) return;
// 例:数値列(3列目)が負なら通知しない
if (typeof editedValues[2] === 'number' && editedValues[2] < 0) return;
// 新規シート名に日時を付ける
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const newSheetName = `更新_${timestamp}`;
const ss = e.source;
const newSheet = ss.insertSheet(newSheetName);
// バッチ書き込み:変更行を丸ごと書き込む
newSheet.getRange(1, 1, 1, editedValues.length).setValues([editedValues]);
// Slack通知メッセージ作成
const message = `スプレッドシート「${sheet.getName()}」で行 ${editedRow} が更新されました。\n内容: ${editedValues.join(', ')}`;
// Slack通知送信
postToSlack(message);
} catch (error) {
Logger.log('エラー発生: ' + error);
}
}
function postToSlack(message) {
const payload = JSON.stringify({ text: message });
const options = {
method: 'post',
contentType: 'application/json',
payload: payload,
muteHttpExceptions: true
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}
□ 個人情報の取り扱いと復元手順
・スクリプトはユーザーのGoogleアカウント内で動作し、外部に個人情報を送ることはSlack通知以外にはない。
・Slackに送る内容は必要最低限に抑え、個人情報が含まれる場合は注意しよう。
・万が一誤ってデータを消してしまった場合でも、スプレッドシートのバージョン履歴で復元可能。
・通知用の新シートは削除しなければバックアップになるため、慌てて消さないこと。
□ まとめ:GASで手軽にSlack連携を実現しよう
今回のスクリプトは、Googleアカウントの利用枠内で動き、追加の専用SaaS料金は不要。ただしApps Scriptのquotaや実行上限はあるので、大量に頻発する更新には向かない場合もある。そこは運用で調整しよう。
削除APIは使わず、既存データを残しつつ通知を実現したので、安心して導入できるはずだ。初期設定や権限承認はやや手間だが、一度セットアップすれば長く使える便利ツールになるよ。
もっとGASで業務効率化したいなら、おじさんが500ツール以上を使い放題にしたメンバーシップもチェックしてみてくれ。
■ GASの相談や導入サポートを見たい方へ
この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。
■ 関連サービス
GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。