[GAS] スプレッドシートの編集をトリガーでSlackに通知する
Office※ 本記事はアフィリエイト広告(Amazonアソシエイト)を含みます。
スプレッドシートが更新されたら Slack に通知したい、という定番のやつを Google Apps Script(GAS) でやります。Slack の Incoming Webhook と、GAS の「編集トリガー」を組み合わせます。
1. Slack の Incoming Webhook を用意
Slack 側で Incoming Webhook を作成して、Webhook URL(https://hooks.slack.com/services/...)を取得します。手順は次のとおり。
- Slack API: Your Apps を開く
- Create New App → From scratch を選ぶ
- App 名(例:
Sheet Notifier)と、通知を送りたいワークスペースを選んで作成 - 左メニューの Incoming Webhooks を開き、Activate Incoming Webhooks を On にする
- ページ下部の Add New Webhook to Workspace をクリック
- 通知先のチャンネルを選んで 許可する(Allow)
- 生成された Webhook URL をコピー(これを GAS で使う)
Webhook URL はそれ自体が認証情報です。投稿できてしまうので、GitHub 等に直書きして公開しないよう注意(後述の通り Script Properties に入れるのがおすすめ)。
投稿先チャンネルを変えたいときは、5〜7 をもう一度やって別チャンネル用の URL を発行します。
2. 通知する GAS を書く
スプレッドシートの 拡張機能 > Apps Script でスクリプトを開き、編集時に呼ばれる関数を書きます。
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXX/YYY/ZZZ';
function onEditNotify(e) {
const sheet = e.range.getSheet();
const cell = e.range.getA1Notation();
const value = e.range.getValue();
const text =
`:pencil2: *${sheet.getName()}* が編集されました\n` +
`セル: \`${cell}\`\n` +
`値: ${value}`;
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text }),
});
}
e(イベントオブジェクト)から、編集されたシート名・セル・値が取れます。
3. トリガーを設定する
ここが要注意ポイント。UrlFetchApp のような外部リクエストを伴う処理は、シンプルトリガー(自動で呼ばれる onEdit)では権限不足で動きません。なので インストーラブルトリガーとして登録します。
Apps Script エディタの左メニュー トリガー(時計アイコン)> トリガーを追加 から:
- 実行する関数:
onEditNotify - イベントのソース: スプレッドシートから
- イベントの種類: 編集時
初回は権限の承認を求められるので許可します。
ハマりどころ・メモ
- シンプルトリガー(
onEdit)ではUrlFetchAppが使えない。必ずインストーラブルトリガーで登録する。これを知らずにハマりがち。 - 編集のたびに飛ぶので、うるさい場合は「特定シート・特定列だけ通知」など
if (sheet.getName() === '対象') {...}で絞る。 - Webhook URL はコードに直書きせず、
PropertiesService.getScriptProperties()に入れておくと、共有時に漏れにくい。
const SLACK_WEBHOOK_URL =
PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
編集トリガー × Webhook は応用が効くので、承認フローや在庫管理など色々使えます。
GoogleAppsScript, GoogleSpreadsheet, Slack