MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Automate で SharePoint リストの添付ファイルを通知にのせる方法

f:id:mofumofu_dance:20210204175355p:plain

Qiitaで質問が出ていたものへの回答です。

Power Automate を利用して、SharePoint リストに添付されたファイルを通知したい - リンクを送りたい または ファイルそのものを添付したい - という要望はたびたび見かけます。

ここでは代表的と思われる3つの通知方法について、Power Automate でどう対応するかを紹介していきます。

1. Flow bot から Teams に投稿

Power Automate から Teams にメッセージを投稿する場合には、『ファイルを添付する』ということはできません。

代わりに、ファイルへのリンクとファイル名を送ってあげるのが適当かと思います。

Flow bot として単純なメッセージを投稿する場合、または Adaptive Cards を利用する場合、 いずれもMakrdown によるテキスト装飾がサポートされているので、添付ファイル一覧からMarkdownのリストにするアクションを考えます。

f:id:mofumofu_dance:20210204170914p:plain
Markdown形式で添付ファイルへのリンク一覧を送るフロー

添付ファイルの取得アクションでは、添付ファイルのID, URL, 表示名 (拡張子込み) が配列として得られます。

[
        {
            "Id": "%252fLists%252fAttachment%252fAttachments%252f1%252f075.png",
            "AbsoluteUri": "https://sample.sharepoint.com/sites/PowerAppsTraining/Lists/Attachment/Attachments/1/075.png",
            "DisplayName": "075.png",
            "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListItemAttachment"
        },
        {
            "Id": "%252fLists%252fAttachment%252fAttachments%252f1%252ftest_font.csv",
            "AbsoluteUri": "https://sample.sharepoint.com/sites/PowerAppsTraining/Lists/Attachment/Attachments/1/test_font.csv",
            "DisplayName": "test_font.csv",
            "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListItemAttachment"
        }
    ]

一報でMarkdown としては以下のような形式に変換しておけばリストとして表示されるので、この間を選択アクションでつなぎます。

- [aaa](https://xxx.com)
- [bbb](https://yyyy.com)

ポイントは選択アクションの Map です。ここに以下のような式を挿入することでほしい文字列に変換されます。

@concat('- [',item()?['DisplayName'],'](',item()?['AbsoluteUri'],')')

f:id:mofumofu_dance:20210204171610p:plain
選択アクションの結果、文字列の配列が得られる

あとは Adaptive Card に含めるなり、そのまま Flow botのメッセージとして投稿するなりしてください。

2. HTMLのリストとして メール本文に挿入

メールでの通知方法の1つとして、リンクの送信を考えます。方法はほとんどMarkdownの場合と同様です。 HTMLであれば <li><a href="xxxx">file name</a></li> のような文字列を作ります。

アクションでは、選択アクションのMapのみ変更します。

@concat('<li><a href="',item()?['AbsoluteUri'],'">',item()?['DisplayName'],'</a></li>')

f:id:mofumofu_dance:20210204172302p:plain
HTMLの場合には<li><a>の構造を文字列結合で作る

最後に送るときには結合した結果を <ul>~</ul>で囲んであげればリストとしてメール本文に挿入されます。

f:id:mofumofu_dance:20210204172618p:plain
メール送信結果

3. メールの添付ファイルとして送信する

折角リストに添付しているので、そのリンクだけで十分だと思いますが、念のため添付ファイルのそのものを、添付ファイルとして送る方法も書いておきます。

これを実現するためには Pieter's method を利用します。

先ほどと同様、まずは添付ファイル一覧を取得しておきます。

その後、Apply to each のループ処理でまずは添付ファイルのコンテンツを取得します。

Pieter's method に従い、Outlook の添付ファイルに必要な形式に結果を加工します。

{
  "Name": @{items('Apply_to_each')?['DisplayName']},
  "ContentBytes": @{outputs('Get_attachment_content')?['body']}
}

ContentBytesの部分がコンテンツ取得した結果です。

このように、必要なJSONをループ内で作っておいて、ループの外でその結果を再度『作成』すると配列になります。

f:id:mofumofu_dance:20210204173519p:plain
添付ファイルコンテンツ取得と配列化

これで無事添付ファイル一覧の、ファイルそのものの配列ができたので、あとはこれをOutlookのメール送信アクションで送るだけです。

おわり

ファイルコンテンツを取得してファイルそのものをどこかに送るというケースはあまりないかもしれません。 その場合には添付ファイル一覧取得→選択アクション (リンク作成) で大体何とかなります。

ぜひApply to eachで苦しまず、選択アクションを使ってみてください!!