Slackに投稿された内容をスプレッドシートに記録する

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

# 作るもの

今日はSlackで投稿された内容をスプレッドシートに記録していくサンプルを作ります。SlackのOutgoing Webhookを使い、Slackで発言があった際にAPIを叩くようにします。このAPIをGASで作ってその中でスプレッドシートへの記録を行います。

# 準備
まずはSlackにOutgoing Webhookをインストールします。

![スクリーンショット 2023-12-13 21.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/c2727655-0561-76c6-3df4-38d676d10b71.png)

アプリの設定画面から「Outgoing Webhook」を検索しアプリを「追加」します。

![スクリーンショット 2023-12-13 21.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e604f7df-db44-3de1-8bfe-6ba18412f8fa.png)

するとこんな画面が出てくるので「Slackに追加」を押します。

![スクリーンショット 2023-12-13 21.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/cbdc9bc8-c267-e2ba-cae9-11c1183934f3.png)

規約をよんで「Outgoing Webhookインテグレーションの追加」をクリック。

![スクリーンショット 2023-12-13 21.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/f1b3475f-a1f0-0255-95a6-bce2df32ad47.png)

そしてインテグレーションの設定をします。
チャンネルについてはどこでのチャンネルで発言があった場合にOutgoing Webhookが反応するようにするかを選択することができます。URLのところにはこのあとGAS側で発行するAPIのURLを入力します。トークンはGASの中で使っていくのでGAS側のスクリプトプロパティに登録しておきます。

![スクリーンショット 2023-12-13 21.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/a1a7ff04-220c-a728-28d8-3d57d1247b42.png)

今回は`OutgoingWebhookKey`という名前でトークンを登録しました。

# GASを書いていく

```javascript
function doPost(e) {
 // ここに処理をかく
}
```

この`doPost`関数はこのあとデプロイするWebアプリに対してPOSTリクエストが送られた時に実行される関数です。`Outgoing Webhook` からリクエストがPOSTで送られてくるので、ここに処理を書いていきます。

```javascript
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Slack');
```

今回は「Slack」という名前のシートにデータを蓄積していきます。

```javascript
    const outgoingWebhookKey = PropertiesService.getScriptProperties().getProperty('OutgoingWebhookKey');  

    if (outgoingWebhookKey == e.parameter.token){
      // ここに処理を書く
    }
```

ここでリクエストがSlackのOutcomingWebhookから送られてきたものかの検証をおこないます。設定画面で発行したトークンが一致するか否かで判定します。

```javascript
      var messageText = e.parameter.text;
      var userName = e.parameter.user_name
      sheet.appendRow([userName, messageText]); 
```

今回はA列に名前を、B列にメッセージの内容を記録します。それぞれ`parameter`から取得して`appendRow`によって書き込みます。
ここまででコードは出来上がりました。

そしてコードができたらデプロイしてAPIを立てていきます。

![スクリーンショット 2023-12-13 21.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/6dd4c2df-cc3c-0795-1b25-59a6d9da99d1.png)

「デプロイ」から「新しいデプロイ」をクリック。

![スクリーンショット 2023-12-13 22.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/9eb25a34-3d77-d13c-2a76-5ec7fbe9a7d8.png)

デプロイの種類は「ウェブアプリ」を選択します。

![スクリーンショット 2023-12-13 22.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/634ee918-d247-628d-4706-63ec24e7c3cc.png)

必要に応じて権限設定を行います。

![スクリーンショット 2023-12-13 22.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/efea0ff2-3624-270c-aa03-4a9de80ca254.png)

デプロイが完了するとこのような画面が出てきます。このURLの部分をコピーして先に記載したSlackのOutgoingWebhookの設定画面に登録します。

# 完成品がこちら

## GASのコード

```javascript
function doPost(e) {
    const outgoingWebhookKey = PropertiesService.getScriptProperties().getProperty('OutgoingWebhookKey');  
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Slack');

    if (outgoingWebhookKey == e.parameter.token){
      var messageText = e.parameter.text;
      var userName = e.parameter.user_name
      sheet.appendRow([userName, messageText]); 
    }

    return
}
```

## 実行結果
![スクリーンショット 2023-12-13 22.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/cb983220-6eb1-57a5-e1bf-a05bf53dc5b3.png)

ちゃんとSlackへ送った内容が記録されました！

# 最後に
今日はSlackに投稿された内容をGASを使ってスプレッドシートに転記する方法についてみていきました。が、実はこのOutcomingWebhookは現在非推奨になってるんですよね・・・。実装はとても簡単なので使い続けたいところですが。。