本記事では、Teams内にListsを作成し、それをPower Automateで参照して応答文を生成する方法を紹介します。
前回の記事では、Microsoft TeamsとPower Virtual Agents for Teams(以下、PVA)のみを利用して簡単にチャットボットを作る方法を紹介しました。PVAのみで手軽にTeams内にチャットボットを導入できるため、簡易的なチャットボットを作るにはおすすめでした。
しかし、チャットボットの応答パターンが多くなりそうな場合や、リストから検索結果を返したい場合には直書きの方法は不向きです。
そこで今回は、Teamsの「Lists」に元データを記載しておき、Power AutomateでListsの中身を検索し、その結果をPVAに返すという方法を紹介します。
本記事は以下の方向けの記事となっております。
・チャットボットに応答させたい内容が多くなりそうな方
・応答の元となるデータをTeams内で管理したい方
今回の記事はかなり長くなっています。
PVA・Lists・Power Automateそれぞれの設定や、データの操作の手順を詳しく説明しているため、どうしても長文になってしまっています。ただ、この記事を見ながら設定すればBOTを作成することができるようかなり細かく説明していますので、ぜひ参考にしてみてください。
もし、直書きでもいいから簡単にチャットボットを作りたい方は、以下記事にて方法を解説していますのでそちらをご覧ください。
今回作成するBOTの概要
今回は、PVAを使用して以下のようなBOTを作ります。
- 【ユーザ】「でんわ」と話しかける
- 【BOT】「電話番号を検索します」(改行)「検索したい苗字をひらがなで入力してください」とBOTが応答する
- 【ユーザ】(上記発言に対して)ユーザが入力を行う ex.「さとう」
- 【BOT】入力した文字を検索する
- 【ユーザ】「(入力された文字)さんの電話番号は(XXXX)です」または、「(入力された文字)さんは登録されていません」と表示する
実現方法
前回の記事では、PVAフロー内に直接キーワードのフレーズを記載する方法を紹介しましたが、先述のとおり拡張性やメンテナンス性に難ありでした。
今回は、キーワードのフレーズと対応結果を先にリストとして作成しておき、入力メッセージに対する結果を返すような作りにします。
このような作りにすることで、拡張性とメンテナンス性を確保します。
実現のために使う3つのツール
これを実現するためには、以下3つのツールを使用します。
ツール名 | ツールの説明 |
---|---|
Power Virtual Agents (PVA) | チャットボットを作成できるツール |
Lists (Microsoft Lists) | Excelのような表をTeams内で作れるアプリ |
Power Automate | 業務を自動化するためのRPAツール |
上記のうち、「Lists」は馴染みがないという方も多いかと思います。Listsについて少し補足すると、Listsは正式名称を「Microsoft Lists」といい、2020年9月にリリースされたアプリです。Sharepointのリスト機能(Sharepoint Lists)をより使いやすくしたものと思っていただければ良いかと思います。
上記3つのツールを、Power Automateを軸にして連携することで、Listsのリストデータを取得し、そのデータをPVAがユーザへ返すことが実現できます。
3つのツール間の処理の流れ
PVAとPower Automate間のデータの流れや処理は、以下の図のようになります。

PVAでは対ユーザとのやりとりを実現します。ユーザが投稿したメッセージはinputデータとしてPower Automateに渡されます。このデータを検索条件として、Power AuomateがListsのなかを検索しに行きます。検索結果をoutputとしてPVAに返し、それをPVAがユーザへ応答メッセージとして返します。
このように、Power Automateが橋渡しとなり、3つのツールを連携することでリストデータ(Lists)からデータを取得するという流れを実現します。
以降で、前項で説明した内容を実際に実現するための具体的な手順を紹介します。
事前準備:TeamsのListsでリストデータを作成する
事前準備として、まずはBOTが参照するリストデータを作成します。
BOTを作成しようとしているチームのチャネルを選択し、「+」ボタンをクリックします。

検索キーワードに「Lists」と入力するか、一覧に出ているListsを選択します。

