この記事は、ニフティグループ Advent Calendar 2024 6日目の記事です。
はじめに
こんにちは。ニフティ株式会社の並木です。
皆さんは、タスクの割り当てや順番決めに頭を悩ませたことはありませんか?
私はこれまで、オンラインのあみだくじやルーレットツールを利用していましたが、あみだくじの結果を目で追ったり、何度もルーレットを回したりと、意外と手間がかかっていました。
「もっと簡単に、一発で機械的にタスクを割り当ててくれるツールが欲しい!」という思いから、SlackのワークフローとZapierを使用して、タスクを簡単に割り当てるツールを作成しました。
今回は、その方法についてご紹介いたします。
Slackのワークフローを作成する
Slackでワークフローを新規作成します。
「Slack内のリンクから」を選択してください。

ステップを追加します。 「フォーム」を選択してください。

フォームの内容を設定します。
質問1でタスク名を入力するよう設定します。

質問2で人の名前を入力するよう設定します。

質問1、質問2で入力された内容を、slackにメッセージとして送信できるよう設定します。
「メッセージ」を選択してください。

「チャンネルへメッセージを送信する」を選択してください。

今回は「ワークフローが使用されたチャンネル」に、以下の内容のメッセージが送信されるよう設定します。

これでワークフローの作成は完了です!
Zapierを設定する
まずはトリガーの設定をします。
Appは「Slack」、Trigger eventは「New Mention」を選択します。

Slackに「タスク簡単割り当てワークフローを起動しました。」という文章が投稿されたらZapierが起動するよう設定したいので、Highlight Wordには「タスク簡単割り当てワークフローを起動しました。」を設定します。
Trigger for Bot Messages?は、Botによる投稿もトリガーの対象に含めるかを確認していますので、今回は「True」を選択してください。

タスクをランダムに割り当てる処理を書いていきます。
Appは「Code by Zapier」、Action eventは「Run Python」を選択します。
言語はPythonのほかにJavascriptを選択することもできます。

Input Dataの右側の入力ボックスにSlackで投稿された文章を設定し、左側の入力ボックスにキー名を入れます。
以下画像ではキー名を「original_text」としましたが、どんな名前をつけても良いです。

Codeの中でinput_data['original_text']
と書くことで、Input Dataで設定したデータを取り出すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def custom_shuffle(lst): # 簡易的な疑似乱数生成 seed = sum(ord(c) for c in ''.join(lst)) for i in range(len(lst) - 1, 0, -1): seed = (seed * 1103515245 + 12345) & 0x7fffffff j = seed % (i + 1) lst[i], lst[j] = lst[j], lst[i] return lst # ワークフローを使った人の名前とタスクと人名を取り出す text = input_data['original_text'] lines = text.split('n') mention = lines[0] tasks = lines[4].split(',') people = lines[6].split(',') # タスクと人名をシャッフル tasks = custom_shuffle(tasks) people = custom_shuffle(people) # 結果を生成 result = "" for i in range(len(tasks)): person_index = i % len(people) # 人数を超えた場合は最初から割り当て直す result += f"{tasks[i]}:{people[person_index]}n" output = [{'result':result, 'mention':mention}] |
タスクを割り当てた結果を、Slackに投稿します。
Appは「Slack」、Trigger eventは「Send Channel Message」を選択します。

ChannelにSlack投稿するチャンネル名、Message textにSlack投稿するメッセージを入力します。
Codeの最後にoutput = [{'result':result, 'mention':mention}]
と記載しておくことで、タスクを割り当てた結果とワークフローを使った人の名前を取り出して、メッセージに含めることができます。

これでZapierの設定は完了です!
実際に動かしてみる
ワークフローを実行し、タスク名と名前をカンマ区切りで入力します。

「送信する」を押下すると、ワークフローを実行したチャンネルに、以下のメッセージが投稿されます。

さらに数秒待つと、タスクを割り当てた結果が「#bot_タスク割り当て」チャンネルに投稿されます!

おわりに
以前の記事「ZapierでX投稿するAPIを呼び出して結果をSlackに通知してみた」では、Zapierから Slackへの連携を試しましたが、今回は逆に Slackの投稿をトリガーにして Zapierを起動させる方法を初めて実践しました。
今後も、SlackとZapierの連携を活用して、業務効率化や情報共有の改善に役立つツールを開発していきたいと思います。
明日は、jimmysharpさんの「CloudFront FunctionsでもTypeScript&テストしたい」です。 お楽しみに!