メインコンテンツへスキップ

Google Apps Script(GAS)から一人Slackへ定期Webhook通知する仕組みの構築

·2505 文字·5 分

はじめに
#

外部のAPIなどから定期的にデータを取得(Fetch)し、Slackへ自動で通知する仕組みは、開発環境のアラート運用などで非常に便利です。

今回は、 Google Apps Script(GAS) を使ってデータを取得し、Slack App(Incoming Webhook) 経由で通知する仕組みの構築手順をまとめます。

コードに認証情報を直書きしないための 「スクリプトプロパティ」 や、毎日全自動で動かすための 「トリガー」 の設定、さらに「一人Slack」で確実にスマホを鳴らすための 全体メンション(<!channel>)の仕様 など、記載します。


1. Slack側:Incoming Webhookの導入手順
#

Slackのデスクトップアプリから直接「Incoming Webhooks」を検索して、通知用URLを発行する手順です。

  1. SlackアプリのサイドバーからApp画面を開く Slackの左サイドバーにある 「その他」「ツール」「App」 の順にクリックします、

  2. Incoming Webhookを検索する 検索窓に Incoming Webhook と入力して検索します。

SlackにIncoming Webookを導入
  1. インストールしてアプリを開く 候補に出てくる「Incoming Webhook」の 「インストール」 ボタンを押し、切り替わった画面で 「アプリを開く」 > または設定 をクリックします。
SlackにIncoming Webookを導入(インストール)
SlackにIncoming Webookを導入し、ブラウザ遷移
  1. Slackへの追加とチャンネル選択 ブラウザが自動的に立ち上がるので、「Slackに追加」 ボタンをクリックします。

    SlackにIncoming Webookを導入(Slack追加)

    その後、GASからの通知を流したい自分のチャンネル(例:#general など)を選択します。

    SlackにIncoming Webookを導入(チャンネル追加)

  2. インテグレーションの追加とURLコピー 「Incoming Webhook インテグレーションの追加」 をクリックすると、設定画面に切り替わります。画面内に 「Webhook URL」 が表示されるので、これをコピーしておきます(GAS側で使用します)。


2. GAS側:シークレット変数の設定(スクリプトプロパティ)
#

発行されたWebhook URLをコード内に直接貼り付けると、コードを公開・共有した際に流出するリスクがあります。GASには、安全に環境変数を管理できる 「スクリプトプロパティ」 という機能があるため、こちらに登録を行います。

⚙️ 設定手順
#

  1. GASのエディタ画面を開きます。
  2. 左メニューにある 「プロジェクトの設定(歯車マーク)」 をクリック。
  3. 画面最下部までスクロールし、「スクリプトプロパティを編集」(または追加)をクリック。
  4. 以下の通りに入力し、「スクリプトプロパティを保存」 をクリックします。
    • プロパティSLACK_WEBHOOK_URL
    • :先ほどコピーしたSlackのWebhook URL

3. GAS側:実装コードサンプル
#

エディタの「コード.gs」に以下のコードを貼り付けます。データ取得部分はダミーのエンドポイントにしているため、実際の環境に合わせてパース処理などを調整してください。

function sendDataToSlack() {
  const targetUrl = "[https://api.example.com/data](https://api.example.com/data)";
  try {
    const response = UrlFetchApp.fetch(targetUrl);
    const json = JSON.parse(response.getContentText());

    // --- 一人Slack向けのシンプル通知設定 ---
    // 確実に通知を鳴らすために <!channel> を使用し、区切り線で装飾します。
    let messageText = `<!channel> データの定期取得が完了しました!\n\n`;
    messageText += `━━━━━━━━━━━━━━━━━━━━━━━━\n`;
    messageText += `📊 **取得結果**\n`;
    messageText += `• ステータス: ${json.status}\n`;
    messageText += `• 最新の値: ${json.value}\n`;
    messageText += `━━━━━━━━━━━━━━━━━━━━━━━━`;

    // 先ほど設定したスクリプトプロパティからWebhook URLを取得
    const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');

    if (!webhookUrl) {
      console.error("エラー: 'SLACK_WEBHOOK_URL' が設定されていません。");
      return;
    }

    // SlackへPOSTリクエストを送信
    const payload = { "text": messageText };
    const options = {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : JSON.stringify(payload)
    };

    UrlFetchApp.fetch(webhookUrl, options);

  } catch (e) {
    console.error("エラーが発生しました: " + e.toString());
  }
}

4. 🔥 ハマりポイント:Webhook経由の「@channel」は構文が違う
#

一人用のSlackチャンネルに通知を送る際、確実にスマホを鳴らすために全体メンション(@channel)を仕込むのが最も手軽ですが、ここに仕様上の罠があります。

コードの文字列内で、普通に @channel と記述してポストしても、Slack側では 「ただの文字列」として処理されてしまい、メンションとして機能しません。

💡 解決策
#

Webhook経由でSlackに特殊なメンションを認識させるには、以下のように 独自のタグ形式 で囲む必要があります。

  • 機能しない例: @channel データ取得完了
  • 機能する例: <!channel> データ取得完了

@ の代わりに <!channel>@here の場合は <!here>)と記述することで、Slack側が正しく解釈してプッシュ通知を飛ばしてくれるようになります。


5. トリガーを設定して全自動で実行する
#

コードのテスト実行が成功し、Slackに通知が届くことを確認できたら、最後に トリガー(定期実行機能) を設定して完全自動化します。

  1. GASエディタの左メニューにある 「トリガー(時計マーク)」 をクリック。

  2. 右下にある 「トリガーを追加」 ボタンをクリック。

  3. 以下のように設定を行います。

    • 実行する関数を選択sendDataToSlack
    • 実行するデプロイを選択Head
    • イベントのソースを選択時間主導型
    • 時間ベースのトリガーのタイプを選択日付ベースのタイマー
    • 時刻を選択午前7時〜8時 など、通知を受け取りたい時間帯を選択
  4. 右下の 「保存」 をクリックします。 ※初回保存時、Googleアカウントへのアクセス権限の承認を求められます。

    画面の指示に従って許可(詳細 > 安全ではないページに移動 > 許可)を出してください。

これで、PCを閉じていてもクラウド上でGASが自動実行され、指定した時間にSlackへ通知が届くようになります。


まとめ
#

複数人のチーム開発で <!channel> を多用すると通知ノイズになりますが、自分だけのアカウントでの「一人Slack」であれば、手軽にプッシュ通知をトリガーできるかと思います。

環境変数(スクリプトプロパティ)による安全なURL管理と、GASの強力なトリガー機能を組み合わせれば、さまざまな自動監視システムが構築できるので、ぜひ活用してみてください。

今回の構成程度でしたらGASもSlackも無料プランで使用可能です。

nakk
著者
nakk
ITとガジェット。個人的な振り返りや技術メモを中心に投稿しています。どなたかに少しでも役立てば嬉しいです。

関連ページ