はじめに
今回は、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を発行
- 転送先にしたいGoogle Chat スペースで、上部の下矢印から、
アプリと統合
を選択
![](%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E7%B5%B1%E5%90%88.png)
![](webhook.png)
![](webhook%E7%99%BB%E9%8C%B2.png)
![](webhookurl.png)
GASで転送処理をデプロイ
- GAS で以下のコードをコピペ
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パラメータを返す必要があります。
- 上部のフロッピーディスクのアイコンをクリックして保存
- 右上の
デプロイ
→新しいデプロイ
を選択 -
種類の選択
→Webアプリ
を選択 -
説明
: 内容を記載(未入力でもOK)、次のユーザーとして実行
: 自分、アクセスできるユーザー
全員 を選択してデプロイクリック
![](deploy.png)
![](deployurl.png)
Slack App の作成
- https://api.slack.com/apps を開き、Create New App をクリック
- From scratch を選択
- アプリ名(なんでもいいです)を入力、アプリのインストール先のワークスペースを選択
- すると↓のページが表示されるので、各項目に以下のように設定
![](basicinfo.png)
![](events.png)
![](apphome.png)
テスト
- Slack のワークスペースにbotユーザーが追加されているので、任意のチャンネルに招待。
- てきとうなメッセージを送信
![](aaaslack.png)
![](aaa.png)
![](testslack.png)
![](test.png)
さいごに
転送先のスペースの分岐や、関係ないメッセージには反応しないようにする等、改善点はありますがひとまずうまくいってよかったです。
読んでいただきありがとうございます!