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関数が自動で実行されるように、トリガーを設定します。
- GASエディタで「トリガー」(時計アイコン)をクリック
- 「トリガーを追加」をクリック
- 実行する関数:
onEditを選択 - イベントのソース:「スプレッドシートから」を選択
- イベントの種類:「編集時」を選択
- 「保存」をクリック
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
AIとWeb技術を活用したサービス開発を行っています。