[GAS] スプレッドシートの編集をトリガーでSlackに通知する

Office

※ 本記事はアフィリエイト広告(Amazonアソシエイト)を含みます。

[GAS] スプレッドシートの編集をトリガーでSlackに通知する

スプレッドシートが更新されたら Slack に通知したい、という定番のやつを Google Apps Script(GAS) でやります。Slack の Incoming Webhook と、GAS の「編集トリガー」を組み合わせます。

1. Slack の Incoming Webhook を用意

Slack 側で Incoming Webhook を作成して、Webhook URL(https://hooks.slack.com/services/...)を取得します。手順は次のとおり。

  1. Slack API: Your Apps を開く
  2. Create New AppFrom scratch を選ぶ
  3. App 名(例: Sheet Notifier)と、通知を送りたいワークスペースを選んで作成
  4. 左メニューの Incoming Webhooks を開き、Activate Incoming Webhooks を On にする
  5. ページ下部の Add New Webhook to Workspace をクリック
  6. 通知先のチャンネルを選んで 許可する(Allow)
  7. 生成された 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