GASでスプレッドシートの更新をSlack通知する

GASSlack自動化
GASでスプレッドシートの更新をSlack通知するのサムネイル

GASでスプレッドシートの更新をSlack通知する

中小企業の経営者やフリーランスの皆さん、こんにちは。GASおじです。今回は「スプレッドシートの更新をSlackに通知する」仕組みを作る方法を解説するよ。業務の見える化とリアルタイム連携ができれば、コミュニケーションの効率アップにもつながる。さあ、さっそく始めよう。

なぜスプレッドシートの更新通知が必要か?

多くの中小企業やフリーランスは、売上や進捗、在庫などをGoogleスプレッドシートで管理しているよね。でも、更新したことをわざわざSlackで報告したり、わかるまで待ったりするのは時間のムダ。そこで、更新を検知して自動的にSlackに通知が飛ぶ仕組みがあれば、情報共有が格段にラクになる。

しかもGAS(Google Apps Script)なら追加の専用SaaS料金なしで、Googleアカウントの利用枠内で使える。もちろんquotaや実行上限はあるけど、うまく設計すれば十分実用的だ。

初期設定と必要な権限

  1. Slackで通知用のIncoming Webhookを作成する
    Slackのワークスペース管理者権限があれば、Webhook URLを発行可能。Slackの「App管理」から「Incoming Webhook」を追加し、通知したいチャンネルを指定しよう。

  2. Googleスプレッドシートを用意する
    更新を検知したいスプレッドシートを用意し、GASエディタを開く(メニュー「拡張機能」→「Apps Script」)。

  3. スクリプトの権限承認
    初回実行時にスプレッドシートの読み書きや外部URLへの接続権限を許可する必要がある。これはGoogleのOAuth認証なので安心してほしい。

  4. 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 = 'https://hooks.slack.com/services/xxxx/yyyy/zzzz'; // 自分の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おじラボで500ツール使い放題 →