Google Apps ScriptでSlack通知を実装する完全ガイド【スプレッドシート連携】
Google Apps Script(GAS)を使えば、スプレッドシートの更新を自動的にSlackへ通知できます。プログラミング初心者でも30分程度で実装可能で、業務の見える化や情報共有の効率化に直結します。この記事では、Slack Webhook URLの取得から具体的なスクリプトの書き方、実務で使えるカスタマイズ方法まで、実際に運用している経験をもとに解説します。スプレッドシートに新しい行が追
Google Apps Script(GAS)を使えば、スプレッドシートの更新を自動的にSlackへ通知できます。プログラミング初心者でも30分程度で実装可能で、業務の見える化や情報共有の効率化に直結します。この記事では、Slack Webhook URLの取得から具体的なスクリプトの書き方、実務で使えるカスタマイズ方法まで、実際に運用している経験をもとに解説します。スプレッドシートに新しい行が追加されたら自動でSlackに投稿する、といった業務自動化が簡単に実現できます。
Google Apps ScriptとSlack連携の基本構造
Google Apps ScriptからSlackへ通知を送る仕組みは、Incoming Webhookという機能を利用します。これはSlackが提供するAPIの一種で、特定のURLに対してHTTPリクエストを送信するだけでメッセージを投稿できる非常にシンプルな方法です。
連携の流れは以下の3ステップです:
- SlackワークスペースでIncoming Webhook URLを発行
- Google Apps Scriptでスプレッドシートのトリガーを設定
- UrlFetchAppを使ってWebhook URLへデータを送信
この構造を理解しておくと、スプレッドシート以外のGoogleサービス(フォーム、カレンダーなど)からも同様の方法でSlack通知が実装できます。実際に私の場合、問い合わせフォームの回答を即座にSlackへ流す仕組みで、対応速度が平均2時間短縮されました。
Slack Webhook URLの取得手順
📌 Neuro Dive|AI・データサイエンス就労移行支援
AI・データサイエンスが学べる就労移行支援。Python・機械学習・統計を専門家から学んで AI 人材へ転身。完全無料・通所/オンライン両対応。
👉 公式サイトで無料申し込み※当ブログはアフィリエイトプログラムにより収益を得ています
まずはSlack側で通知を受け取るための準備をします。
手順1: Slackアプリの作成
- Slack APIにアクセス
- 「Create New App」をクリック
- 「From scratch」を選択
- アプリ名(例:「スプレッドシート通知」)とワークスペースを指定
手順2: Incoming Webhookの有効化
- 左メニューから「Incoming Webhooks」を選択
- 右上のトグルを「On」に切り替え
- 下部の「Add New Webhook to Workspace」をクリック
- 通知を投稿したいチャンネルを選択(例:#general、#通知、#営業日報など)
- 「許可する」をクリック
手順3: Webhook URLのコピー
画面に表示される「Webhook URL」をコピーします。このURLは https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXX のような形式で、これがSlackへメッセージを送信するための鍵になります。
このURLは第三者に知られるとあなたのチャンネルに自由に投稿できてしまうため、スクリプトプロパティなどで適切に管理する必要があります。
基本的なSlack通知スクリプトの実装
Google Appsスクリプトエディタを開き、以下の基本コードを実装します。
function sendSlackNotification() {
// Webhook URLを設定(実際のURLに置き換えてください)
const webhookUrl = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL';
// 送信するメッセージ
const message = {
'text': 'スプレッドシートが更新されました!'
};
// Slackへ送信
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
}
このスクリプトを保存して「実行」ボタンを押すと、指定したSlackチャンネルに通知が届きます。初回実行時は権限の承認が求められるので、画面の指示に従って承認してください。
Webhook URLの安全な管理方法
実務では、スクリプト内に直接URLを書くのではなく、スクリプトプロパティを使います:
function sendSlackNotification() {
// スクリプトプロパティから取得
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
const message = {
'text': 'スプレッドシートが更新されました!'
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
}
スクリプトプロパティの設定は、エディタの「プロジェクトの設定」→「スクリプトプロパティ」から「SLACK_WEBHOOK_URL」というキーで保存します。
スプレッドシート更新時の自動通知設定
スプレッドシートに変更があったときに自動でSlack通知を送るには、トリガーを設定します。
編集時トリガーの実装例
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
// 特定のシート名でのみ動作させる場合
if (sheet.getName() !== '営業日報') {
return;
}
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
// 編集された情報を整形
const editedRow = range.getRow();
const editedColumn = range.getColumn();
const editedValue = range.getValue();
const editor = Session.getActiveUser().getEmail();
const message = {
'text': `📝 スプレッドシートが更新されました\n` +
`シート: ${sheet.getName()}\n` +
`行: ${editedRow}、列: ${editedColumn}\n` +
`新しい値: ${editedValue}\n` +
`編集者: ${editor}`
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
}
onEdit(e)は特殊な関数名で、スプレッドシートが編集されると自動的に実行されます。追加の設定は不要ですが、シンプルなトリガーには制限があるため、外部サービスへのアクセスにはインストール可能なトリガーが必要な場合もあります。
新規行追加時のみ通知する例
実際に試したところ、すべての編集で通知が飛ぶと煩雑になるため、新規行追加時のみに限定する方が実用的でした:
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
const row = range.getRow();
// ヘッダー行(1行目)は除外
if (row === 1) return;
// A列(1列目)が編集された場合のみ通知
if (range.getColumn() === 1 && range.getValue() !== '') {
const rowData = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
sendNewRowNotification(rowData, row);
}
}
function sendNewRowNotification(rowData, rowNumber) {
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
const message = {
'text': `✨ 新しいデータが追加されました(${rowNumber}行目)\n` +
`内容: ${rowData.join(' | ')}`
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
}
リッチな通知デザインの実装方法
📌 DMM TOSSY|株・FX・暗号資産がアプリ 1 つで完結
DMM.com 証券のオールインワン投資アプリ。新NISA・株・FX・暗号資産を 1 つのアプリで管理。
👉 公式サイトで無料申し込み※当ブログはアフィリエイトプログラムにより収益を得ています
Slackの通知は、Block Kitという機能を使うことで見やすく装飾できます。特に複数の情報を伝える場合、視認性が大きく向上します。
基本的なBlock Kitの例
function sendRichNotification(data) {
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
const message = {
'blocks': [
{
'type': 'header',
'text': {
'type': 'plain_text',
'text': '📊 営業日報が更新されました'
}
},
{
'type': 'section',
'fields': [
{
'type': 'mrkdwn',
'text': `*担当者:*\n${data.name}`
},
{
'type': 'mrkdwn',
'text': `*日付:*\n${data.date}`
},
{
'type': 'mrkdwn',
'text': `*商談数:*\n${data.meetings}件`
},
{
'type': 'mrkdwn',
'text': `*売上:*\n¥${data.sales.toLocaleString()}`
}
]
},
{
'type': 'section',
'text': {
'type': 'mrkdwn',
'text': `*コメント:*\n${data.comment}`
}
},
{
'type': 'context',
'elements': [
{
'type': 'mrkdwn',
'text': `<${data.sheetUrl}|スプレッドシートを開く>`
}
]
}
]
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
}
色付きアタッチメントの利用
条件によって通知の色を変えることで、緊急度を視覚的に伝えられます:
function sendColoredNotification(status, message) {
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
// ステータスに応じた色設定
const colors = {
'success': '#36a64f', // 緑
'warning': '#ff9900', // オレンジ
'error': '#ff0000' // 赤
};
const payload = {
'attachments': [
{
'color': colors[status] || '#cccccc',
'title': 'スプレッドシート通知',
'text': message,
'footer': 'Google Apps Script',
'ts': Math.floor(Date.now() / 1000)
}
]
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload)
};
UrlFetchApp.fetch(webhookUrl, options);
}
私の場合、売上目標達成率によって通知の色を変える実装をしたところ、チーム内での状況把握が視覚的に分かりやすくなり、マネージャーからの評価も上がりました。
実務で役立つカスタマイズとエラー処理
実際の運用では、エラーハンドリングや条件分岐が重要になります。
エラー処理の実装
function sendSlackSafely(message) {
const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
if (!webhookUrl) {
Logger.log('Webhook URLが設定されていません');
return false;
}
try {
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify({ 'text': message }),
'muteHttpExceptions': true // HTTPエラーでも例外を投げない
};
const response = UrlFetchApp.fetch(webhookUrl, options);
const responseCode = response.getResponseCode();
if (responseCode !== 200) {
Logger.log(`Slack通知エラー: ${responseCode} - ${response.getContentText()}`);
return false;
}
return true;
} catch (error) {
Logger.log(`通知送信中にエラー: ${error.message}`);
return false;
}
}
条件付き通知の例
すべての更新で通知すると煩雑になるため、特定条件のみで送信する実装が実用的です:
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
const row = range.getRow();
const col = range.getColumn();
// 「ステータス」列(5列目)が「完了」に変更された場合のみ通知
if (col === 5 && range.getValue() === '完了') {
const rowData = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
const taskName = rowData[0];
const assignee = rowData[1];
const deadline = rowData[2];
const message = `✅ タスクが完了しました\n` +
`タスク名: ${taskName}\n` +
`担当者: ${assignee}\n` +
`期限: ${deadline}`;
sendSlackSafely(message);
}
}
複数チャンネルへの振り分け
プロジェクトや部署によって通知先を変える場合:
function sendToChannel(channelKey, message) {
const webhookUrls = {
'sales': PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_SALES'),
'dev': PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_DEV'),
'general': PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_GENERAL')
};
const webhookUrl = webhookUrls[channelKey];
if (!webhookUrl) {
Logger.log(`チャンネル ${channelKey} のWebhook URLが見つかりません`);
return;
}
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify({ 'text': message })
};
UrlFetchApp.fetch(webhookUrl, options);
}
// 使用例
function notifyByDepartment(department, message) {
sendToChannel(department, message);
}
automationjp.comでは、他にもGoogle Apps Scriptを使った業務自動化の具体例を多数紹介していますので、ぜひ関連記事も参考にしてください。
トラブルシューティングとよくある質問
実装中によく遭遇する問題と解決方法をまとめます。
通知が届かない場合のチェックリスト
- Webhook URLが正しいか確認:URLの最後の文字まで正確にコピーされているか確認
- スクリプトプロパティの設定確認:キー名のタイプミスがないか
- 実行ログの確認:エディタの「表示」→「ログ」でエラーメッセージを確認
- Slackアプリの権限確認:Webhook設定が有効になっているか
- トリガーの設定確認:
onEditが正しく動作しているか手動実行でテスト
文字化けする場合
日本語が文字化けする場合は、contentTypeの指定と文字エンコーディングを確認:
const options = {
'method': 'post',
'contentType': 'application/json; charset=UTF-8',
'payload': JSON.stringify(message)
};
実行時間制限に注意
Google Apps Scriptには実行時間制限(無料版で6分)があります。大量の通知を送る場合は、バッチ処理や時間分散を検討してください。
onEditトリガーが動作しない
シンプルトリガーのonEdit(e)は外部サービスへのアクセスに制限がある場合があります。その場合はインストール可能なトリガーを手動設定します:
- エディタの「トリガー」アイコン(時計マーク)をクリック
- 「トリガーを追加」
- 実行する関数を選択、イベントソースを「スプレッドシートから」、イベントの種類を「編集時」に設定
実際に試したところ、インストール可能なトリガーに変更することで、認証周りの問題が解決するケースが多くありました。
まとめ
📚 関連記事
Google Apps ScriptとSlackの連携により、スプレッドシート更新の自動通知が簡単に実装できます。Incoming Webhook URLを取得し、UrlFetchApp.fetch()でHTTPリクエストを送信するだけのシンプルな仕組みですが、業務の透明性向上と情報共有の効率化に大きく貢献します。Block Kitを活用すれば視認性の高いリッチな通知も可能で、エラー処理や条件分岐を適切に実装することで、実務に耐える自動化システムが構築できます。
次のアクションステップ
- まずはSlack Webhook URLを取得し、基本的な通知スクリプトを動作させてみる
- 自社のスプレッドシート運用に合わせて、通知条件やメッセージ内容をカスタマイズする
- Block Kitでリッチな通知デザインを試し、チームメンバーからフィードバックを得て改善する
Google Apps Scriptによる業務自動化は、一度仕組みを作れば継続的に効果を発揮します。小さく始めて、徐々に機能を拡張していくアプローチがおすすめです。