対象のチャネルに「Lists」が追加されます。

既存のリストからは、SharePoint Listsを追加することができます。本記事では、Teams上でリストを作っていきます。
新しくリストデータを追加する方法には、手動でリストデータを追加する方法と、Excelで追加する方法があるので以下でそれぞれの方法を解説します。
リストデータを手動で追加する方法
リストデータを手動で追加する場合には、まず「リストの作成」を押下します。

次に、「空白のリスト」を選びます。

リストの名前を入力し、右下の「作成」を押します。

タブに作成したリスト名で追加されていることが確認できたら、値を追加していきます。今回の例では、「氏名」「電話番号」のリストを作るため、列が2つ必要です。
デフォルトでは「タイトル」行のみとなっているので、まずは列を追加します。

2列目は電話番号を登録しておきたいので、名前を「電話番号」にします。

あわせて、1列目の列名も変更しておきます。

次に、「新規」を押してデータを入力します。


複数行まとめて入力したい場合には、「グリッドビュー」から操作します。

これで、Teams内にリストデータを作ることができました。

リストデータをExcelから追加する方法
リストデータは、Excelから追加することも可能です。
まず、Excelでデータを作成します。

リストデータとしてTeamsのListsに取り込むにはテーブルにする必要があるため、対象となるデータ範囲を選択し、「挿入」タブの「テーブル」を選択します。

選択した範囲がテーブルになりました。

列名が「列1」「列2」となっているので、列名も変更しておきます。(TeamsのListsでも変更できるので、インポート後に変更しても良いです)

TeamsにListアプリを追加し、「リストを作成」で「Excelから」を選択します。

「ファイルのアップロード」を押下し、作成したExcelファイルを指定します。

内容を確認の上、リスト名等を設定して「作成」を押下します。

ExcelファイルからのLists作成は以上で完了です。
PVAでチャットボットを新規作成する
前回記事と同様に、チャットボットを新規作成します。
Teamsのフィード欄を隠してPVAを全画面表示にする
作成完了するとTeamsの通知が届き、それを押下するとPVAの画面に遷移しますが、左側のフィード部分が表示されていて編集エリアが狭くなってしまっています。

そこで、左側メニューのPVAのアイコンを押下し、「チャットボット」タブ→該当のチャットボットから開いて作成するようにします。

PVAでフローの設定をする
フローの内容は以下のように設定します。後程、以下のフローにアクションを追加していきます。PVAのフロー設定手順については、過去記事にて詳しく解説しています。

Power Automateのフローを作成する
PVAのフローで、「質問」アクションと終了のあいだにカーソルを当てると「ノードの追加」と表示されるので+マークを押下します。

「アクションを呼び出す」→「フローの作成」をクリックします。

これにより、Power Automateの画面に遷移します。
このとき、「変更した内容は破棄されます」と表示されます。フローが保存できているか確認の上、「終了」を押下します。

【注意:2つ以上アクションがないとフローを保存できない】
フローの保存は、フローのアクションが一か所以上繋がれていないと保存することができません。
以下の図では、「トリガーフレーズ」のみで、次のアクションが設定されていないため、右上の保存ボタンが不活性となっています。このままPower Automateに遷移するとこのフローは保存されません。

なので、アクションを追加してフローが繋がった状態にして「保存」を押下します。

追加したアクション間で「+」マークを押下し、そこで「フローの作成」を押下します。

Power Automateテンプレートの選択
表示されているPower Automateのテンプレートから、「Power Virtual Agents テンプレート」を選択します。

テンプレートを選択すると「Power Virtual Agents」「Return Value(s) to Power Virtual Agents」というアクションが表示されているかと思います。

それぞれ、「入力の追加」と「出力の追加」と記載がありますが、入力というのはPVAからの入力、出力というのはPVAに返す値となります。テンプレートにはデフォルトでこの2つのアクションが設定されており、この間にデータを検索したり編集するなどの処理を加えていくことで目的を実現します。
PVAから渡された値をPower Automateで受け取る
先に載せた処理の全体図でいうと、赤枠の箇所になります。Power Automateでは、PVA側で入力された値を「ユーザー入力」として受け取ります。

