今回は各種問い合わせ対応をForms、Power Automate、Excel、Teamsを組み合わせて効率化する方法を紹介します。珍しくD365BC以外の投稿をしようと思った背景は2つあります。1つ目は10月から現職でR&D長に加えて情シス長を拝命したこと、もう一つはUdemyでMicrosoft Formsのコースを公開したことです。
Udemy:仕事の生産性を上げるためのMicrosoft Forms入門 | Udemy
コースを作り始めたのが1年前の年末で、3か月くらいで仕上げる予定がコロナ禍や仕事が忙しくなったり何だかんだあって、途中で100回くらい心折れつつ1年も掛けてしまいました。。1年もかけてしまったせいで最初のほうは今ある機能がなかったりしますが(SaaSあるあるw)、無料ということでご容赦くださいませ。
さて、本題です。Udemyのコースの中で「Formsの活用事例」として紹介したものになりますが、実際に自社でも実戦投入しています。情シス長になる1年くらい前から使っていた仕組みを少し肉付けして情シス宛ての問い合わせ管理システムとして使っています。もう少しアレコレしたい部分もありますが、まあまあ実用に耐えると思いますので適当にアレンジして使っていただければと思います。
概要
問合せ者にはFormsで問合せを起票してもらいます。問合せはExcelで一覧管理したいのでSharePoint上に配置した問合せ一覧ExcelにPower Automateを使って問合せ内容を転記させます。問合せがあるとメールも送信し、並行してTeamsのチャネルに投稿します。Power Automateから自動送信させたメールを起点に情シスと問合せ者がやりとりを行い、情シス内の相談はTeamsチャネル内で行う、というような使い方を想定しています。Teamsチャネルで問い合わせ管理がしやすいよう、各種タブを追加します。(Formsの素データを見たり、問合せ一覧のExcelを見たり、Power BIで回答状況サマリを見たり)
目次
- Formsで問い合わせフォームを作成する
- 問合せを転記する一覧Excelを用意する
- Formsで回答があったらExcelに転記するクラウドフローを作成する
- クラウドフローの拡張(URL処理)
- クラウドフローの拡張(メール送信)
- Apply to eachの処理をスッキリさせる
- クラウドフローの拡張(Teamsに投稿)
- Teamsチャネルの拡張(タブ追加)
1.Formsで問い合わせフォームを作成する
まずはFormsで問合せ起票用のフォームを作ります。問い合わせの件名、詳細が最低限必要です。スクショがあるとその後の対応が楽になります。ですが、Power Automateは処理が込み入ってきます(後述)。問い合わせ種別はお好みで。実務上は複数システムを一つのフォームでまとめて受けるので、問い合わせ対象システムを選択させるとよいと思います。

プレビューから何件かサンプルで投稿してみてから結果をExcelダウンロードします。

このように起票された問い合わせが一覧でExcelに吐き出されます。これをそのまま管理に使えればこんなに楽なことはないのですが、このファイルはローカルPCにダウンロードされたファイルでしかないので管理には使えません。このままでは情シスメンバー全員で共有できないですし、このファイルをSharePointとかに格納して共有したとしても問い合わせが1件追加されるとまたダウンロードし直してSharePointに格納しなおす必要が出てきます。それは手間がかかりすぎて避けたいです。

2.問合せを転記する一覧Excelを用意する
ということで、問い合わせ内容を情シスメンバー全員で共有できるようにSharePoint上に問い合わせ管理一覧Excelを作成します。チームを作って、、

フォルダを作ってExcelを作ります。

先ほどFormsの回答結果をダウンロードしたExcelからコピペして一覧を作成します。さらに、問い合わせの進捗管理などで使う項目( ステータスとか担当者とか回答内容とか )を追加します。一覧全体をテーブルとして定義しておきます(重要)。(ここではQAListという名前でテーブル定義)

3.Formsで回答があったらExcelに転記するクラウドフローを作成する
いよいよPower Automateの出番です。Formsの応答をトリガーとするクラウドフローを作成します。応答IDの取得は定石ですね。

次にExcelに転記するためのExcelの「表に行を追加」アクションを追加します。SharePointのサイト、ライブラリ、ファイル、テーブル名を順に指定します。

問い合わせ一覧Excelの各項目を編集します。ID、開始時刻、メール、問合せ種別、問合せ内容は迷わず設定できますが、、問合せ者の名前はFormsの応答結果から取得できません。。

名前はOffice365のアクションを使って取得することにします。Excelのアクションの前にFormsのResponder’s Emailをもとにユーザープロファイルを取得するアクションを追加します。これでExcelのアクション中で名前に表示名をセットすることができます。

