Slackでアンケートを実施しようと思った場合、Pollyなど便利なものもありますが素朴に絵文字でリアクションする多いと思います。
こんなときアンケート文章を書いた人が絵文字を1票ずつ用意することが私の周りではよく見かけられます。
しかしそうすると用意した人自身は投票に参加できない不便があると思い、文章中に絵文字があると1票ずつ投票して初期化をしてくれるbotを作りました。
使ったもの
・Google Apps Script (GAS)
・Outgoing WebHooks
・Bots
実装手順
Slack App
まずはSlack AppのBotsとOutgoing WebHooksを
https://washilabo.slack.com/apps
から検索し導入しましょう。
その後 https://[チーム名].slack.com/apps/manage/custom-integrations からそれぞれ設定します。
Bots
- API Token:
ここに表示されている文字列を後で作成するGASのソースコード中の 'XXXXXXXXXXXXXXXXXXXXXXXX'
部分にコピペします。
- Customize Name:
- Customize Icon:
- Full Name:
これらは、Slack上で表示されるものなので必要に応じて適宜設定しましょう。
このBotが絵文字に投票して初期化してくれます。
Outgoing WebHooks
- Channel: Anyとすることで全てのチャンネルを対象にできます。
- Trigger Word(s): このBotを利用するとき文章に含めるキーワード。ここでは仮に
:question
とします - URL(s): ここに後でGAS公開時に表示されるURLをコピペしましょう。
- Token: ここに表示されている文字列を後で作成するGASのソースコード中の
'YYYYYYYYYYYYYY'
部分にコピペします。
指定したChannelでTrigger Word(s)が含まれた文字列が入力されるとそのメッセージ情報がURL(s)先のGASにTokenと共に送信されます。
GAS
次に新しくGASファイルを作成しましょう。
詳しい説明は割愛しますがGoogle Driveのページから[新規]→[その他]から作成することができます。
作成したら以下のコードを貼り付けましょう。
function addReaction(channelId,timestamp, emoji) {
var url = 'https://slack.com/api/reactions.add';
var TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXX';// botsのTOKEN
UrlFetchApp.fetch(url, {
"method" : "post",
"payload" : {
token: TOKEN,
channel: channelId,
timestamp: timestamp,
name: emoji
}
});
}
// doPostが自動的に呼ばれます。eがSlackから送られてきたメッセージ情報になります。
function doPost(e) {
var WEBHOOKS_TOKEN = "YYYYYYYYYYYYYY";// Outgoing WebHooksのTOKEN
// URLさえわかるとこのスクリプトにアクセスできてしまうが
// このTOKENが一致するかどうかで自分のSlackからのアクセスか判断できる。
if (WEBHOOKS_TOKEN != e.parameter.token) {
return;
}
var channelId = e.parameter.channel_id;
var timestamp = e.parameter.timestamp;
var text = e.parameter.text.substr(1); // トリガー文字列を除去しておく
var reg = /\:["']?([a-zA-Z0-9_\-]+)["']?\:/g; // :XXXX: :YYY: などコロンで囲われた絵文字文字列を抽出する正規表現
while ((m = reg.exec(text)) != null) {
addReaction(channelId, timestamp, m[1]);
}
}
その後、[公開]→[ウェブアプリケーションとして公開]を選び、
[アプリケーションにアクセスできるユーザー]で[全員(匿名ユーザーを含む)] を選びます。
[導入]を押すと公開が完了し、URLが表示されます。
このURLをOutgoing WebHooksの設定のURL(s)にコピペして更新しましょう。
その後、Slack上の任意のチャンネルで
:question みなさん :one: :two: :three: のどれかに投票してください。
のように書いてみましょう。
数秒以内に導入したBotが
に投票して初期化してくれるはずです。