Formsで問い合わせを受け、それをTeamsに通知するフローを作成しました。
単純にTeamsに通知するだけであれば簡単にできますが、通知する際に添付ファイルのURLも通知できるようしました。
フローのダウンロード
フローはGitHubに公開しています。下記URLからダウンロードしてご利用いただけます。
全体像

全体像は簡単にこんな感じです。Formsに登録された内容をもとに、チャネルと登録者へ通知を行います。チャネルへの通知はFormsに通知先の質問を設け、その選択に応じて通知先を変更します。
また、通知する際には内容に加え添付ファイルの共有URLも一緒に通知を行います。
下記のFormsに登録をすると、

Teamsのチャネルと登録者本人に通知がされます。

添付ファイルは選択すると開くことができます。
Forms
Formsは下記のように作成しています。

Formsは個人で作る場合と、グループで作成する2通りの作り方があります。今回どちらにも対応できるよう、それぞれの作り方を紹介します。また、長期間利用するFormsの場合やチームで運用するFormsの場合はグループフォームで作成されることをおすすめします。作り方やグループフォームについては、下記の記事が分かりやすいので確認してください。
フロー解説
分割して解説していきます。



トリガーとして「新しい応答が送信されるとき」を設定し、フォームIDに作成したFormsを設定します。
フォームIDはドロップダウンから選択もできますが、グループフォームの場合は選択肢に表示されません。グループフォームの場合は、下記方法でフォームIDを確認して設定してください。

「新しい応答が送信されるとき」では詳細な情報が取得できない為、「応答の詳細を取得する」を設定して登録された情報を取得します。
フォームIDは先程と同じように設定し、応答IDには「新しい応答が送信されるとき」で取得した「応答ID」を設定します。
コピーしました!
@{triggerOutputs()?['body/resourceData/responseId']}
今回は通知先のチャネルを、Formsに登録された内容をもとに変更します。IDを任意に変更させられるよう、変数として扱います。同じように添付ファイルの情報についても、Formsに毎回添付されるとは限らない為、変数として扱い後続の処理をシンプルにします。
変数は全て文字列で値は空白で作成しておきます。

Formsに登録した人の名前を取得する為「ユーザーの検索 (V2)」を使用します。検索語句にはメールアドレスを設定しますが、アドレスは「応答の詳細を取得する」から取得できます。
コピーしました!
@{outputs('応答の詳細を取得する')?['body/responder']}Formsで「名前を記録する」をONにしておく必要があります。


Teamsへ通知を行いますが、Formsで選択された通知先に応じて通知先を設定します。Teamsのチャネルに投稿するにはチームIDとチャネルIDが必要ですが、ここでそれぞれ変数に設定していきます。
下記に例でを設定値を記載していますが、「raa3799e7254647d0a3cf983036f496b0」はフォームによって異なる為、実際には動的コンテンツから「応答ID」を選択してください。
コピーしました!
@{outputs('応答の詳細を取得する')?['body/raa3799e7254647d0a3cf983036f496b0']}
変数の設定では条件に応じて、通知を行うチームIDとチャネルIDをそれぞれ手入力します。チームIDとチャネルIDは下記記事に記載のPower Appsのアプリをダウンロードしてインポートすることで確認ができます。
Power Appsを使わずに確認する場合は下記記事の方法で確認ができます。

添付ファイルがある場合は添付ファイルのURLもTeamsで通知を行うため、添付ファイルのURLを作成します。添付ファイルが無い(True)の場合は何もせず、1つ以上添付されている場合にURLを作成しています。
条件には下記の様に設定することで、添付ファイルの有無を判定しています。empty関数で空白かどうかを確認しています。空白の場合「True」となり、なにか値がある場合は「False」となります。
コピーしました!
@{empty(outputs('応答の詳細を取得する')?['body/r3604874417984f6e93da3af27466b768'])}「r3604874417984f6e93da3af27466b768」はフォームごとに異なるので再設定が必要です。「応答の詳細を取得する」アクションの出力結果のJsonから添付ファイルのIDになります。

