見出し画像

Slack → Asanaタスク・コメント自動作成 with Zapier

こちらはJCNアドベントカレンダー2023の12月18日のエントリーです。


はじめに

JCNって何

Slackの有償ユーザーが集まるコミュニティで、正式にはSlack Japan Champions Networkといいます。Slackを使い始めた方からめちゃくち活用されている方まで、現時点で1500名以上(Salesforce社の方を含む)が参加されていて、非常に勉強になります(さよさん(@Sayo_Morimoto)、みなさん、いつもありがとうございます!)。
企業、その他の法人、自治体などで有償プランをご利用の場合、そのメンバーならどなたでもご参加いただけますので(たぶん)、是非どうぞ!

自己紹介

初めてご覧くださる方もいらっしゃるかもなので、軽く自己紹介しておきます。某ソフトウェア関連の企業で法務と情シスを担当しています、なかじょーと申します(ローマ字表記はNakajohの「h」がポイントです。その他、少し詳しい自己紹介はこちらにございます。物好きな方はどうぞ。)。

お礼

この記事でご説明している連携を実現するにあたって、マネーフォワードさんのブログエントリー(?)の「Zapier × Slack × asanaでタスク管理とユーザーコミュニケーションを効率化する」(以下「参考エントリー」といいます。)を大変参考にさせていただきました。これがなければ一から自分で考えていたので、まだ使えていなかったと思います。本当にありがとうございます。

何でこんな連携を?

こんな連携をしたかったのは、情シスへの依頼事項の管理(所謂チケット管理ですかね)に関して、以下の問題点があったからです。

  1. 依頼者とのやり取りをSlackだけで済ませてしまっていて、後から振り返ることができないか、非常に難しい(誰がどれだけやったか、どうやったかなど)

  2. 対応に時間がかかる依頼事項について、依頼者側から情シス内での対応状況が見えない

  3. 1、2を解決するのにAsanaを使いたいが、都度手動でタスクを作成するのは(Slack連携はあるものの)めんどい/忘れる

加えて、問題点ではないのですが、1にも関連して、先日拝聴した「第一回 バックオフィスコミュニティ勉強会(再)」で、記録の重要性を再認識したことから、全部Asanaに残せないかと考えていたというのもあります。

実現したこと

内容

そこで、以下のことを実現しました(こう書くとシンプル)。

  1. Slackの特定のチャンネルで特定のメンション(グループ宛がおススメ)付きで新規投稿があると、Asanaのタスクが自動作成される(投稿者がコラボレーターに追加される)

  2. 1の投稿にスレッドでの返信があると、1のAsanaタスクのコメントにその内容が自動転記される

  3. (1、2を、Zapierを使ってノーコードで実装する)

(実は、この連携は、参考エントリーの内容ほぼそのままで実現できてしまうのですが、一部サービス側のアップデートがあるのと、へーしゃに合わせて変更した部分があるので、そこをシェアできればということで、この記事を書くことにしました。)

なお、ZapierはActionが複数になるので、有料プランである必要があります。ご了承ください。

いいこと

この連携、まず情シスのチケット管理に使っているんですが、何がいいかというと、

  1. 依頼者は(グループ)メンションを入れてSlackに投稿するだけ(これまでと何も変わらない)

  2. 情シスは、何もしなくてもAsanaでステータス管理などができる(問題点1の対策)

  3. AsanaタスクからSlackのスレッドに飛べる(Slackのスレッドは流れて見失いやすいが、Asanaはそうでもない)

  4. 依頼者もAsanaで状況を把握できる(問題点2の対策。Slackには書かない情シス内のやり取りとか。)

辺りです。特に1は依頼者に負担をかけないという点でとてもよいと思っています。
ちなみにグループメンションをおススメしているのは、少しでも速く反応できるようにするためですが、一人情シスの場合でも、将来人数が増えるかもしれないし、最初からグループにしておくとよいと思います。

連携方法

では、連携方法についてご説明します。

事前準備

  1. Googleスプレッドシート
    SlackのスレッドURLとasanaのタスクURLを記録するためのスプレッドシートを用意します(ここでは、ファイル名は「Slack to Asana Automation」とします。適宜読み替えてください。)。参考エントリーに倣って、A1を「Slack」、B1を「Asana」、C1をDescription」としておきます(なぜか大文字で始めていたことに今気づきました。小文字でOKです。)。

  2. グループIDの確認
    参考エントリーが書かれたころから仕様が変わったようで、グループメンバーの管理画面からではなく、「More」から下記画像のように進みます(日本語の場合は「その他」→「自分のオーガナイゼーション」→「メンバーディレクトリ」→「ユーザーグループ」)。「User Groups」から該当のグループを選んで、メニューから「Copy group ID」を選択します。
    以下では、グループIDを「S0xxxxx」、グループのHandleを「@it」としてご説明しますので、適宜読み替えてください。

  3. 連携させたいAsanaプロジェクト
    新規に作成しても、既存のものでもOKです。

