SharePoint リスト に2020年10月ころ?に追加された新しい画像列 に Power Automateからどうやってアクセスするか という内容です。
ここでは新しい画像列に関して詳細には解説しませんが、この列は少し特殊で、ローカルから画像を選択し、アイテムを保存するとリストにサムネイルが表示されます。
この時、ファイルの実物はどこに置かれるかというと、Site Assets の中のリストIDで区別されるフォルダーに保存されています。
ちなみにこのリストのIDですが、リストの設定ページを表示した際のURLに含まれています。ちょうど %7B ~~~~%7D
で囲まれている部分になります。
問題
問題はこの画像列、通常の Power Automate のアクション (アイテムの取得、作成、更新)からはアクセスできないんです。表示すらされません。
試しにアイテムの取得アクションを実行してみますが、やはり先ほどの画像列が表示されていないのが分かります (Pictureと見えているのはアイテム作成者の画像を表すプロパティです)
解決方法
こういう場合の解決方法はたいてい、SharePoint REST APIを利用することです。
実際、今回のケースでも SharePoint REST API を Power Automate から実行 (アイテムの取得) してみると、対象の画像列の情報が取得できることがわかります。
アイテムの取得
単一のアイテムを取得する場合には、「SharePoint への HTTP要求」アクションで、以下のようにUriをセットします。
_api/web/lists/GetByTitle('リスト名')/items(アイテムID)
そうすると、返却されるデータの中に今回の画像列 (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" が含まれているからです。
実際には余分な文字列がくっついているので、以下の式を利用して、ファイルのユニーク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ステップになります。
アイテム更新
更新もほとんど同じですが、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 のファイルも画像列に設定できます。
おわり
新しい列が出てきてアクションが対応するまでは、だいたいREST APIを実行すればなんとかなることが多いです。
Power Automate でも標準アクションとして「SharePoint へのHTTP要求」アクションがありますので、これを活用するとやりたいことが実現できるかもしれません。
なお、REST APIについては以下のDocsにほとんど書いてあります。