「入力の追加」ボタンをクリックして、PVAから受け取った値を格納する変数を作成します。
PVAからは、文字列を受け取っているので、「テキスト」を選択します。

変数名と説明文が入力できますので、値を入力します。
今回は変数名を「PVA_input」とし、説明文は「PVAから受け取った値」とします。

Output用の変数を作成
次に、PVAへ値を返却する用の変数を作成しておきます。
「アクションの追加」を押下します。

検索窓に「変数」と入力し、「変数を初期化する」を選択します。

変数名は「output_data」、電話番号(080-XXXX-XXXX)を返すので種類は文字列を設定します。

Listsから該当のデータを取得する
ユーザが入力した値をもとに、Listsの該当のデータを取得します。全体図では以下の部分になります。

複数の項目の取得
リストデータは本記事の「事前準備:TeamsのListsでリストデータを作成する」で作成したものになります。例えば、ユーザが「さとう」と入力した場合、「080-XXXX-YYYY」を返却するようにしたいです。

上記を実現するには、Power Automateの「複数の項目の取得」というアクションを追加します。「複数の」とありますが、今回のように一つの値のみ取得することも可能です。
Teamsで作成したListsはsharepoint上でも参照でき、Power Automateはsharepointのリンクをもとにリストデータを見に行きます。

フィルタークエリの設定
ユーザが入力した値をもとに、リストデータから該当の値を取得する必要があるため、「フィルター クエリ」を設定します。フィルタークエリを使うと、SharePointのリストから条件を絞り込んで取得することができます。
「複数の項目の取得」アクションの左下に表示されている「詳細オプションを表示する」を押下すると、以下のように表示されます。

フィルタークエリには、リストデータをフィルタリングする条件を設定します。今回は、「Title eq ‘PVA_input’」と指定しています。

「Title」というのは、「名前」列のことです。SharePointのデータとしては、1列目のカラムは「Title」という名前で保持されているようです。

また、カラム名を日本語にすると、SharePointのデータとしては「OData」という形に変換されていました。カラム名をそのまま取りたい場合には、Listsの列名を英語名にしたほうが良さそうです。
"Title":"さとう","OData__x96fb__x8a71__x756a__x53f7_":"080-XXXX-YYYY",・・・・ "Title":"たなか","OData__x96fb__x8a71__x756a__x53f7_":"090-XXXX-XXXX",・・・・
フィルタークエリに設定する検索条件は、文字列にする必要があるため、以下のように変数をシングルクォーテーションで囲います。

取得したデータを変数に設定する
Listsから該当のデータを取得したら、それを変数に格納します。
「変数の設定」アクションを追加します。

「名前」には先ほど定義したoutput_data、「値」には電話番号を設定します。

すると、以下のように「Apply to each」のなかに追加したアクションが設定されたかと思います。

リストデータは配列で取得されるため、配列に格納されている要素のぶんループで値を変数に設定します。今回は、「さとう」さんのデータが1件しか入っていないので、output_dataには「さとう」さんの電話番号が格納されます。
変数に格納された値をPVAに返す
さいごに、変数に格納された値をPVAに返します。

「Return value(s) to Power Virtual Agents」の出力追加を押下します。
電話番号(080-XXXX-XXXX)を返すので出力の種類はテキスト、タイトルには「output」、値には「output_data」を設定します。
作成したPower AutomateのフローをPVAに設定する
前項で、以下のようにPVAのフロー上でPower Automateのフローを作成をしました。しかし、この状態だと作成したPower AutomateのフローはPVAに紐づいていません。(紐づけされるものと思って、筆者もPower Automateのテストがうまく実行できず困りました)
PVAのフローにPower Automateを追加するには、いったんPower Automateのフローを保存して、PVAのフローで「アクションを呼び出す」から「Power Virtual Agents フロー テンプレート」を選択します。

