Google Apps ScriptでSlack通知を実装する完全ガイド【スプレッドシート連携】

Google Apps Script(GAS)を使えば、スプレッドシートの更新を自動的にSlackへ通知できます。プログラミング初心者でも30分程度で実装可能で、業務の見える化や情報共有の効率化に直結します。この記事では、Slack Webhook URLの取得から具体的なスクリプトの書き方、実務で使えるカスタマイズ方法まで、実際に運用している経験をもとに解説します。スプレッドシートに新しい行が追

google apps script slack 通知

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ステップです:

  1. SlackワークスペースでIncoming Webhook URLを発行
  2. Google Apps Scriptでスプレッドシートのトリガーを設定
  3. UrlFetchAppを使ってWebhook URLへデータを送信

この構造を理解しておくと、スプレッドシート以外のGoogleサービス(フォーム、カレンダーなど)からも同様の方法でSlack通知が実装できます。実際に私の場合、問い合わせフォームの回答を即座にSlackへ流す仕組みで、対応速度が平均2時間短縮されました。

Slack Webhook URLの取得手順

Neuro Dive|AI・データサイエンス就労移行支援

📌 Neuro Dive|AI・データサイエンス就労移行支援

AI・データサイエンスが学べる就労移行支援。Python・機械学習・統計を専門家から学んで AI 人材へ転身。完全無料・通所/オンライン両対応。

👉 公式サイトで無料申し込み

※当ブログはアフィリエイトプログラムにより収益を得ています

まずはSlack側で通知を受け取るための準備をします。

手順1: Slackアプリの作成

  1. Slack APIにアクセス
  2. 「Create New App」をクリック
  3. 「From scratch」を選択
  4. アプリ名(例:「スプレッドシート通知」)とワークスペースを指定

手順2: Incoming Webhookの有効化

  1. 左メニューから「Incoming Webhooks」を選択
  2. 右上のトグルを「On」に切り替え
  3. 下部の「Add New Webhook to Workspace」をクリック
  4. 通知を投稿したいチャンネルを選択(例:#general、#通知、#営業日報など)
  5. 「許可する」をクリック

手順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 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を使った業務自動化の具体例を多数紹介していますので、ぜひ関連記事も参考にしてください。

トラブルシューティングとよくある質問

実装中によく遭遇する問題と解決方法をまとめます。

通知が届かない場合のチェックリスト

  1. Webhook URLが正しいか確認:URLの最後の文字まで正確にコピーされているか確認
  2. スクリプトプロパティの設定確認:キー名のタイプミスがないか
  3. 実行ログの確認:エディタの「表示」→「ログ」でエラーメッセージを確認
  4. Slackアプリの権限確認:Webhook設定が有効になっているか
  5. トリガーの設定確認onEditが正しく動作しているか手動実行でテスト

文字化けする場合

日本語が文字化けする場合は、contentTypeの指定と文字エンコーディングを確認:

const options = {
  'method': 'post',
  'contentType': 'application/json; charset=UTF-8',
  'payload': JSON.stringify(message)
};

実行時間制限に注意

Google Apps Scriptには実行時間制限(無料版で6分)があります。大量の通知を送る場合は、バッチ処理や時間分散を検討してください。

onEditトリガーが動作しない

シンプルトリガーのonEdit(e)は外部サービスへのアクセスに制限がある場合があります。その場合はインストール可能なトリガーを手動設定します:

  1. エディタの「トリガー」アイコン(時計マーク)をクリック
  2. 「トリガーを追加」
  3. 実行する関数を選択、イベントソースを「スプレッドシートから」、イベントの種類を「編集時」に設定

実際に試したところ、インストール可能なトリガーに変更することで、認証周りの問題が解決するケースが多くありました。

まとめ

📚 関連記事

Google Apps ScriptとSlackの連携により、スプレッドシート更新の自動通知が簡単に実装できます。Incoming Webhook URLを取得し、UrlFetchApp.fetch()でHTTPリクエストを送信するだけのシンプルな仕組みですが、業務の透明性向上と情報共有の効率化に大きく貢献します。Block Kitを活用すれば視認性の高いリッチな通知も可能で、エラー処理や条件分岐を適切に実装することで、実務に耐える自動化システムが構築できます。

次のアクションステップ

  • まずはSlack Webhook URLを取得し、基本的な通知スクリプトを動作させてみる
  • 自社のスプレッドシート運用に合わせて、通知条件やメッセージ内容をカスタマイズする
  • Block Kitでリッチな通知デザインを試し、チームメンバーからフィードバックを得て改善する

Google Apps Scriptによる業務自動化は、一度仕組みを作れば継続的に効果を発揮します。小さく始めて、徐々に機能を拡張していくアプローチがおすすめです。

Read more

【作業時間65%減】Claude Coworkでライター副収入を1.5倍にする90日設計

【作業時間65%減】Claude Coworkでライター副収入を1.5倍にする90日設計

結論:Claude Coworkで副業ライターの作業時間は「最大65%短縮」できる 結論から言うと、2026年5月時点で副業Webライター・ブロガーが業務効率を最も改善できるツールはClaude Cowork(コウワーク)です。実測値ベースで、3,000文字SEO記事1本あたり90分→32分へ短縮、月間40本納品で月18万円→月32万円への収入アップが現実的な数字として見えています。 理由は3つあります。第一に、Cowork機能はファイル管理・タスク管理・MCP(Model Context Protocol)接続を一画面で扱えるため、リサーチ→構成→執筆→納品のすべてが同じ環境で完結します。第二に、Skill機能で「自分専用の執筆テンプレート」を呼び出せるため、毎回プロンプトを打ち直す手間が消えます。第三に、Cowork内のScheduled Tasksで「毎朝のキーワードリサーチ」「夜間の下書き生成」を完全自動化できるため、PC前にいない時間も収益が動きます。 この記事では、ライター歴3年・現役Cowork運用者の視点で、Cowork導入で月収を1.5倍にする実践フローを共有し

By tsuyoshi
【月5万】Claudeで始める副業7選|初心者が90日で稼ぐ手順

【月5万】Claudeで始める副業7選|初心者が90日で稼ぐ手順

結論:Claude副業は「月5万円」が現実的な最初の目標。3ヶ月で到達できる 結論から言うと、Claude(クロード)を使った副業は、まったくの初心者でも3ヶ月で月5万円、半年で月10万〜20万円が現実的な到達ラインです。理由は3つあります。 第一に、Claudeは日本語の長文生成・要約・コード生成のいずれにおいても2026年現在トップクラスの精度を持っており、1記事3,000文字のブログ記事を1時間以内に下書きできます。1時間あたり3,000〜5,000円の単価で受注すれば、平日2時間×20日で月20万円規模も射程に入ります。第二に、ChatGPTと比較してハルシネーション(誤情報生成)が少なく、企業案件で求められる「事実ベースの記事」が書きやすいため、クラウドソーシングで継続案件を獲得しやすい。第三に、Claude ProプランやAnthropic APIの料金は月20ドル〜と低コストで、初期投資をほぼゼロで始められます。 この記事では、初心者がClaudeで月5万円を最短で達成するための7つの仕事と、各仕事の具体的な始め方・単価相場・必要スキルを整理しました。読み終えた瞬間

By tsuyoshi