Incoming WebhookをつかってGASからSlackにメッセージを送信する方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの4日目の記事です。今年も完走目指して頑張るぞ！

# GASとSlackの連携
弊社は社内のコミュニケーションツールとしてSlackを使っているので、GASでなにかしたものをSlackに通知させたいっていうケースは多いはず。なので今日はIncoming WebhookをつかってGASからSlackへ通知を飛ばす方法を紹介します。

# 作るもの
GASを実行するとSlackに通知するようにします。

# 準備
## webhook URL の取得
今回はwebhookをつかうのでまずはじめにwebhook URLを取得しておきます。まず[このページ](https://w1686765412-ozb429293.slack.com/apps/A0F7XDUAZ--incoming-webhook-?tab=more_info)にアクセスしてください。
Incoming Webhookを「Slackに追加」します。

![スクリーンショット 2023-11-21 9.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/f60f4925-8f6f-bcc1-1e31-4373b7b723e6.png)

そして通知したいチャンネルを選択したあと、「Incoming Webhookインテグレーションの追加」を押します。

![スクリーンショット 2023-11-21 9.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/467923dd-fdda-24b3-06a3-b5184ccb74b5.png)


追加が完了するとこんな画面がでてくるのでWebhook URLを控えておきます。後ほどGASからこのURLに対してPOSTすることでSlackへのメッセージ配信を行います。

![スクリーンショット 2023-11-21 9.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/61c5bb17-0394-930c-4d37-d8b2be4c66c3.png)

# Webhook URLをスクリプトプロパティに登録する
スクリプトプロパティはキーバリュー型で文字列を保存できる機能で、主にコードにベタ書きしたくないパスワードやAPIキー等の管理に使います。

まずプロジェクトの設定をクリック。

![スクリーンショット 2023-11-24 20.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/0340adad-f3b6-a272-01fa-3fbfb18db47e.png)

スクリプトプロパティを追加を押すと追加画面が現れるので

![スクリーンショット 2023-11-24 20.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/a8342ee7-402f-426d-650e-0a0a11543302.png)

先程発行したWebhook URLをTEST_URLという名前で登録します。

![スクリーンショット 2023-11-24 20.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/b9d6dff3-038a-900f-a8ab-163b1bbb6743.png)

ここで設定した値はGASの中で以下のようにすることで呼び出すことが出来ます。

```javascript
const test = PropertiesService.getScriptProperties().getProperty("TEST_URL");
Logger.log(test); // 登録したWebhook URLが出力される
```

# GASを書いていく

```javascript
function myFunction() {
  const url = PropertiesService.getScriptProperties().getProperty("TEST_URL");
  
  const payload = {
      "text": "testです",
  };
 
  const options = {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : JSON.stringify(payload)
  };
 
  // HTTP リクエストでPOST送信
  UrlFetchApp.fetch(url, options);
}
```

これだけです。あれ？なにも説明することがないくらい簡単だ。
スクリプトプロパティに登録したURLを呼び出して、そこに対してoptionsをPOSTするだけ。これを実行すると無事にSlackにメッセージを送ることが出来ました。
![スクリーンショット 2023-11-24 20.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e5dddc04-1671-e01a-c2ee-e021fbc89a05.png)

せっかくなんでメンションくらいつけてみましょう。Incoming Webhookでは以下のようにしてメンションをつけることが出来ます。

```javascript
const here    = "<!here>"     // @hereのメンション
const channel = "<!channel>"  // @channelのメンション
const user    = "<@user_id>"  // @ユーザー名のメンション
```

user_idはここから取得することが出来ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/400ae6e9-8c8b-3c28-0e8a-8fc08d09074d.png" width="300">

先程送ったtextにチャンネルメンションを含めてみました。これを実行すると

```javascript
  const payload = {
      "text": "<!channel> testです",
  };
```

![スクリーンショット 2023-11-24 20.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/63d73ef5-3d7b-5e6c-1cee-b7b8e6b6ca74.png)

無事に@channelメンションがついたことが確認できます。

# 最後に
今回はIncoming WebhookをつかってSlackにメッセージを送信する方法についてまとめました。これまた思ったより簡単にできましたね！明日はワークフローを呼び出すかたちでSlackにメッセージを送信する方法についてまとめていきます。