Slackで特定のリアクションを付けた投稿をSlackリストに追加する

# 📍はじめに

Slack の投稿をチームの知見として蓄積するために、Slack のリスト機能を活用した「知見リスト」を作成しました。
今回は Slack ワークフローと Zapier を組み合わせて、特定のリアクションを付けた投稿を自動でリストに追加する仕組みを紹介します。

# 背景

## 現状

私のチームでは[Slack 用リアク字チャンネラー](https://slack.com/intl/ja-jp/help/articles/360000482666-Slack-%E7%94%A8%E3%83%AA%E3%82%A2%E3%82%AF%E5%AD%97%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%A9%E3%83%BC)を使い、特定のリアクションを付けた投稿を知見チャンネルに集約しています。このチャンネルに集められた投稿は、定例 MTG で読み合わせをしています。


## 問題点

会話の中の投稿に対してリアクションするため、チャンネルに転送された投稿だけだと内容が分かりにくいことがあります。
読み合わせの際にリアクションをしたメンバーに補足してもらっていますが、後から見返した時に思い出せないことが課題となっています...😭

# やりたいこと

- Slack の投稿に特定の絵文字でリアクションすると、自動でリストに投稿が追加される
- リストには概要欄を設け、投稿内容の補足情報を記入可能にする

:::note warn
リストへの追加は投稿右上のアイコンから直接行うことも可能ですが、従来の絵文字リアクションによる運用を変えることは避けました。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/b2e17afb-d278-5802-cd74-4093f5e0b755.png" alt="">
また、この方法ではリストアイテムのタイトル列に投稿全文が入ってしまうため、今回は別の手段を採用しました。
:::

# 使用したもの

- [Zapier](https://zapier.com/app/home): リアクションを検知して Slack の Webhook を呼び出す
- [Slack](https://slack.com/intl/ja-jp/)
  - ワークフロー: Webhook をトリガーにリストアイテムを追加
  - リスト: リアクションが付けられた投稿の情報を保存

API 経由でリストに直接追加することは現時点ではできない[^1]ため、Zapier を用いてワークフローを起動させています。


# 手順

## Slack

### リストの作成

以下のように作成しました。

<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/c80706e8-32c5-e885-6cc8-225f6f9a5585.png" alt="リストの完成形">

- **追加日、元投稿、追加した人**: ワークフローで自動入力
- **概要、カテゴリ**: リストに追加した人が手動で入力

### ワークフローの作成

完成形は以下の通りです。
今回はフォームを設置せず、リスト追加後にチャンネルで通知を送り、編集を促す形にしています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/20be7335-d6d2-1709-44f0-14bfd714c54e.png" alt="Slack ワークフローの完成形">

#### Webhook の設定

1. 「ワークフローを開始する」で「Webhook から」を選択
2. データ変数を追加し、以下を設定<br>
    | キー | データタイプ |
    |:-:|:-:|
    | url | テキスト |
    | user | Slack ユーザー ID |
    <br>
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/beb97836-2796-2d4c-63e3-7f58df81175b.png" alt="データ変数を設定した状態">
3. 再度「Webhook を使って開始する」を開きウェブリクエストの URL をコピーしておく

#### リストの設定

1. 「ステップを追加する」で「リスト > リストアイテムを追加する」を選択
2. 追加対象のリストを選択し、フォームは使わない設定に変更
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/9fb25dfa-018e-5dbe-858f-780713a17fae.png" alt="追加対象のリストを選択し、フォームは使わない設定に変更した状態">

    :::note info
    フォームを生成する場合、`フォームを起動するための通知 → フォーム入力 → リスト追加` のようなフローになります。

3. 各フィールドに値を設定して保存
    追加日は `UTCの日付` を指定しています。

    | フィールド | 値 |
    |:-:|:-:|
    | 追加日 | ワークフローが開始した時刻 |
    | 追加した人 | user |
    | 元投稿 | url |

    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/88aadd1a-e4be-062d-72d5-fa5e1aff4f0d.png" alt="各フィールドに値を設定した状態">

#### チャンネルへの通知（必要な場合）

1. 「ステップを追加する」で「メッセージ > チャンネルへメッセージを送信する」を選択
2. メッセージを送信するチャンネルを選択し、任意のメッセージを設定
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/24e97b05-3346-a18e-cacb-2db7dbc93ac6.png" alt="メッセージを設定した状態">
3. 「ボタンを追加」>「動作」>「リンクを開く」で`アイテムのURL`を指定
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/c9edb1cb-828c-0080-c43f-9f28eb899636.png" alt="ボタンを設定した状態">

最後に「完了」を押下し、ワークフローの名前などを設定して公開します。

## Zapier

### Zap の作成

完成形は以下の通りです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/8554709f-4ec5-25fd-4ed2-6907e728b77b.png" alt="Zaps の完成形">


#### リアクションの検知

1. 1つ目のイベントに「Slack」を選択
2. Trigger event に「New Reaction Added」を設定
3. Account に自分の Slack アカウントを選択
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/aa9e656e-6410-2fbb-2d3d-06a0e1d1e504.png" alt="Account に自分の Slack アカウントを選択">
4. Reaction にリスト追加のトリガーとして使用する絵文字を設定
    今回は `:test:` というリアクションを選択しています。 
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/ff9bd7c9-3137-722b-e33c-d8396321cfe0.png" alt="Reaction にリスト追加のトリガーとなる絵文字を設定">

#### Webhooks への POST

1. 2つ目のイベントに「Webhooks」を選択
2. Action event に「POST」を設定
3. 各項目の値を以下の通りに設定
    | 項目 | 値 |
    |:-:|:-:|
    | URL | Slack から取得してきた Webhook の URL  |
    | Payload Type | json |

    Data には下記を追加します。
    | 項目 | 値 |
    |:-:|:-:|
    | url | Message Permalink（スタンプを押した投稿の URL） |
    | user | User Id（スタンプを押したアカウントの ID） |
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/52095f5c-820b-0f0a-2930-9dcd00233466.png" alt="各項目の値を設定した状態">

    他はデフォルトのままで OK です。

最後に「Publish」を押下して公開します。

# 完成形

投稿にリアクションすると
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/ea2ad57f-061c-2a41-eb73-874497c90a25.png" alt="投稿にリアクションをした状態">

チャンネルに通知が来て
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/5a13907e-cc4e-4361-6498-64001e4a5e2d.png" alt="チャンネルに通知が来た状態">

リストにも追加される
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/85ce536b-8633-1bde-4614-01c12eda85d4.png" alt="追加したアイテムの編集画面">

リスト側はこんな感じ
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620881/c80706e8-32c5-e885-6cc8-225f6f9a5585.png" alt="リストに追加された状態">

🎉🎉🎉

# 📍おわりに

まだこの運用を導入して間もないため、実際に使いながらさらに改善を重ねていく予定です。
Slack にリストの API が追加されればよりシンプルに実現できると思うので、実装を待ちたいです。


以下参考にさせて頂きました🌟

https://qiita.com/tabimoba/items/6393ae3bca945e171679



[^1]:https://forums.slackcommunity.com/s/question/0D5PU00000YS6n30AD/how-to-add-a-list-item-via-api?language=ja