本日はSharePointサイトをPowerAutomateを使用して管理するときに役立つ(かもしれない)小ネタ。
Problem
SharePointサイトのサイトページ(SitePages)の項目が誰かしらによって編集中かどうかを知りたい。
PowerAutomateを使って当該項目(サイトのページ)のプロパティを編集する必要があり、その編集のときに他のユーザーの編集と競合をするのを避けたいがため。
Solution
バージョン番号の値で判断する。
バージョン番号は 小数で表される。例えば 1.0
とか 1.3
とか 10.2
とか 21.0
とか。
小数部が 0
のものはメジャーバージョンと言われ、サイトのページでいうと公開前の変更がない状態。
逆に小数部が 0
でないものはマイナーバージョンと言われ、公開前の変更がある状態。下書きが存在していたり、チェックアウトがされている状態。コンテンツにはまったく変更がない状態でも、下書き保存やチェックアウトをすると自動的にマイナーバージョンが発生する。
SharePointコネクターの「項目の取得」アクションや「複数の項目の取得」アクションで得られた値から判断するのであれば、{VersionNumber}
(動的コンテンツの表示名としては「バージョン番号」)を利用。「複数の項目の取得」アクションで得られた値を絞り込むなら「アレイのフィルター」で endsWith(item()['{VersionNumber}'], '.0')
みたいな式を記述することになる。
レスポンスのイメージ:
{
"statusCode": 200,
"headers": {
...
},
"body": {
"value": [
{
...
},
{
...
"ItemInternalId": "22",
"ID": 22,
"Title": "Example",
"PromotedState": 0,
"{VersionNumber}": "38.3",
...
},
{
...
},
]
}
}
「複数の項目の取得」アクションの入力パラメーターであるフィルタークエリーで条件指定する場合 OData__UIVersionString
列を利用して OData__UIVersionString eq '1.0'
などと記述することになる。しかしPowerAutomateの場合 endswith
演算子に対応していないようなので柔軟性に欠ける。
SharePointコネクターの「SharePointにHTTP要求を送信します」アクションでREST APIに直接データを要求する場合は _api/web/lists/GetByTitle('サイトのページ')/items({id})/File
エンドポイントを利用し、プロパティ UIVersionLabel
や MinorVersion
を利用。前者は小数の文字列表現で、後者は小数部のみの整数表現。
レスポンスのイメージ:
{
"statusCode": 200,
"headers": {
...
},
"body": {
"d": {
...
"MajorVersion": 38,
"MinorVersion": 3,
"Name": "CollabHome.aspx",
"Title": "Example",
"UIVersion": 19459,
"UIVersionLabel": "38.3",
...
}
}
}
_api/web/lists/GetByTitle('サイトのページ')/items({id})
エンドポイントを利用してもよいが、その場合はプロパティ OData__UIVersionString
を利用。
レスポンスのイメージ:
{
"statusCode": 200,
"headers": {
...
},
"body": {
"d": {
...
"Id": 22,
"Title": "Example",
"PromotedState": 0,
"FirstPublishedDate": null,
"OData__UIVersionString": "38.3",
...
}
}
}
Yodan
この解決策を見つけ出すために Microsoft365 Copilotに山程質問をしてたくさんのヒントを貰いました。
SharePointのサイトページの仕様、ライブラリーやリストの仕様、そしてそれらにアクセスするREST APIの仕様・・・Web上に散在していてどこにあるかもわからないアレヤコレヤをまとめてロジカルに説明してくれるのには大変助かりました。いい時代になりましたね。。