はじめに
どーもばるすです。 ごぶさたしてますね。お元気ですか? 僕は元気にやっています。
突然ですが
Slackのゲストにまとめて連絡したいとき、どうしてます? シングルチャンネルゲストだけにとか、マルチチャンネルゲストだけにとか、ゲスト全員とか、まとめて連絡したい時ってあると思うんです。
各ゲストが参加しているチャンネルでそれぞれ連絡する? ゲストを検索してリストにしてDM送る? SlackのAPIでユーザーの一覧出してメールで連絡?
これ、けっこう面倒だと思うんすよ。
定型文を打ったら一発で連絡できる何かそういうのあったら便利だと思いません?
これを解決する機能を作成してみたのでご紹介します。 もちろんWorkatoです。
GASやAWSLambdaでも実装できますが、Workatoが簡単すぎるので今回は省略しました。 気になる方はお問い合わせください。
動作イメージ
こんな感じで動くやつです。 もちろん、コマンドを発行できるチャンネルやユーザを限定できます。
使い方
- ユーザーがスラッシュコマンドで起動
- モーダルウィンドウが立ち上がるので入力する
- 対象ゲストにDMが飛ぶ
- 完了
各処理のロジックについて
ざっくり書くとこうです。
- スラッシュコマンドでSlackBot呼び出し
- SlackBot→Workatoへリクエスト送信
- InteractiveMessageを用いてモーダルウィンドウを表示
- ユーザーが入力→送信
- Workatoレシピ起動
- 入力された値をCallableレシピへ引数として渡して起動
- Slackユーザーリストを取得
- 通常メンバー,マルチチャンネルゲスト,シングルチャンネルゲストのリストを作成
- モーダルで入力された値で分岐し、対象ユーザーへDMを送信
- 完了
Workatoのレシピ構造は
管理しやすさと使い回しの可能性を考慮してレシピを2つに分けていますが、1つでもできます。
レシピ1:トリガー&ハンドラーの役割
スラッシュコマンドで起動→入力用モーダルを表示 入力を受け付けたのち、レシピ2を起動して値を渡す
レシピ2:ヘルパーの役割
- ユーザーリストを取得する
- メンバー/シングルチャンネルゲスト/マルチチャンネルゲスト別のリストを作成
- 入力された値で対象にDMを送る
レシピの作り方
1. (Slack)SlackBotを追加する
- Interactivity & Shortcutsを有効化RequestURL:https://www.workato.com/slack_webhooks/actions?coak_id=<CustomAuthProfileのid>
- Options Load URL:https://www.workato.com/slack_webhooks/data_source?coak_id=<CustomAuthProfileのid>
スラッシュコマンドを有効化(後行程で対応する)
- URLはWorkatoレシピのトリガーに表示されるURLを利用
OAuth & Permissionsを追加
- im:write
- users:read
- commands
- users:read.email
2. 起動用レシピを作成
- トリガーを「Workbot for Slack」で設定
- 起動Wordを設定
- Slackから受信するリクエストのJsonを追加する
※設定するJson
[ { "control_type": "text", "label": "Parameters string", "name": "parameters_string", "type": "string", "optional": true }, { "control_type": "text", "label": "Command part", "name": "command_part", "type": "string", "optional": true }, { "control_type": "text", "label": "Type", "name": "type", "type": "string", "optional": true }, { "control_type": "text", "label": "Bot command ID", "parse_output": "float_conversion", "name": "bot_command_id", "type": "number", "optional": true }, { "name": "Context", "type": "array", "of": "object", "label": "Context", "optional": true, "properties": [] }, { "control_type": "text", "label": "Usertype", "name": "user_type", "type": "string", "optional": true }, { "control_type": "text", "label": "Notifybody", "name": "notify_body", "type": "string", "optional": true }, { "control_type": "text", "label": "Text", "name": "text", "type": "string", "optional": true, "prompt": "false" } ] ※ user_type,notify_bodyは後述の行程で設定します。
- スラッシュコマンドを設定
3. モーダルウィンドウを表示するアクションを設定
- アクション追加 → Workbot for Slackを選択
- Open/update or push を選択
- Modal action type,Trigger IDを設定
- Viewを設定してモーダルウィンドウの入力欄等をカスタムする
※ ここでuser_type,notify_bodyを設定しています。
- Modal submissionを設定して、モーダルの入力値を送信する際の挙動を設定する
※ Enter custom valueに当該レシピの起動Wordを設定すると再帰的に設定ができる
4. モーダルの入力値受信後の処理を設定
このままでは無限にモーダルが出てくるので、モーダル送信前/後で処理を分岐させる
- IF分岐を追加して条件を設定
- IF分岐のYes配下に以下を配置先ほど作成したモーダルウィンドウ表示アクション
- Stop Job
5. 一旦レシピを保存する
こうなっていればOK
6. DM送信用レシピを作成
- トリガーをCallableレシピで作成
- Input schemaに以下Jsonを定義
- IF分岐の配下に、対応するリストでループする処理を配置
- DM送信処理を設定App → SlackWorkbotを選択
- Action → Post message
- Setup → 以下画像参照
11. 作成したレシピを有効にすれば完了
以上です。
お疲れ様でした。
注意事項とか言い訳とか
注意!! 誤操作したらあちちだぞ
このレシピはSlackに存在するユーザーにまとめてDM飛ばすので、誤操作したらわりと大変なことになります。 (経験者は語る) SlackEGを契約している方はテスト用Workspaceを立ててから作ることを強くオススメします。
(言い訳)ユーザー分岐とDMとでループ処理を分けているのはなぜか
ユーザ-取得→DM送信でループを二回まわしていますが、実は一つのループに統合できちゃいます。 以下の理由により今回はループを分けました。
- ユーザー取得→条件に従ってリストへ代入、の処理を同一レシピ内で別途使う予定があった
- DM送信前にデバッグ目的でLogを出力する、ドライランを仕掛ける等の目的があった
(言い訳)なぜレシピを分けたのか
レシピも一つに統合できます。じつは。 これはレシピ管理の都合上、処理とトリガー部分を分けた方が良いなと判断したためです。 Workbotトリガー→InteractiveMessageの値受け取りのレシピに処理も記載すれば良いのですが、 後日スラッシュコマンド起動の機能を起動用レシピに追加する予定だったのであえて分けています。
おわりに
ここまでお付き合いありがとうございました。 一斉連絡のツールは強力です。 実装してすぐに弊社内で使う機会があったので早速役に立ちました。 すっごく便利。ええもん作ったわぁ。
取扱注意なので気をつけてくださいね!
以上、ばるすでした。





