GAS入門 2025.12.18

GASでSlack通知を送る方法
【Webhook連携ガイド】

1. はじめに

「スプレッドシートが更新されたらSlackに通知したい」 「毎日の集計結果をSlackに自動投稿したい」 そんなニーズはありませんか?

GASとSlackのWebhook連携を使えば、様々な自動通知を簡単に実現できます。 この記事では、Webhookの設定から実践的な通知システムの構築まで、 ステップバイステップで解説します。

2. Slack Webhook URLの取得

まず、SlackのIncoming Webhookを設定して、Webhook URLを取得します。

Step 1: Slack Appの作成

Slack APIにアクセスし、「Create New App」をクリックします。 「From scratch」を選択し、アプリ名とワークスペースを指定します。

Step 2: Incoming Webhooksを有効化

左側メニューの「Incoming Webhooks」を選択し、トグルをONにします。

Step 3: Webhook URLを作成

「Add New Webhook to Workspace」をクリックし、 通知を送信するチャンネルを選択して「許可する」をクリックします。 表示されるWebhook URLをコピーして保存します。

⚠️ Webhook URLの取り扱い注意

Webhook URLは秘密情報です。GitHubなどに公開したり、 他人と共有したりしないでください。 URLが漏洩すると、第三者がチャンネルにメッセージを投稿できてしまいます。

3. 基本的な通知の送信

Webhook URLを取得したら、GASから通知を送ってみましょう。

function sendSlackNotification() {
  // Webhook URL(実際のURLに置き換えてください)
  const webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX';
  
  // 送信するメッセージ
  const message = {
    text: 'GASからのテスト通知です!'
  };
  
  // HTTPリクエストのオプション
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  };
  
  // 通知を送信
  UrlFetchApp.fetch(webhookUrl, options);
  
  console.log('Slack通知を送信しました');
}

このコードを実行すると、指定したSlackチャンネルにメッセージが投稿されます。

4. リッチな通知を送る

Slackでは、Block Kitを使ってリッチなメッセージを作成できます。 見出し、ボタン、区切り線などを含む、見やすい通知を作りましょう。

function sendRichSlackNotification() {
  const webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX';
  
  const message = {
    blocks: [
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: '📊 日次レポート',
          emoji: true
        }
      },
      {
        type: 'section',
        fields: [
          {
            type: 'mrkdwn',
            text: '*売上:*\n¥1,234,567'
          },
          {
            type: 'mrkdwn',
            text: '*件数:*\n45件'
          }
        ]
      },
      {
        type: 'divider'
      },
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: '詳細はをご確認ください。'
        }
      },
      {
        type: 'context',
        elements: [
          {
            type: 'mrkdwn',
            text: '🕐 ' + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm') + ' に自動送信'
          }
        ]
      }
    ]
  };
  
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  };
  
  UrlFetchApp.fetch(webhookUrl, options);
}

5. スプレッドシート更新通知の実装

スプレッドシートが更新された時に自動で通知を送る仕組みを作りましょう。 GASのトリガー機能を使います。

function onEdit(e) {
  // 編集されたセルの情報を取得
  const range = e.range;
  const sheet = range.getSheet();
  const sheetName = sheet.getName();
  const cell = range.getA1Notation();
  const oldValue = e.oldValue || '(空)';
  const newValue = e.value || '(空)';
  const user = Session.getActiveUser().getEmail();
  
  // 特定のシートのみ通知(例:「重要データ」シート)
  if (sheetName !== '重要データ') {
    return;
  }
  
  const webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX';
  
  const message = {
    blocks: [
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: '📝 スプレッドシートが更新されました',
          emoji: true
        }
      },
      {
        type: 'section',
        fields: [
          {
            type: 'mrkdwn',
            text: '*シート:*\n' + sheetName
          },
          {
            type: 'mrkdwn',
            text: '*セル:*\n' + cell
          },
          {
            type: 'mrkdwn',
            text: '*変更前:*\n' + oldValue
          },
          {
            type: 'mrkdwn',
            text: '*変更後:*\n' + newValue
          }
        ]
      },
      {
        type: 'context',
        elements: [
          {
            type: 'mrkdwn',
            text: '編集者: ' + user
          }
        ]
      }
    ]
  };
  
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  };
  
  UrlFetchApp.fetch(webhookUrl, options);
}

トリガーの設定

上記のonEdit関数が自動で実行されるように、トリガーを設定します。

  1. GASエディタで「トリガー」(時計アイコン)をクリック
  2. 「トリガーを追加」をクリック
  3. 実行する関数:onEditを選択
  4. イベントのソース:「スプレッドシートから」を選択
  5. イベントの種類:「編集時」を選択
  6. 「保存」をクリック

6. 定期通知の設定

毎朝9時に昨日の集計結果を通知する、といった定期通知も実現できます。

function sendDailySummary() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上データ');
  const lastRow = sheet.getLastRow();
  
  // 昨日の日付
  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const yesterdayStr = Utilities.formatDate(yesterday, 'JST', 'yyyy/MM/dd');
  
  // 集計処理(例:昨日の売上合計を計算)
  const data = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
  let totalSales = 0;
  let count = 0;
  
  data.forEach(row => {
    const date = Utilities.formatDate(new Date(row[0]), 'JST', 'yyyy/MM/dd');
    if (date === yesterdayStr) {
      totalSales += row[2];
      count++;
    }
  });
  
  const webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX';
  
  const message = {
    blocks: [
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: '📈 ' + yesterdayStr + ' の売上サマリー',
          emoji: true
        }
      },
      {
        type: 'section',
        fields: [
          {
            type: 'mrkdwn',
            text: '*売上合計:*\n¥' + totalSales.toLocaleString()
          },
          {
            type: 'mrkdwn',
            text: '*取引件数:*\n' + count + '件'
          }
        ]
      }
    ]
  };
  
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  };
  
  UrlFetchApp.fetch(webhookUrl, options);
}

// 毎朝9時に実行するトリガーを設定
function createDailyTrigger() {
  ScriptApp.newTrigger('sendDailySummary')
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .create();
}

7. 活用例

GASとSlack連携の活用例をいくつか紹介します。

  • フォーム回答通知:Googleフォームに回答があったらSlackに通知
  • 期限リマインダー:タスクの期限が近づいたらSlackでリマインド
  • 在庫アラート:在庫数が閾値を下回ったら通知
  • 日次/週次レポート:定期的にKPIをSlackに投稿
  • エラー通知:スクリプトでエラーが発生したら通知

GASとSlackの連携は、チームの情報共有を効率化する強力な手段です。 ぜひ、業務に合わせてカスタマイズして活用してください。

Seaside Lab

Seaside Lab

AIとWeb技術を活用したサービス開発を行っています。

ブログ一覧へ戻る