MoreBeerMorePower

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

SharePoint リストの画像列に Power Automate からアクセスする方法

f:id:mofumofu_dance:20210311004835p:plain

SharePoint リスト に2020年10月ころ?に追加された新しい画像列 に Power Automateからどうやってアクセスするか という内容です。

ここでは新しい画像列に関して詳細には解説しませんが、この列は少し特殊で、ローカルから画像を選択し、アイテムを保存するとリストにサムネイルが表示されます。

f:id:mofumofu_dance:20210310224500p:plain
画像列はPCから画像を選択して保存するとサムネイルがリストに表示される

この時、ファイルの実物はどこに置かれるかというと、Site Assets の中のリストIDで区別されるフォルダーに保存されています。

f:id:mofumofu_dance:20210310224833p:plain
画像列にアップロードしたファイルの保存先は Site Assets

ちなみにこのリストのIDですが、リストの設定ページを表示した際のURLに含まれています。ちょうど %7B ~~~~%7D で囲まれている部分になります。

f:id:mofumofu_dance:20210310225505p:plain
リストIDの取得方法

問題

問題はこの画像列、通常の Power Automate のアクション (アイテムの取得、作成、更新)からはアクセスできないんです。表示すらされません。

試しにアイテムの取得アクションを実行してみますが、やはり先ほどの画像列が表示されていないのが分かります (Pictureと見えているのはアイテム作成者の画像を表すプロパティです)

f:id:mofumofu_dance:20210310230532p:plain
画像列は標準的なアクションでは取得・作成できない

解決方法

こういう場合の解決方法はたいてい、SharePoint REST APIを利用することです。

実際、今回のケースでも SharePoint REST API を Power Automate から実行 (アイテムの取得) してみると、対象の画像列の情報が取得できることがわかります。

アイテムの取得

単一のアイテムを取得する場合には、「SharePoint への HTTP要求」アクションで、以下のようにUriをセットします。

_api/web/lists/GetByTitle('リスト名')/items(アイテムID)

f:id:mofumofu_dance:20210310233815p:plain
SharePoint REST APIを利用すると画像列の情報を取得可能

そうすると、返却されるデータの中に今回の画像列 (Photo) が含まれることが確認できます。

この列の値ですが、ちょうど以下のようなJSONを文字列化したものであることがわかります。

{
    "type": "thumbnail",
    "fileName": "025.png",
    "nativeFile": {},
    "fieldName": "Photo",
    "serverUrl": "https://xxxxxxx.sharepoint.com",
    "serverRelativeUrl": "/teams/QuickVerify/SiteAssets/Lists/28f96e23-36d1-4872-a3ce-eefcce7951ff/025.png",
    "id": "d8414030-0443-4b28-afd7-7f5965c7608b"
}

serverUrlはそのまま、SharePoint のURLですね。 serverRelativeUrl は先ほどみた Site Assetsの画像ファイルへのパスになっています。 IdはファイルのユニークID

これらを文字列にして、ダブルクォーテーション ( " ) を バックスラッシュでエスケープした文字列が画像列に入っているわけです。

これで画像列の情報取得ができました。

アイテムの登録

次に登録方法です。

画像列になにを設定すればいいのか形式はわかりました。 あとはその文字列を作りだせば、同じく SharePoint REST API を利用することで設定もできるはずです。

問題はファイルのユニークIDです。普通に「ファイルのプロパティ取得」を行っても、このIDは取得できません。

このため、ユニークIDの取得には「ファイルのメタデータ取得」アクションを使います。

これはメタデータ取得アクションの結果に含まれる Etag のプロパティに、まさに画像列のデータを作成するのに必要な "id" が含まれているからです。

f:id:mofumofu_dance:20210311002135p:plain
ファイルのユニークIDは「メタデータ取得」アクションを利用

実際には余分な文字列がくっついているので、以下の式を利用して、ファイルのユニークIDだけを抽出します。

toLower(replace(split(outputs('Get_file_metadata_using_path')?['body/ETag'],'}')?[0],'"{',''))

以上で送信するボディのほとんどができました。あとは「SharePoint へのHTTP要求」アクションで新規アイテムの登録を行うだけです。

アイテム登録の場合には以下のUriを利用します。

_api/web/lists/GetByTitle('リスト名')/items

またメソッドはPOST、ヘッダーには以下を設定します。

キー
Accept application/json;odata=verbose
Content-Type application/json;odata=nometadata

登録のためのフローとしては以下の3ステップになります。

f:id:mofumofu_dance:20210311002829p:plain
アイテム登録フロー

アイテム更新

更新もほとんど同じですが、Uriとヘッダーが変わります。

Uri

_api/web/lists/GetByTitle('リスト名)/items(更新対象のアイテムID)

ヘッダー

キー
Accept application/json;odata=verbose
Content-Type application/json
If-Match *
X-HTTP-Method MERGE

あとは登録と同様、ボディを作ってPOSTするだけです。

ボーナス

この方法のボーナスは、Site Assets のファイル以外も画像列に設定できることです。

ファイルメタデータ取得の対象ライブラリを変えて、serverRelativeUrl に入るパスを変更すれば 通常の Shared Documents のファイルも画像列に設定できます。

f:id:mofumofu_dance:20210311003707p:plain
Site Assets以外のファイルも指定可能

おわり

新しい列が出てきてアクションが対応するまでは、だいたいREST APIを実行すればなんとかなることが多いです。

Power Automate でも標準アクションとして「SharePoint へのHTTP要求」アクションがありますので、これを活用するとやりたいことが実現できるかもしれません。

なお、REST APIについては以下のDocsにほとんど書いてあります。

docs.microsoft.com