からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

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

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

前提

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

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

という流れになります。

手順

画像のアップロード

UI からアップロードしたときは「/SiteAssets/Lists/{{listid}}」のフォルダーにファイルが格納されます。自分でフォルダーを作成するのは大変なので 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/{{driveid}}/items/{{itemid}}/thumbnails を呼び出します。設定しない場合は serverRelativeUrl が呼び出されます。サムネイルを使うことでパフォーマンスが向上するため設定したほうがいいでしょう。

docs.microsoft.com