＃17　Google ChatにSlackのリマインダーを転送してみた

## はじめに

今回は、Slackに設定したリマインダーをGoogle Chat に転送する方法を紹介します。
Google Chat でいい感じのリマインダーアプリを探していたのですが、時刻を1分単位で指定できなかったり繰り返し設定がしづらかったりと、なかなかSlackのような使い勝手のいいリマインダーが見つからなかったため、いっそSlackのリマインダーを Google Chat に転送することにしました。

なお、本記事の方法にはGoogle Workspaceのご利用が必要です。

## 構成

Slack → GAS(Google Apps Script) → Google Chat

Slack Events API を使用して Slack 上のイベントを検知し、GAS経由でGoogle Chat に転送します。
今回は、Slack の bot ユーザーが参加したチャンネルでの投稿をすべて転送する設定にしています。
本当は  bot ユーザーへのDMに反応するようにしたかったのですが、Slack のリマインダーはbot相手のDMに対しては設定できなかったためこのような設定にしました。

## 実装

Google Chat, GAS, Slack の順で設定していきます。

### Google Chat の Webhook URLを発行

1. 転送先にしたいGoogle Chat スペースで、上部の下矢印から、`アプリと統合`を選択<br>
<img alt='' src='アプリと統合.png'>
2. `Webhook を管理` をクリック (Google Workspace のアカウントでないとボタンが押せません)<br>
<img alt='' src='webhook.png'>
3. 名前を入力(なんでもOK)、保存をクリック<br>
<img alt='' src='webhook登録.png'>
4. URLが発行されるのでコピー<br>
<img alt='' src='webhookurl.png'>

### GASで転送処理をデプロイ

1. GAS で以下のコードをコピペ
```javascript
function  doPost(e) { 

        const  params = JSON.parse(e.postData.getDataAsString());

        // 有効性チェック用
        if (params.type === "url_verification") {
        return  ContentService.createTextOutput(params.challenge);
        }

        // Google Chatに転送
        const  webhookurl = '{さっきコピーしたGoogle ChatのWebhook URL}';
        const  data = {
                'text': params.event.text
        };
        const  options = {
                'method': 'post',
                'headers' : {
                        'Content-Type': 'application/json; charset=UTF-8'
                },
                'payload': JSON.stringify(data)
        };
        UrlFetchApp.fetch(webhookurl, options);
}
```
* Slackからイベントが通知されたとき(POST通信を受け取ったとき)に自動的に「doPost」という関数が呼び出されるため、関数名を変更すると動かなくなります。
* Slackは、イベントが起きた時にまずダミーのリクエストをしてURLが有効かを検証します。有効であることを示すため、リクエスト内のchallengeパラメータを返す必要があります。

2. 上部のフロッピーディスクのアイコンをクリックして保存
3. 右上の`デプロイ`→`新しいデプロイ`を選択
4. `種類の選択`→`Webアプリ`を選択
5. `説明`: 内容を記載(未入力でもOK)、`次のユーザーとして実行`: 自分、`アクセスできるユーザー` 全員 を選択してデプロイクリック<br>
<img alt='' src='deploy.png'>
6. 完了するとURLが表示されるのでコピー<br>
<img alt='' src='deployurl.png'>

### Slack App の作成

1. https://api.slack.com/apps を開き、Create New App をクリック
2. From scratch を選択
3. アプリ名(なんでもいいです)を入力、アプリのインストール先のワークスペースを選択
4. すると↓のページが表示されるので、各項目に以下のように設定<br>
<img alt='' src='basicinfo.png'>
- Event Subscriptions
    - Enable: ON
    - Request URL: さっきコピーしたGASのデプロイURL
        - Subscribe to bot events → Add Bot User Event: `message.channels` を選択<br>
<img alt='' src='events.png'>
- App Home
        - App Display Name → Edit をクリック
                - Display Name: botの表示名。なんでもOK
                - Username: botの識別子。なんでもOK<br>
<img alt='' src='apphome.png'>
5. Install App → Install to Workspace をクリックして、ワークスペースにAppをインストール<br>

## テスト

1. Slack のワークスペースにbotユーザーが追加されているので、任意のチャンネルに招待。
2. てきとうなメッセージを送信<br>
<img alt='' src='aaaslack.png'>
3. Google Chat にメッセージが転送されました！<br>
<img alt='' src='aaa.png'>
4. 続いて、botが参加したチャンネル宛に、1分後のリマインダーを設定
`/remind #チャンネル名 テスト in 1 minutes`
<br>
<img alt='' src='testslack.png'>
5. 1分待つ
6. 狙い通り、Slack上のリマインダーが Google Chat にメッセージが転送されました！<br>
<img alt='' src='test.png'>


## さいごに

転送先のスペースの分岐や、関係ないメッセージには反応しないようにする等、改善点はありますがひとまずうまくいってよかったです。
読んでいただきありがとうございます！

## 参考

* https://blog.css-net.co.jp/entry/gas/chat-webhook
* https://zenn.dev/mokomoka/articles/6d281d27aa344e
* https://api.slack.com/apis/connections/events-api