グループIDの見つけ方(その1)
グループIDの見つけ方(その2)

作成したZap

  1. 特定チャンネルにメンション付きの投稿があった場合、Asanaのタスクを自動作成するZap(Zap①)
    https://zapier.com/shared/34636dc3f30ba456adfcb97138a9734de986008a
    参考エントリーからの変更点:
    ①ステップ2のフィルターを使えばスプレッドシートを使った重複チェックは不要なので、ステップ省略(この記事を書いていて気づきました。ステップ7のシートへの書き込みはZap②のために必要です。)
    ②メンションの文字列を削除するステップを追加
    ③Asanaタスクできたよ通知(ステップ6)を、元の投稿のスレッドに送信

  2. スレッドの内容をAsanaコメントに自動転記するZap(Zap②)
    https://zapier.com/shared/bd487ea3ecbc9c404b0d12b7d840164ee9abb610
    参考エントリーからの変更点:
    ①スプレッドシートに該当がある=先に投稿がある→今回のメッセージはスレッドへの返信であることが確定するので、最初のフィルターのステップを省略
    ②AsanaのURLからステップ1つでタスクのIDを取得する方法を見つけたので(+プロジェクトは固定でID不要だったので)、テキスト加工ステップを削除

  3. Zap①とZap②をPathを使って一つにしたZap(Zap③)
    (Pathを使ったZapはテンプレートにできないそうです。残念。)
    この記事を書いている途中で、1つのZapにしたらタスク消費減るんじゃね?ということに気付いて作ったZapです。

ということで、以下ではZap①とZap②のテンプレートからの自動化についてご説明します。

なお、Pathが使える方は、以下の方法で合体させられます(画像は省略。ほしい方は個別にご連絡ください。)。
 i. Zap①のテンプレートの最後にPathを追加
 ii. Zap①のアクションをすべてPath Aの下に移動(フィルターをPath rulesに変更)
 iii. Zap②の内容をPath Bの下にコピペ(各ステップのメニューからCopy→Zap①のPath Bの下のアクションのメニューの「Paste to Replace」)

設定内容 -Zap①-

以下、番号はテンプレートのトリガー/アクションと対応しています。

1. トリガー
 特定チャンネルに新規メッセージが投稿されたことを検知して、Zapierが動き出します。 

チャンネルを設定

2.フィルター
 グループメンションが含まれ、かつスレッドの返信ではない新規投稿の場合だけ、先に進みます。
 一つ目の条件は、投稿されたメッセージ(「Text」)にグループメンションが含まれている場合、という設定です。「Enter text or insert data」の欄には、「!subteam^S0xxxxx@it>」と入力します。
 「and」ボタンを押して、二つ目の条件を設定します。
 二つ目は、メッセージがスレッドの返信でない場合、という設定です。スレッドでの返信のURLには、「thread_ts」が含まれることを利用します。

フィルター

3. Asanaユーザーを見つける
 (ステップ5でコラボレーターに追加しないのであればこのステップは不要です。4と逆の方がすっきりする気もしますが、まぁどちらでも可です。)
 Slackの投稿者のメールアドレスから、Asanaユーザーを見つけます。アドレスを指定すればOKです。

Asanaユーザーを見つける

4. テキスト加工
 メンションの文字列(!subteam^S0xxxxx@it>)を削除します。
 Asanaのタスク(タイトル・説明)にメンションの文字列が入ると邪魔くさいので(最初は残していたんですが、あんまり目障りなのでこのステップを追加しました。)。

テキスト加工

5. Asanaタスク作成
 Asanaのタスクを作成します。いずれもお好みで調整してください。
 「Name」(Asanaタスクのタイトル)には、Slack投稿者の名前と、上記4のOutput(投稿内容からメンションの文字列を除いたもの)を設定しました(ChatGPTさんに「いい感じの」タイトルをつけてもらう方法もあるとか…。) 
 「Description」(Asanaタスクの「説明」)には、Slackのメッセージと、投稿者フルネーム、元のSlackのスレッドへのリンクを設定しました。
 「Followers」(Asanaタスクのコラボレーター)には、上記3で取得したSlack投稿者のGIDを設定しています(任意ですが、入れた方が便利かと。)。