「Power Automate 入力」というアクションが追加されますので、値を「input」にします。

こうすることで、ユーザが入力した値がセットされたinputをPower Automateに渡してフローを実行することができます。
Power Automateフローのテスト
テスト前にしなければならない設定
Power Automate上でテストをするには、前項の
- 作成したPower AutomateのフローをPVAに設定する
を設定しておく必要があります。設定がまだの方は、本記事の該当の手順にて設定をしておいてください。
Power Automateのフローをテストする
Power Automateのフローをテストするには、初回実行時は最初にボットのテストをする必要があります。画面左下の「ボットのテスト」を押下します。

以下のように、テストで検索する際の入力値を入れます。今回は「さとう」で対象のデータを取れるか確認したいので、「さとう」と入力しています。

この時点では、PVA上で「さとうさんの電話番号は〇〇です」とメッセージをユーザへ返す箇所は作成していないので、「さとう」と入力した時点でボットが終了することが確認できればOKです。
Power Automateのフローのテストで、「自動」を選択し、「最近使用したトリガーで、」の「成功」を選択して実行します。これで、ボットのテストで入力された値をもとにテストを実行できます。

最後のアクションが×になっているのは無視してOK
現段階では、最後のアクションの結果が「×」となり、「ActionResponseSkipped.」と表示されます。

これは、Power AutomateからPVAに値を返しているのに、PVA側でその値がどこにもセットされていないために発生する事象です。最後のアクション以外が「成功」になっていればいったん無視して進めます。
これでPower Automateのフローのテストは完了です。
PVAでPower Automateの出力値をメッセージに設定する
さいごに、Power Automateから返ってきた値をPVA側でメッセージに設定する部分を作成します(以下の全体図の赤枠部分)。

Power AutomateでListsから取得したデータは、PVAのフローに「output」という変数で渡されます。

この値をユーザにメッセージとして返すために、PVAのフローに以下のように「メッセージ」アクションを追加します。

「{x}input」にはユーザからの入力値が入り、「{x}output」にはPower Automateで取得したリストデータの値が入ります。
PVAでボットのテストを行う
全ての設定が完了したので、PVAでボットのテストを行います。

名前から電話番号を検索するBOTが完成しました。
チャットボットを公開する
作成したBOTをチャネルに公開します。
PVAの左側メニューから「公開」を押します。

「公開」を押して、そのあとさらにモーダルが出たら再度「公開」を押します。


少し経つと、「公開したボットの準備ができました」と表示されます。

TeamsのチャネルでBOTを使ってみる
通常であれば、「Teamsでボットを開く」を選択すれば、公開したBOTとのチャット画面に遷移し、テストを行った時と同様に会話形式で進めることが可能です。

しかしながら、原因は不明ですが、遷移することができない場合があります(筆者の環境では、自分だけがメンバーのチャネルの場合に発生)。
その場合、以下の方法で行うようにします。
BOTが公開されたら、他のユーザーが「ボットを利用可能にするボタン」をクリックします。

可用性オプションをクリックします。

リンクのコピーをクリックします。

コピーしたリンクをTeams内のチャット欄に貼り付け、発言をしたものをリンククリックするか、テキストエリアにリンク先を貼り付けた状態でCtrl+クリック等でリンククリックを行います。

リンクを開くと、作成したBOTについて、追加するか聞かれるので、追加ボタンをクリックします。

しばらくすると、左側のメニュー欄にBOTが追加され、BOTと会話が出来るようになります。

また、チャット欄にも同じように追加したBOTと会話できるようになります。

まとめ
今回は、Teams内にListsを作成し、それをPower Automateで参照して応答文を生成する方法を紹介しました。かなり手順が多く、Listsデータの扱いが特殊なため難しいと感じた方もいるのではないかと思います。
次回は、キーワード対する結果を記載したリストを定義したExcelをTeamsのチャネル内にアップロードし、そこからデータを取得する方法について紹介します。

コメント