Zapierを使ってSlackのワークフローをトリガーにClickupのタスクを自動生成する

# 概要

Slack ワークフローをタスクの依頼窓口として利用するケースは多いと思います。私達の環境ではチーム内でドキュメントレビューを依頼する際にSlack ワークフローを利用していますが、Githubのようにリマインドをしてくれないのでレビューを忘れて滞りがちという課題がありました。
そこで、毎日確認するタスク管理ツールにチケットを作成しておけばレビュー漏れは防げるだろうということで、チケット化して管理するルールとしました。ただ、ドキュメントレビューの依頼があるたびに手動でチケットを作成するのは地味に辛く、その辛さからチケットの作成漏れが発生する恐れがあるので、チケット作成の自動化もセットで考えました。

弊チームではタスク管理ツールにClickUpを利用しています。SlackのイベントをトリガーにClickUpのタスクを作成するには、両者を連携する必要があります。自前でツールを作るのも一つの案ですが、この自動化作業に工数を掛けたくなかったので、[Zapier](https://zapier.com/)というサービスを利用しました。Zapierは6000以上のツールを連携してワークフローを構築できるノーコードツールです。これを利用することで時間を掛けることなく自動化できました。

ここでは、Zapierの利用方法や設定をまとめていきます。

# ワークフローの説明

早速ですが、今回構築したワークフローについて説明します。

## 前提

Slack ワークフローで投稿されるメッセージは以下になります。

![レビュー依頼.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/10c126c9-6434-bbb7-29ef-c52399c96c23.png)


## 1.Slackの特定チャンネルに投稿されたメッセージを取得する

まずZapierのワークフロー（以下、Zap）を作成するにあたり、トリガーを選択します。
今回はSlackに新しいメッセージが投稿された時に動作して欲しいので、「New Message Posted to Channel」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/7df8f52b-5b20-ef6c-4bba-56c11bd33bfc.png)

ここで選択できるのは対象のチャンネルとBotのメッセージをトリガーの対象とするかのみです。ここでは特にメッセージのフィルタリングは行われません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/d61ebe8d-6e8a-8e04-4dd6-ae5a760f439e.png)


## 2. 投稿された任意のメッセージのみを抽出する

1で取得した内容のうち、ドキュメントレビュー依頼だけを抽出します。
今回のケースでは以下の条件で抽出しています。

- Slackを投稿したユーザー名に「ドキュメントレビュー」を含むこと
- メッセージ内に「レビュー依頼を受け付けました！」を含むこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/e67f9b58-28ed-1bc3-e266-37ef19b5bcaf.png)

## 3.投稿されたメッセージを一行ずつ項目に分ける

この後で行うチケット作成時に利用する情報を抽出するため、依頼時のメッセージを一行ずつ個別の項目として取得します。
今回は行がずれない想定なのでこの方法をとりましたが、行数が変動する場合は正規表現で抜き出すこともできます。

一行ずつ項目として取得するには `Formatter` の `Split Text` を利用します。
Split Textを選択すると、[任意のSeparator](https://help.zapier.com/hc/en-us/articles/8496304469261#2-optional-find-replace-or-split-special-characters-0-1)が選択できます。今回は `[:newline:]`を使います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/9496a7f0-1f23-cee0-a57a-0833d217bee8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/40998282-0ef3-c2fe-0f45-c37de4d02690.png)


## 4.分割した項目のうち、レビュアーに相当する行を取得する

投稿されるメッセージのうち、レビュアーには「Slackメンション - メールアドレス」の形式で設定されるため、3の手順と同様 `Split Text` で、今回はSeparatorを `-` にし、要素の2番目を指定することでメールアドレスを抽出します。

![split_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/b6f1e7fe-f085-bae5-5edd-776192fe5b25.png)

レビュアー依頼時にSlackメンションの他にメールアドレスも取得している理由は、レビュアーに指定されたをClickUpのチケットにアサインするためです。ZapierからClickUpのチケットへのアサインには以下の３つのいずれかの情報が利用できます。

- ClickUpに登録したEメールアドレス
- ClickUpのユーザー名
- ClickUpのユーザーID

Slackから取得できる情報ではメールアドレスが最も規則にブレがないため、利用することとしました。

## 5.ClickUpの特定のフォルダに存在する全てのリストを取得する

このステップでやりたいことは章の通りなのですが、必要性がわかりにくいので理由から説明します。
前提として、ClickUpは特定のフォルダの最新のリストを取得する機能が提供されていません。弊チームではスクラムを回しているため、スプリント毎にリストが切り替わります。Zapierからチケットを作成する際、チケットを作るリストの指定が必要なため、最新のリストが取得できなければ、スプリントが変わる毎にZapを編集してチケットの作成先のリストを変える手間が発生してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/8ea1c180-3df2-6611-55a7-e4a16b3e9ae4.png)


この手間を避けるために、最新のリストを取得するための一工夫がこれと次のステップでなされています。
ここではまず、フォルダ内に存在する全てのリストを取得します。これを実現するために[App Extensions](https://help.zapier.com/hc/en-us/articles/16276574838925-App-Extensions-in-Zapier)というZapierのBeta機能を利用しています。これは簡単に言うと、ZapierからAPIリクエストを投げて結果が得られる機能です。

ここで呼び出しているAPIはClickUpの[GetLists](https://clickup.com/api/clickupreference/operation/GetLists/)です。フィルター等はほぼない簡素なAPIのため、基本的には全てのリストを取得することしかできません。


## 6.取得したリストから最新のリストの情報のみ抽出する

5の手順で取得した結果をFormatter (Utilities > Line-item to Text)で整形すると、取得した全てのリストから個別のリストを取り出せます。最新のリストを取得する場合は `item_last` を選択すれば要件を満たせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/90a48383-5900-dfda-c527-d00ea6ebdc81.png)


若干ハマったポイントについても触れておくと、5で取得したリストのIDは以下のキャプチャのように、一見するとcsv形式で抽出してくれているように見えます。そのため、これまでに登場している `Split Text` でSeparatorにカンマを指定して末尾の項目を取得すれば要件を満たせると考えましたが、これだとうまくいきませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/27764062-54c3-f9de-80f9-0c34df31a35a.png)

以下の記事によると、内部的には別々の項目として結果を保持しているとのことで、抽出するための方法として、上記が紹介されていました。

https://community.zapier.com/code-webhooks-52/i-want-to-split-the-text-and-use-it-in-the-next-action-21399


## 7.取得した情報からClickupのチケットを作成する

ここまでに取得した情報からあとはClickUpのチケットを作るだけです。
チケットの作成自体はZapierにお任せです。

Title：ドキュメントレビュー - レビュー依頼時の概要
Task Description： レビュー依頼時のSlackリンク
Start Date：レビュー依頼を受け付けたタイミング
Due Date：レビュー依頼時に入力した希望日時
Tags： Review

Due Dateにはレビュー依頼時の希望日時に以下のフォーマットで入力されれば適切に設定されることは確認済み。

- 2023-07-31T18:00
- 2023-07-31 18:00
- 2023-07-31

# おわりに

今回初めてノーコードツールを使いましたが、直感的にもわかりやすいUIで利用しやすかったです。ClickUpの最新のリストを取得できないことがわかった際に、「詰んだか...?」と思いましたが、Zapierの機能で補えたので助かりました。利用ケースも多く、これからの地味系改善や自動化業が捗る期待が持てる良いツールでした。