1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本日はSharePointサイトをPowerAutomateを使用して管理するときに役立つ(かもしれない)小ネタ。

Problem

SharePointサイトのサイトページ(SitePages)の項目が誰かしらによって編集中かどうかを知りたい。
PowerAutomateを使って当該項目(サイトのページ)のプロパティを編集する必要があり、その編集のときに他のユーザーの編集と競合をするのを避けたいがため。

Solution

バージョン番号の値で判断する。

バージョン番号は 小数で表される。例えば 1.0 とか 1.3 とか 10.2 とか 21.0 とか。
小数部が 0 のものはメジャーバージョンと言われ、サイトのページでいうと公開前の変更がない状態。
逆に小数部が 0 でないものはマイナーバージョンと言われ、公開前の変更がある状態。下書きが存在していたり、チェックアウトがされている状態。コンテンツにはまったく変更がない状態でも、下書き保存やチェックアウトをすると自動的にマイナーバージョンが発生する。

SharePointコネクターの「項目の取得」アクションや「複数の項目の取得」アクションで得られた値から判断するのであれば、{VersionNumber}(動的コンテンツの表示名としては「バージョン番号」)を利用。「複数の項目の取得」アクションで得られた値を絞り込むなら「アレイのフィルター」で endsWith(item()['{VersionNumber}'], '.0') みたいな式を記述することになる。

アクションのイメージ:
image.png

レスポンスのイメージ:

{
    "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 エンドポイントを利用し、プロパティ UIVersionLabelMinorVersion を利用。前者は小数の文字列表現で、後者は小数部のみの整数表現。

アクションのイメージ:
image.png

レスポンスのイメージ:

{
    "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 を利用。

アクションのイメージ:
image.png

レスポンスのイメージ:

{
    "statusCode": 200,
    "headers": {
        ...
    },
    "body": {
        "d": {
            ...
            "Id": 22,
            "Title": "Example",
            "PromotedState": 0,
            "FirstPublishedDate": null,
            "OData__UIVersionString": "38.3",
            ...
        }
    }
}

Yodan

この解決策を見つけ出すために Microsoft365 Copilotに山程質問をしてたくさんのヒントを貰いました。
SharePointのサイトページの仕様、ライブラリーやリストの仕様、そしてそれらにアクセスするREST APIの仕様・・・Web上に散在していてどこにあるかもわからないアレヤコレヤをまとめてロジカルに説明してくれるのには大変助かりました。いい時代になりましたね。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?