本記事を読んでできること
- Forms(フォーム)へ送信された情報を自動でTeamsチャネルに投稿する
- アップロードされたファイルを投稿メッセージにハイパーリンク形式で含める
- アップロードされたファイル数が1つでも複数でも問題なく動作させる
事前準備
Power Automateで自動投稿フローを作成する前に以下を準備します。
- ファイルをアップロードするフォーム(Forms)
- ファイルの投稿先となるチャネル(Teams)
ここではFormsの作成についてだけ少し触れておきます。
Formsの作成
動作確認のためにフォームを用意します。ここでは以下のように、ファイルをアップロードするだけのシンプルなフォームを作成します。
フォームを作成したら、[回答を収集]をクリックしてください。

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

コピーしたURL(以下、サンプル)に含まれる「id=」以降の文字列は、Power Automateのフローでこのフォームを指定する際に使用するのでメモしておきます。
|
1 |
https://forms.office.com/Pages/ResponsePage.aspx?id={フォームID} |
[リンクをコピー]する前に、[URLを短縮]にチェックを入れないでください。チェックを入れると、フォームIDが含まれないURLになるためです。
Power Automateフローの作成
Formsにアップロードされたファイルを自動投稿するためのフローを作成します。先にフローの全体像を示しておきます。以降の節でステップごとに説明していきます。

新しい応答が送信されるとき
フローの先頭にトリガー([Microsoft Forms] > [新しい応答が送信されるとき])を追加します。
- [フォームID]欄:[カスタム値を入力する]を選択します。その後、先ほどメモしておいたフォームのIDを貼り付けます。

応答の詳細を取得する
トリガーとなったフォームの情報を取得するためのアクション([Microsoft Forms] > [応答の詳細を取得する])を追加します。
- [フォームID]欄:(省略。前ステップ(トリガー)を参照)
- [応答ID]欄:動的な値として、[新しい応答が送信されるとき] > [応答ID]を選択します。

JSONの解析
ここから最後のアクション(チャットまたはチャネルでメッセージを投稿する)までは、Formsにアップロードされたファイルパスを取得するためのアクションです。
ファイルパスを含むJSON形式のデータを確認
アクションを追加する前に、実際にファイルパスが含まれるJSON形式のデータを確認します。
一旦これまでに作成したトリガーとアクションのみでフローを保存し、フローの動作テストを行います。フォームにファイルをアップロードし、[送信]を実行してください。
次にPower Automateフローの実行履歴から今実行したフローの動作結果を確認します。

[応答の詳細を取得する]アクションをクリックし、未加工の出力を表示します。

未加工の出力を表示すると、以下のようにJSON形式のデータが確認できます。bodyのxxxxxxxxxxxxxxxxxxxxキーの値が、アップロードしたファイル情報を示しています。
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "statusCode": 200, "headers": { "(ヘッダー情報は省略)":{} }, "body": { "responder": "yyyyyyyyyyyyyyyyyyyy", "submitDate": "MM/DD/YYYY hh:mm:ss PM", "xxxxxxxxxxxxxxxxxxxx": "[{\"name\":\"Sample1.pdf\",\"link\":\"https://xxxxxx.sharepoint.com/sites/{Teams名}/Shared%20Documents/{途中の文字列は省略}/Sample1.pdf\",\"id\":\"yyyyyyyyyyyyyyyyyyyy\",\"type\":null,\"size\":283336,\"referenceId\":\"yyyyyyyyyyyyyyyyyyyy\",\"driveId\":\"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\",\"status\":1,\"uploadSessionUrl\":null,\"badgerToken\":null}]" } } |
xxxxxxxxxxxxxxxxxxxxキーの値を改行して表示すると以下のような構造になっています(値に含まれる\は削除)。先頭行と最終行の[ ]は配列を意味し、配列に含まれる{ }は各ファイル情報を格納するオブジェクトです。
このオブジェクトデータをコピーしたら次の作業に進みます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "name":"Sample1.pdf", "link":"https://xxxxxx.sharepoint.com/sites/{Teams名}/Shared%20Documents/{途中の文字列は省略}/Sample1.pdf", "id":"xyyyyyyyyyyyyyyyyyyyy", "type":null, "size":283336, "referenceId":"xyyyyyyyyyyyyyyyyyyyy", "driveId":"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "status":1, "uploadSessionUrl":null, "badgerToken":null } ] |
アクションを作成する
ファイル情報を格納するJSON形式のデータを解析するためのアクション([データ操作] > [JSONの解析])を追加します。
- [Content]欄:動的な値として、[応答の詳細を取得する] > [申請書]を選択します。
- [Schema]欄:[サンプルペイロードを使用してスキーマを生成する]をクリックし、コピーしておいたオブジェクトデータを貼り付けます。[完了]をクリックすると、本欄にスキーマが入力されます。

参考までに生成されたスキーマを以下に記載します。本スキーマを[Schema]欄に直接貼り付けても動作しますが、最新のデータ構造を基に、前述の手順でスキーマを自動生成する方が確実かと思います。
|
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 |
{ "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": {}, "badgerToken": {} }, "required": [ "name", "link", "id", "type", "size", "referenceId", "driveId", "status", "uploadSessionUrl", "badgerToken" ] } } |
変数を初期化する
ファイルパスを格納するための配列変数を作成するアクション([変数] > [変数を初期化する])を追加します。
- [名前]欄:本手順では[FileLinks]という名前にします。
- [タイプ]欄:[配列]を選択します。
- [値]欄:空のままにします。

それぞれに適用する
複数ファイルがアップロードされる場合を想定し、ここではループ処理を用いて各ファイルパスを配列変数に格納します。
まずループ処理を行うアクション([コントロール] > [それぞれに適用する])を追加します。
- [前のステップから出力を選択します]欄:動的な値として、[JSONの解析] > [Body]を選択します。

配列変数に追加
ループ処理中に各ファイルパスを配列変数に格納するためのアクション([変数] > [配列変数に追加])を追加します。
- [Name]欄:作成した配列変数(本手順では[FileLinks])を選択します。
- [Value]欄:以下の値を入力します。
{ }内には動的な値として、[JSONの解析] > [Body link]と[Body name]をそれぞれ選択し挿入します。- <a href=”
{Body link}” class=”editor-link”>{Body name}</a>
- <a href=”
なお、[Value]欄に入力した値をコピー&ペーストすると以下のようになります。[name]はファイル名を意味し、[link]はそのファイルパス(URL)になります。
|
1 |
<a href="@{items('それぞれに適用する')['link']}" class="editor-link">@{items('それぞれに適用する')['name']}</a> |

チャットまたはチャネルでメッセージを投稿する
最後にTeamsチャネルへファイルを投稿するアクション([Microsoft Teams] > [チャットまたはチャネルでメッセージを投稿する])を追加します。
- [投稿者]欄:[フローボット]を選択します。
- [投稿先]欄:[チャネル]を選択します。
- [チーム]欄/[チャネル]欄:投稿先のチーム/チャネルを選択します。
- [メッセージ]欄:以下の式を入力します。配列変数に含まれるファイルを改行して出力します。
- join(variables(‘fileLinks’), ‘<br>’)

動作確認
Power Automateフローが完成したので試しにフローを動かしてみます。
フォーム上で2つのファイルをアップロードし、[送信]をクリックします。

以下のようにTeamsのチャネルにファイルが投稿されました。また、ファイル名をクリックすると、実際のファイルにアクセスすることができました。

以上、ここまで。

