📷

SharePoint REST API を使ってリスト アイテムの画像列を更新する

に公開

はじめに

SharePoint Online には新しい列の種類として 2020 年より画像列が追加されています。これまでカスタム リストで画像を扱う場合は添付ファイルに設定することが多かったですが、画像を列として表現できるようになったため、利便性が高くなっています。プログラムからどのように設定するかが気になるところです。CSOM ではまだ対応していませんが、REST API を使って設定できるため、その方法を紹介します。

前提

画像列は列のデータとして画像が埋め込まれているわけではなく、画像は別のドキュメント ライブラリに保存されており、そこへの情報を JSON 形式で保持しています。通常、UI から画像をアップロードした場合は サイトのリソース ファイル に格納されます。手順は以下の通りです。

  • サイトのリソース ファイルに画像をアップロード
  • リスト アイテムの列に JSON 情報を設定して更新

実行手順

画像のアップロード

UI からアップロードした場合、/SiteAssets/Lists/{{list-id}} フォルダーにファイルが格納されます。自分でフォルダーを作成するのは手間がかかるため、UploadImage という専用の REST API を利用します。URL は以下のような形式で、本文にファイルのコンテンツを含めます。

POST https://example.sharepoint.com/sites/TestSite1/_api/web/uploadimage(listtitle=@v1,imagename=@v2,listid=@v3,itemid=@v4)?@v1='Test List 1'&@v2='image.png'&@v3='1c36d431-f9a0-43b2-8284-cae8ccf5ca3b'&@v4=1
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJ0eX...

結果として以下のような JSON が返却されます。

{
  "odata.metadata": "https://example.sharepoint.com/sites/TestSite1/_api/$metadata#SP.SPImageItem",
  "Name": "image.png",
  "ServerRelativeUrl": "/sites/TestSite1/SiteAssets/Lists/1c36d431-f9a0-43b2-8284-cae8ccf5ca3b/image.png",
  "UniqueId": "2e8f34a1-4237-4bb6-8941-61af7e985204"
}

リスト アイテムの更新

画像列は内部的には複数行テキスト列として扱われています。そのため、通常と同様に JSON 文字列を設定すれば問題ありません。JSON を直接渡すのではなく、JSON 文字列として渡す点に注意してください。基本的には画像のアップロード結果で取得した情報をもとに作成できます。

POST https://example.sharepoint.com/sites/TestSite1/_api/web/lists('1c36d431-f9a0-43b2-8284-cae8ccf5ca3b')/items(1)
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJ0eX...
If-Match: *
X-HTTP-Method: MERGE

{
  "ImageField1": "{\"type\":\"thumbnail\",\"fileName\":\"image.png\",\"fieldName\":\"ImageField1\",\"serverUrl\":\"https://example.sharepoint.com\",\"serverRelativeUrl\":\"/sites/TestSite1/SiteAssets/Lists/1c36d431-f9a0-43b2-8284-cae8ccf5ca3b/image.png\",\"id\":\"2c5377bf-ec2f-4b44-9fa4-9867881d4bf5\"}"
}

JSON のみを展開すると以下のようになります。

{
  "type": "thumbnail",
  "fileName": "image.png",
  "fieldName": "ImageField1",
  "serverUrl": "https://example.sharepoint.com",
  "serverRelativeUrl": "/sites/TestSite1/SiteAssets/Lists/1c36d431-f9a0-43b2-8284-cae8ccf5ca3b/image.png",
  "id": "2c5377bf-ec2f-4b44-9fa4-9867881d4bf5"
}

なお、JSON の最小構成は以下の通りです。

{
  "type": "thumbnail",
  "serverRelativeUrl": "/sites/TestSite1/SiteAssets/Lists/1c36d431-f9a0-43b2-8284-cae8ccf5ca3b/image.png"
}

いくつかのプロパティを省略しても動作しますが、結果の表示方法が異なります。すべてのプロパティを設定した場合は Microsoft Graph の /drives/{{drive-id}}/items/{{item-id}}/thumbnails が呼び出されます。設定しない場合は serverRelativeUrl が呼び出されます。サムネイルを利用することでパフォーマンスが向上するため、すべてのプロパティを設定することを推奨します。

https://docs.microsoft.com/ja-jp/graph/api/driveitem-list-thumbnails?WT.mc_id=M365-MVP-5002941

Discussion