次は添付ファイルです。一見するとこれでよさそうですが、、実はうまくいきません。が、百聞は一見にしかずなので一旦これで進めてみます。保存して「テスト」で実行してみましょう。

試しにFormsから回答してみます。添付ファイルも忘れずに。

回答しました。

クラウドフローが実行されました。成功したようです。

問い合わせ一覧Excelを見てみます。無事に行が追加されました。が、添付ファイル列は微妙ですね。。ほしいURLは添付ファイル列に含まれていますが、前後に余計な文字列が入っています。これは取り除きたいところです。

ちなみに、URLは正しいです。URLだけコピーしてブラウザの別タブで見るとアップロードしたスクショ画像を見ることができています。

4.クラウドフローの拡張(URL処理)
ExcelにURLの部分だけ書き込まれるようにクラウドフローを修正します。URL前後の文字列はどう見てもJSONなので、JSON解析アクションをExcelへの行追加アクションの前に挿入します。インプットとしてFormsの「添付ファイル」をJSON解析アクションの「添付ファイル」に指定します。

スキーマの「サンプルから生成」ボタンをクリックし、先ほどのExcelファイルの「添付ファイル」セルの文字列をコピペします。

JSONの構造が解析されました。

続いて、Excelの行追加アクションの「添付ファイル」の項目にカーソルを当てると選択肢にJSONの解析から取得可能な項目が表示されるので「link」を選択して設定します。

少し上にスクロールするとわかるのですが、Apply to eachが登場しています。これは添付ファイルが複数存在する可能性があるからです。今回作成したFormは添付ファイル1個のみで作成しましたが、複数添付も可能なので添付ファイルの情報は配列になります。Apply to eachの処理は後程すこし手当しますが、一旦ここまでで保存してテスト実行してみましょう。

テストには先ほどのデータを使うとよいです。

成功しました。

一覧Excelを見てみましょう。URLの文字列のみがセットされているのがわかります。成功です。(本当は、ファイル名を文字列としてセットし、リンクとしてURLがセットされているのがよいのですが、、Power Automateでそういう設定をする方法がわからず断念しました。実務上はExcelのセルにカーソル当ててF2で編集モードにしてEnterを押すとハイパーリンクが生成され、それをクリックすると添付ファイルを見に行けるのでそれで特に困ることはないです。)

5.クラウドフローの拡張(メール送信)
続いて、メールの送信を実装します。Excelの行追加アクションと並行する処理として定義します。

宛先は最終的には問い合わせ対応する部署(情シスとか)のグループアドレスがよいでしょう。件名にタイトルだけでなくIDを入れておくと実運用上便利です。本文にはExcelに転記する項目を適宜セットします。で、問題は添付ファイルリンクです。

まずはシンプルにJSON解析結果の「link」を設定してみます。

テスト実行します。

無事にメールは送信されました。が、、URLがプレーンテキストとして記載されているだけです。毎回コピペしてブラウザ起動して貼り付けるのは面倒なので、ハイパーリンクでメール本文に埋め込みたいところです。

Outlookのメール送信アクションの本文にリンクを挿入する機能があります。これを使ってみます。

リンクのタイトルやURLを指定できるのですが、残念ながらここは手でベタ打ちするしかなく、JSONの解析で取得したURLは変数としてセットできません。が、あきらめるのは早いです。まずは手打ちでリンクタイトルとリンク先URLをセットします。

続いて本文中のリンクボタンの横の「</> コードビュー」ボタンをクリックします。

するとこのようにソースコードが表示されます。要はHTMLです。

先ほど手でベタ打ちしたリンクタイトルやリンク先URLをJSON解析結果の変数に置き換えます。

テストします。

無事に添付ファイル部分がハイパーリンクになったメールが送信されました。

リンクをクリックすると確かにアップロードしたスクショを見ることができます。

6.Apply to eachの処理をスッキリさせる
さて、フローを眺めているとApply to eachが2か所登場していることに気づきます。添付ファイルを1個に限定している限り、ループの処理は1件しか実行されないのですが、、ユーザーからの要望で添付ファイルを複数アップできるようにしてくれと言われてFormを変更したとたんメールが複数飛んだりExcelに複数行飛んだりするのは嫌だなぁと思うわけです。現実にそういう問題が起きたらExcelの行を消したら良いだけなのでさほど実害はないのですが、なんとなく「Formsの応答1件に対してExcelが1行だけ作成されてメールは1件だけ送信されるべきで、そうではないデータモデルになっているのが気持ち悪い」という感覚があります。ということでApply to Eachの外に出す対応をします。