Asanaタスク作成

6. Slackにメッセージ送信
 Slackに、「Asanaのタスクが作成されたよメッセージ」を送信します。
 「Message Text」(メッセージ内容)はお好みで。以下ではAsanaタスクへのリンクを張っています。
 「Thread」に元の投稿のタイムスタンプを設定すると、その投稿のスレッドへの返信になります。
 ※画像では(Thread以外の)任意の設定項目はカットしてあります。「Thread」はかなり下の方にあります。

7. スプレッドシートに行を追加
 用意しておいたスプレッドシートに行を追加して、Slackのメッセージと作成したAsanaタスクの情報をセットします。これを使って、Zap②をうまく動かします。
 スプレッドシートとシートを設定して、「Slack」「Asana」「Description」にそれぞれ値を設定します(Descriptionは加工後のものでもどちらでも。)。

スプレッドシートに行を追加

Zap①は以上です。

設定内容 -Zap②-

以下、番号はテンプレートのトリガー/アクションと対応しています。

1. トリガー
 Zap①のトリガーと同じなので省略します。
 ※次のステップにフィルターを追加することも考えたのですが、フィルターを通過する場合はステップ(Zapierのタスク)が一つ増える⇔引っかかる場合はステップ(タスク)を1つ節約できることになるので、前者が多いと考えて外しています。スレッドでの返信が少ない場合は、フィルターを追加した方がよいかもしれません。

2. テキスト加工1
 クエリストリングに記載されている元の投稿のタイムスタンプから「.(ドット)を削除します(次のステップで探すURLを作るのになぜか必要です。)。
 「Input」にスレッドのタイムスタンプ(返信のタイムスタンプと間違えないように)を入れて、「.」を探してそれを削除(「Replace」を空欄にすることで、「無」に置換)します。

テキスト加工1

3. スプレッドシートから行を探す
 用意しておいたスプレッドシートから、その投稿(スレッドへの返信)の元の投稿のURLを探します。
 「Lookup Column」には「Slack」を、「Lookup Value」には、元投稿のURLを設定します(ちょっとややこしいのですが画像をご参照ください。)。
 最後のチェックボックスにチェックを入れてしまうと、該当がない場合(=新規投稿の場合)に行が追加されてしまい、Zap①と重複してしまうのでご注意ください(ここまではチャンネルにメッセージが入ると必ず動くので。)。
 ※画像では、任意の設定項目はカットしてあります。

スプレッドシートから行を探す

4. フィルター
 3で該当があった場合(=既にAsanaにタスクが作られている投稿へのスレッドでの返信だった場合)にのみ先に進みます。
 「3. Zap Search Was Found Status」と「(Boolean)Is True」をセットします(3のサーチで該当があったとき、という設定です。たぶん。)。

フィルター

5. テキスト加工2
 スプレッドシートに記載されているAsanaのURLから、対象のタスクのGIDを取得します。
 「Split Text」を使って、(最後の)「/」の後の文字列(「Last」)を指定して取得します。

テキスト加工2

6. Asanaコメントに転記
 Asanaのタスクに、Slackメッセージがコメントとして転記されます。
 ここではプロジェクトは固定しているので、TaskとTextだけ変数を入れています。

Asanaコメントに転記

注意点

だいぶステップ数を減らして節約はしたものの、それでもSlackのメッセージがチャンネルに入るたびに(スレッドでの返信も含まれるので)、Zap①は最低2タスク、Zap②は最低3タスク消費することになります(Zap③が使えれば少しマシ…?)。
この記事を書く前はもういくつか余計なアクションが入っていたので、2,000タスク/月のタスク数をあっという間に使ってしまい、Runが止まってしまって焦りました。
タスク数にはご注意ください…。

おわりに

この記事を書くまでは「ステップ数を減らしたい」というのと、「Asanaタスクできたよ通知」をスレッドにしたいというのを考えていたんですが、上記のとおり書きながら気付いて修正できてしまいました。さらにPathを使って一つのZapにすることもできました。書いてよかったですwww
ほかに改良できるところはないかな…何か思いついた方は教えていただけたら嬉しいです。

現状、へーしゃでは情シスのチケット管理にしか使っていませんが、これは応用が利く連携かなと思っています。例えば、法務相談とか、営業担当者からアシスタントへの依頼とかに使えたりしないかなと。
将来的にはすべての入口をSlackにしたいので(Workato使いたいなー。)、その点でも今回の連携はよさそうかなと思っていたりもします。

お読みいただいてありがとうございました!

この記事が気に入ったらサポートをしてみませんか?