こちらの記事で詳細を解説されています。参考に確認して設定してください。

添付ファイルがある場合、Jsonの解析で値が扱えるようにします。
コンテンツには先程の条件で空白かどうかを確認した「@{outputs(‘応答の詳細を取得する’)?[‘body/r3604874417984f6e93da3af27466b768’]}」を設定します。
コピーしました!
{ "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "link": { "type": "string" }, "id": { "type": "string" }, "type": {}, "size": { "type": "integer" }, "referenceId": { "type": "string" }, "driveId": { "type": "string" }, "status": { "type": "integer" }, "uploadSessionUrl": {} }, "required": [ "name", "link", "id", "type", "size", "referenceId", "driveId", "status", "uploadSessionUrl" ] }
}共有リンクを作成し、Teamsに投稿する用に整形しますが、個人のFormsかグループフォームかで処理が異なります。先ほどの「JSON の解析-添付ファイル」の繰り返し処理を行い全ての添付ファイルの共有URLを作成し、文字列変数に追加していきます。

個人のFormsの場合、個人のOneDriveに添付ファイルは保存されます。そのためアクションもOneDriveのものを利用します。
ファイルにはJSON の解析で取得したidを設定します。リンクの種類やリンクスコープは適宜設定してください。上記の場合、リンクを知っている人全員に閲覧のみの共有リンクの作成となります。
グループフォームの場合は手順が異なります。パスから添付ファイルの情報を取得し、そこから共有リンクを作成しています。

グループフォームの場合、「TeamsチームのSPO > ドキュメント(もしくはShared Document)> アプリ > Microsoft Forms > フォーム名のフォルダ」に添付ファイルがアップロードされるので、ファイルパスを途中まで手動で設定し、パスの最後のファイル名はJsonの解析で取得したファイル名を設定します。

「パスによるファイル メタデータの取得」で取得したIDをもとに共有リンクを作成します。

取得したリンクやファイル名を文字列変数に追加します。最終的にアダプティブカードとして投稿するため、Json形式にしています。ファイル名とファイルURLを設定しています。
コピーしました!
{ "type": "TextBlock", "text": "[@{items('For_each')['name']}](@{outputs('共有リンクを作成する')?['body/WebUrl']})", "wrap": true
},アダプティブカードではURLは「[ファイル名](URL)」の形式にすることで、リンクとして投稿ができます。
この記事で紹介している画像などはOneDriveのものですが、SharePointの場合も同様に設定します。

ここでは先ほどの「文字列変数に追加」のJsonを調整します。先程の状態では最後の「}」の後にカンマ「,」がある状態になります。Jsonとして正しくない形の為、最後の「,」のみ取り除きます。
ifなどを使い末尾が「,」で終わっているかを判定し、
- 末尾がカンマならば、そのカンマを取り除いた文字列を返し
- そうでなければ 元の文字列をそのまま返す
という処理をします。
入力するコードはこちらです。
コピーしました!
if( equals( substring( variables('fileUrlText'), sub(length(variables('fileUrlText')), 1), 1 ), ',' ), substring( variables('fileUrlText'), 0, sub(length(variables('fileUrlText')), 1) ), variables('fileUrlText')
)
これまで取得や整形したデータをアダプティブカードとしてTemasのチャネルへ投稿します。チームとチャネルには変数を設定し、アダプティブカード部分には下記を設定しています。
コピーしました!
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.3", "body": [ { "type": "TextBlock", "text": "依頼者:@{body('ユーザーの検索_(V2)')?['value'][0]?['displayName']}", "weight": "Bolder", "size": "Medium" }, { "type": "TextBlock", "text": "依頼内容:@{outputs('応答の詳細を取得する')?['body/r9c1bbee18440475a8e6b0d4f521530f6']}", "weight": "Bolder", "size": "Medium" }, { "type": "Container", "items": [@{outputs('作成')} ] } ]
}
Formsに投稿した人にも通知を送っていますが、アダプティブカードの内容はほぼ同じです。添付ファイルのURLもそのまま流用できます。