Apply to eachが発生する原因はFormsがファイル複数件アップできる仕様に起因しており、この問合せFormでは添付ファイル1件に限定しているわけなので、添付ファイルのURLが1件しか作成されないように先に手当しておきます。
具体的にはデータ処理のアクションで変数’FileURL’を定義し、JSON解析で作成された「link」を初期値設定します。

linkをセットした瞬間 Apply to each が登場します。

ついでに名前も変数化しようと思って以下のように指定すると、 エラーになります。同じ Apply to each の中には入れられない模様。残念。

以下のように別のApply to eachを作る手もありますが、できれば1回で済ませたいところ。

やり方を少し変えます。ファイルURLとファイル名の変数を先に定義しておきます。初期値はいずれも指定なし。

そのうえで「変数の設定」アクションを使ってJSON解析で取得したファイルリンクURLとファイル名をセットします。これで1個のApply to eachの中に入りました。

JSON解析で取得したファイル名、ファイルリンクを指定していた部分を変数で置き換えます。

Excelとメールを囲んでいるApply to eachは最早不要なので削除します。まずはExcelのアクションをドラッグしてApply to eachの上にドロップします。

こうなります。メールの送信も同様にやります。ExcelアクションがApply to eachの外に出たのでApply to eachを削除します。メールも同様です。

こうなります。

これで少しすっきりしました。

テスト実行してみましょう。

問題なく成功しました。

メールも1件だけ送信されています。添付ファイルのリンクも正しく生成されています。いい感じです。

7.クラウドフローの拡張(Teamsに投稿)
続いてTeamsに投稿するよう拡張します。先にTeamsチャネルを作っておきます。

Teamsチャネルに投稿するアクションを以下のように設定します。添付ファイルリンク指定の仕方はメール送信と同じです。

テスト実行します。

成功です。

このように投稿されました。

Teamsのこのチャネルは情シスメンバーが見る想定で、ここで対応方法を内部で会話するのが良いです。問い合わせ1件につき1件のスレッドができてそこで会話のチェーンが履歴として残る感じです。上のクラウドフローで問い合わせID情報を入れるのを忘れてしまいましたが、問い合わせIDを入れておくと検索が簡単です。問い合わせ者との会話もメールではなくてTeamsでやりたいところですが、、問い合わせ者と情シスメンバーしか見れないようにする簡単な良い方法が思いつかず、あきらめてメールにしました。(問い合わせ内容に人事情報とかセンシティブなデータが時々入ることもあり、全員が閲覧可能なTeamsチャネル上で問い合わせ者と会話する訳にはいかないんですよね。。)

8.Teamsチャネルの拡張(タブ追加)
最後はオマケです。情シスメンバーはTeamsで問い合わせの管理を行うので、タブに色々と追加しておくと便利です。
例えば、Formsの問い合わせ結果をタブに追加します。

こんな感じで見ることができます。実運用してみて分かったのですが、Power Automateが止まったりすることがあります。今日は問合せがなくて平和だな・・・と思ったらPower Automateが死んでるかもしれないと思ってココを見に行き、本当に問い合わせがなくて平和なのかどうかを確認してくださいw

一覧のExcelも追加しておきましょう。

画面の端で見切れてますが、問い合わせ対応が完了したらExcelのステータス列をここからクローズに変更するのが便利です。

ExcelのPivotを使うと担当者別ステータス別の対応状況を一望できます。これで進捗管理できます。

もちろん、Teams上でも確認できます。

もう少し頑張るなら、Power BIで問い合わせ状況のレポートを作成して、、

TeamsのタブにPower BIのレポートを表示されることもできます。(レポートビジュアルのセンスがないのはご容赦!)

まとめ
Formsの良いところは社外からの問い合わせも受け付けられる所ですね。問い合わせの入り口をPower Appsにしてしまうと途端にハードルが上がります。(Power Pageとかいう手もあるのでしょうが、ライセンスとか手間とか色々と大変でしょう。)なので、この仕組みは営業・マーケ部門でも使える仕組みだと思います。
管理一覧がExcelなのが微妙といえば微妙で、ちゃんとやるならDataverseで問い合わせ管理テーブルを作ってアクティビティー項目追加して対応履歴管理したり、行レベルの権限制御で情シス+問い合わせ者だけが見れるようにすると…などと妄想は膨らむのですが、まあ何だかんだでExcelは便利だよねってことでこうしています。
自分的には80点くらいの出来かなと思いますが、これを見た方が良いアイデアを追加してアレンジして使ってもらえたらと思います。
Power Automateの処理のところはもっとスマートなやり方があるような気もするのと、ExcelのURL列はもうちょっと何とかしたいので、良いアイデアがあれば教えてほしいです。