GASでSlack通知を自動送信する方法

GASSlack自動化
GASでSlack通知を自動送信する方法のサムネイル

こんにちは、GASおじです。中小企業の経営者さんやフリーランスの皆さん、業務効率化に役立つGoogle Apps Script(以下GAS)を使ったSlack通知の自動送信、興味ありませんか?今回は「既存データを守りつつ」「コストを抑えつつ」「安全に」Slackへ通知を飛ばす方法をお伝えしますよ。

GASならGoogleアカウントの利用枠内で追加の専用SaaS料金なしで使えます。ただしApps Scriptのquotaや実行上限はあるのでご注意を。では早速、導入のポイントから解説しましょう。

Slack通知の初期設定と必要権限

まずはSlack側で「Incoming Webhook」を設定します。これでGASからSlackチャンネルに通知を送るためのURLを取得できます。

  1. Slackワークスペースの管理者画面で「アプリを追加」から「Incoming Webhooks」を検索・追加
  2. 通知したいチャンネルを指定してWebhook URLを発行
  3. 発行されたWebhook URLは後ほどGASのコードに使います

次にGAS側ですが、Googleスプレッドシートなどのファイルでスクリプトエディタを開き、以下の権限が必要です。

  • スプレッドシートの読み書き(通知内容やログ保存のため)
  • 外部URLへのアクセス(SlackのWebhook送信のため)

これらは初回実行時に認証画面が表示されますので、指示に従って許可してください。

また、個人情報や機密情報を含む通知は、Slackのチャンネル設定やWebhookの管理に十分気をつけましょう。ログも適宜バックアップしておくことをおすすめします。

コードのポイント:既存データを守りつつ新規ファイルに書き込む

おじさんが最も大事にしているのは「既存データの全消去や削除操作をしないこと」です。clearやdelete系のAPIは使わず、通知内容や履歴は新たに日時を含むシートやファイルに追記・作成します。

また、複数件まとめて処理するバッチ処理(batch write)と、エラー発生時に備えたバックアップ・ロールバックの仕組みも組み込みます。

以下は具体的なコード例です。Slack通知内容をスプレッドシートに日時付きの新規シートとして残しつつ、Webhookに送信します。

function sendSlackNotificationBatch() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
  const logSheetName = 'SlackLog_' + timestamp;
  
  // バックアップ用に新規シートを作成し通知内容を保存
  const logSheet = ss.insertSheet(logSheetName);
  logSheet.appendRow(['送信日時', '通知メッセージ', '送信結果']);
  
  // 送信する通知メッセージの例(複数件)
  const messages = [
    'おはようございます。今日も頑張りましょう!',
    '今週の売上が目標の80%に達しました。',
    '緊急連絡:サーバーメンテナンスのお知らせ'
  ];
  
  // Slack Incoming Webhook URL(実際にはプロパティサービスなどで管理推奨)
  const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
  if (!webhookUrl) {
    throw new Error('Slack Webhook URLが設定されていません。');
  }
  
  // 通知結果を格納する配列
  const results = [];
  
  // バッチ送信処理
  messages.forEach(msg => {
    try {
      const payload = JSON.stringify({ text: msg });
      const options = {
        method: 'post',
        contentType: 'application/json',
        payload: payload,
        muteHttpExceptions: true
      };
      const response = UrlFetchApp.fetch(webhookUrl, options);
      const code = response.getResponseCode();
      const success = (code >= 200 && code < 300);
      
      results.push([new Date(), msg, success ? '成功' : '失敗: ' + code]);
    } catch (e) {
      results.push([new Date(), msg, '例外エラー: ' + e.message]);
    }
  });
  
  // ログシートに送信結果を一括書き込み
  logSheet.getRange(2, 1, results.length, results[0].length).setValues(results);
}

このコードのポイントは、

  • insertSheetで新規シートを作成し、既存データは一切触りません
  • 送信内容の配列をループで回し、1件ずつSlackに送信
  • 送信結果をまとめてバッチ書き込み
  • Webhook URLはスクリプトプロパティで安全に管理
  • エラー時は例外キャッチしてログに記録

installable triggerで定期実行と復元手順

このスクリプトは手動実行も可能ですが、定期的に通知したいなら「installable trigger」を使うのが便利です。

  • スクリプトエディタの「時計アイコン」→「トリガーを追加」
  • 関数に sendSlackNotificationBatch を指定し、時間主導型トリガーをセット
  • 毎日や毎時間など好きな頻度を選択できます

トリガーの設定変更や削除は同じ画面で可能です。万が一トリガーが失敗した場合は、スクリプトエディタの「実行」→「ログ」や「エラー通知」で確認できます。

復元が必要になった際は、日時付きのログシートが残っているので、そちらから通知履歴の確認と再送信が可能です。常にバックアップを残しておくことで安心ですね。

コスト削減の仮定と計算式

おじさんがよく言うのは「クラウドSaaSの課金は積み重なるとバカにならない」ということ。今回のGAS+Slack連携は、

  • Slackは既存のワークスペース利用
  • GASはGoogleアカウントの利用枠内(無料枠)で実行
  • 追加の専用SaaS料金は一切かかりません

例えば、外部サービスで1通知あたり100円の課金があると仮定して、1日10通知を30日送ると、

100円 × 10通知 × 30日 = 30,000円/月

これがGASとSlackの組み合わせなら無料のGoogleアカウント枠内で実行できるので、月額約3万円のコスト削減効果が見込めます(あくまで仮定)。

ただしApps Scriptのquota(1日あたりの実行時間やURLFetchの回数制限など)はあるので大量通知には向かない点だけ念頭に置いてください。


通知自動化は業務効率アップだけでなく、人的ミスの減少や情報共有の迅速化にもつながります。ぜひ今回のコードをアレンジしながら活用してくださいね。

もっとGASでできることを増やしたい方は、GASおじラボで500ツール使い放題 →に参加してみてください。おじさんが厳選した便利ツールをたっぷりご提供しています!

それではまた。GASおじでした。