はじめに
基幹システムグループの湊谷です。
普段は主にニフティのお客様の情報を管理するシステムの開発・運用を行っています。
「◯◯の情報を取得するにはどのAPIを利用すれば良いか?」といったシステム目線のもの、「◯◯といった属性を持つお客様にメールを送りたいため、IDリストを抽出してほしい」といった企画・営業目線のもの、日々様々な問い合わせが来ます。
今年でこのシステムに携わり始めて4年目になりますが、まだまだ把握しきれていないことも多く、問い合わせを対応する時は都度調べることが欠かせません。
その中でも、「過去の類似の問い合わせを見つけ出し、その時の調査内容・回答から今回の回答のヒントを得る」ことが多いです。
しかし、問い合わせはSlackチャンネルで受け付けているのですが、数多い問い合わせの中検索して必要な情報を探し出すのは大変・・・
しかも、調査段階で右往左往してる・・・
どこかにナレッジとしてちゃんとまとめておきたい!でも手動でやりたくない!
ということで今回は、「Slackチャンネルで問い合わせが投稿されると、Notion DBに新規ページを作成し、その作成されたページがSlackチャンネルに投稿される」ことを実現します。
ちなみに、過去にSlack ワークフロー+Boltで依頼・受付の調整をスッキリさせよう!という記事も書いているので、よろしければご覧ください。
Slack BoltとZapierを使ってNotionと連携させる
やることは大きく分けて以下の五つです。
- Slack Bolt for Javascriptを使ってbotを作成する
- 問い合わせを受け付けるSlackワークフローを作成する
- Notionにデータベースを用意する
- ZapierでNotion データベースに新規ページを作成し、Slackに通知するワークフローを作成する
- botの実装を行う
それでは一つずつ見ていきます。
Slack Bolt for Javascriptを使ってbotを作成する
早速上記の過去の記事と同様になりますが、まず最初に、Boltを使用して、チャンネルに投稿されたメッセージを受け取り応答するbotを用意しておきます。
Slackアプリの構築の仕方については、slack apiのドキュメントやBolt 入門ガイドに詳細があるため省略します。
問い合わせを受け付けるSlackワークフローを作成する
私たちのシステムでは、問い合わせを受けつけるチャンネル(以下、QAチャンネル)と、システム担当者が調査・やり取りを行うチャンネル(以下、内部用チャンネル)の二つを用意し、QAチャンネルにSlackワークフローを作成して問い合わせを受け付けています。
※今回は、2023年6月に提供開始された新バージョンのSlack ワークフローではなく、レガシー版のワークフローを用いて作成しました。
まずはワークフローを開始したチャンネル=QAチャンネルに、問い合わせの内容をそのまま投稿します。
今回の実装とは関係ありませんが、QAチャンネルに投稿されたメッセージのスレッドに、以下の様な返信を行い、システム担当者が確実に気付けるようにしています。
次に、内部用チャンネルにも投稿を行います。
基本的には問い合わせを受け付けたチャンネルに投稿した内容と同じものを投稿しますが、大切なのは一番下の部分です。
先ほど作成したSlack botへのメンションと、「Notion DBにコピーしてください」という文言を一緒に投稿しています。
後ほどbotの実装を行う際に、「アプリにメンションが飛んだ時、更に特定の文字を含んでいる」場合をトリガーとする実装を行うため、忘れずにつけておきます。
Notionにデータベースを用意する
Notionに問い合わせをまとめるページを作成します。
データベースを選択してページを新規作成します。
使いやすいようにプロパティを編集しましょう。今回は「進捗」「Slackスレッド」「担当者」の三つのプロパティを持たせています。
ZapierでNotion データベースに新規ページを作成し、Slackに通知するワークフローを作成する
Zapierとは、複数のアプリやサービスを連携してワークフローを作成することができるサービスです。
今回は「NotionDBにページを作成し、そのページをSlackに通知する」ワークフローを作成します。
※Notionにページを作成しSlackに通知させる、といった複数のステップを組み合わせたワークフローの作成や、今回トリガーに使っているものは有料プランのみ可能です。
まず、「何をきっかけにして作成したワークフローを発火させるか」となるトリガーを選択します。
「Webhooks by Zapier」を選び、Eventは「Catch Hook」を選択します。
「Trigger」は特に指定せず次に進みます。
「Test」に進むと「Your webhook URL」が表示されます。
このURLを呼び出すと叩くと、現在作成しているワークフローを発火させることができます。
パラメータに、「Notion DBに作成するページのタイトル(title)・本文(detail)」と、「投稿するSlackのスレッド(ts)」の情報を持たせます。指定する値はここでは適当で問題ありません。
1 |
https://hooks.zapier.com/hooks/catch/XXXXXXX/XXXXXX/?title=test&detail=korehatestdesu&ts=hogehoge |
このURLを一度ブラウザで叩いてみましょう。“status”: “success”となればOKです。
次にNotion DBにページを作成します。Add a stepでNotionを選択し、Eventには「Create Database Item」を指定します。
Accountでは使用する自身のアカウントを連携させます。
連携させる際に、先ほど作成したページを指定しておきます。
Actionで、作成するNotion DBのページの設定をしていきます。
- Database 作成したページを指定
- 名前 ページのタイトル。パラメータに指定したtitleを選択
- slackスレッド <内部用チャンネルのURL>+/p+パラメータに指定したtsを選択
- Content ページの本文。お好みの文章と、パラメータに指定したdetailを選択
- Content Format マークダウン式で書く場合にはMarkdownを選択
これでテストをすると、先ほど作成したNotionページに新しくページが追加されていることを確認できました。
最後に、Slackに通知をする設定をします。
Zapierで設定を行う前に、Notionのページを通知させたいチャンネルに適当に投稿します。
今回は架空の問い合わせを投稿してみました。
リンクをコピーし、URLからメッセージのをタイムスタンプを確認します。
1 |
https://hoge.slack.com/archives/XXXXXXX/p1234567890123456 |
URLの一番最後、pの後の16桁の数字で、右から6つ目と7つ目の間にピリオドを打ったものがタイムスタンプです。
1 |
1234567890.123456 |
Add a stepでSlackを選択し、Eventには「Send Channel Message」を指定します。
Accountでは使用する自身のアカウントを連携させます。
Actionで、Slackにメッセージを送る際の設定をしていきます。他の項目はお好みで設定しましょう。
- Channel 内部用チャンネルを選択
- Message Text お好みの文章と作成したページのURLを選択
- Thread パラメータに指定したtsを選択
これでテストすると、Slackに作成されたNotionのページ付きで投稿がされました!
これでZapierのワークフローは完成なので、Publishしておきます。
Slack botの実装を行う
やっていることは、「slackアプリに対してメンションが飛ばされた時、特定の文章を含んでいたら、ZapierのURLを叩く」です。
アプリの起動部分などは省略しています。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
// Slackに投稿された文章の中から問い合わせの本文を抽出する const getElementsBetween = ( array: Array<string>, startFlag: string, endFlag: string, ): string[] => { let outputArray: Array<string> = []; let startCollecting = false; for (let i = 0; i < array.length; i++) { // startFlgが見つかったら、startCollectingをtrueにする // startFlgの要素は配列に入れないためcontinue if (array[i] === startFlag) { startCollecting = true; continue; } // endFlgが見つかったら、startCollectingをfalseにする if (array[i] === endFlag) { startCollecting = false; } // startFlgとendFlgの間の要素を配列に入れる if (startCollecting) { outputArray.push(array[i]); } } return outputArray; }; // Zapier URLを呼び出す const createQaDb = (title: string, detail: string, ts: string) => { const uri = `https://hooks.zapier.com/hooks/catch/XXXXXX/XXXXXX/?title=${title}&detail=${detail}&ts=${ts}`; const encoded = encodeURI(uri); return fetch(encoded) .then((res) => { console.log('問い合わせDB作成'); }) .catch((error) => { console.error(`問い合わせDB作成失敗:${error}`); }); }; // botの処理 // アプリにメンションが飛んだ時に実行 app.event('app_mention', async ({ body }) => { // もし投稿の中に「Notion DBにコピーしてください」という文言が含まれていたら if (body['event']['text'].includes('Notion DBにコピーしてください')) { // bodyのメッセージから必要な情報を取得 const text = body['event']['text']; const textArray = text.split('\n'); const title = textArray[3]; const detailArray = getElementsBetween( textArray, '■問い合わせ詳細', '■いつまでに回答が必要ですか?', ); const detail = detailArray.join('\n'); // 本文、タイトル、タイムスタンプ情報を持たせてZapier URLを呼び出す createQaDb(title, detail, body['event']['ts']); } }); |
これで
- チャンネルに問い合わせが投稿されると
- 内部用チャンネルに内容が転送され
- その情報を基にNotion DBに新しくページが作成され
- そのページが内部用チャンネルのスレッドに通知される
ようになりました!
最後に
以前の記事に引き続き、Slackワークフロー+Boltを使って作成したbotアプリを組み合わせた活用例を紹介しました。
今回はZapierを活用することで、SlackだけではなくNotionとの連携も簡単に行うことができました。
SlackワークフローもZapierも、完全にノーコードで様々な作業を自動化させることが可能です。
特にSlackワークフローは2023年6月に新バージョンの提供が開始されたそうです。
まだ新バージョンの方は触れていないため、何か業務に活用できないか模索していきたいと思います。