3
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Power Automate で SharePoint Online のリストアイテムをユーザ列を使ってフィルタしつつ取得する方法

Last updated at Posted at 2021-05-08

SharePoint Online のカスタムリストは、ユーザ列という種類の列を作成でき、単一、複数のユーザを入力することができます。
この列を使えば、ログインユーザや指定のユーザでファイルやリストアイテムをフィルタすることができて結構便利(こちらのなんちゃって未読既読管理もユーザ列を活用しています)なのですが、このフィルタの設定がわかりにくいです。

そのため今回はプロパティの取得と、フィルタ方法についてサンプルとなる取得方法を記載してみました。

実行環境

以下のようなリストとアイテムを作成しています。

image.png

ユーザ列の値のプロパティの取得

では、これに対してPower Automate の アクションを使用し、データを取得したいと思います。

プロパティの取得ができるアクションは2種類あります。
1つは、"項目の取得"、または"複数の項目の取得"アクションを使う方法。
もう1つは、"SharePoint に HTTP 要求を送信します"アクションを使う方法です。

困った?ことに、この2つでは取得できるプロパティやKeyの値が異なります。
実際に取得できる値を確認してみます。

以下の例は単一のユーザ列で実行していますが、複数入力可能なユーザ列でも同一のアクション、設定で実行可能です。
違いとしては、出力結果が配列になっているくらいです。

"項目の取得"の場合

以下のように指定して実行することで、特に意識なく取得できます。

image.png

  • 実行方法(アクションに設定するプロパティ)
項目 説明
サイトのアドレス SampleSite 対象のリストが置いてあるサイト
リスト名 UserFieldTest 対象のリスト
ID 3 対象のアイテムのID
  • 取得できるプロパティ(ユーザ列の部分だけ)
{
  "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
  "Claims": "i:0#.f|membership|xxxxx@yyyyy.onmicrosoft.com",
  "DisplayName": "Alex Wilber",
  "Email": "xxxxx@yyyyy.onmicrosoft.com",
  "Picture": "https://zzzzz/sites/SampleSite/_layouts/15/UserPhoto.aspx?Size=L&AccountName=xxxxx@yyyyy.onmicrosoft.com",
  "Department": "Marketing",
  "JobTitle": "Marketing Assistant"
}

"SharePoint に HTTP 要求を送信します"の場合

以下のように指定して実行することで、取得できます。
URIが少し大変ですが、指定した分の情報が取得できます。

image.png

  • 実行方法(アクションに設定するプロパティ)
項目 説明
サイトのアドレス SampleSite 対象のリストが置いてあるサイト
方法 GET
URI 長いので以下に記載
サンプルフォーマット
_api/web/lists/getbytitle('{targetlistname}')/items({targetitemid})?$select=Title,{targetfieldname}/Id,{targetfieldname}/Title,{targetfieldname}/EMail,{targetfieldname}/Name,{targetfieldname}/JobTitle,{targetfieldname}/Department,{targetfieldname}/Office,{targetfieldname}/FirstName,{targetfieldname}/LastName,{targetfieldname}/WorkPhone,{targetfieldname}/Office&$expand={targetfieldname}
項目 説明
targetlistname 対象のリスト名
targetitemid 対象のアイテムのId
targetfieldname 対象のユーザ列
入力例
_api/web/lists/getbytitle('UserFieldTest')/items(3)?$select=Title,UserSingle/Id,UserSingle/Title,UserSingle/EMail,UserSingle/Name,UserSingle/JobTitle,UserSingle/Department,UserSingle/Office,UserSingle/FirstName,UserSingle/LastName,UserSingle/WorkPhone,UserSingle/Office&$expand=UserSingle
  • 取得できるプロパティ(ユーザ列の部分だけ)
{
  "d": {
    "__metadata": {
   ---  ---
    },
    "UserSingle": {
      "__metadata": {
   ---  ---
      },
      "Id": 10,
      "Title": "Alex Wilber",
      "EMail": "xxxxx@yyyyy.onmicrosoft.com",
      "Name": "i:0#.f|membership|xxxxx@yyyyy.onmicrosoft.com",
      "JobTitle": "Marketing Assistant",
      "Department": "Marketing",
      "Office": "131/1104",
      "FirstName": "Alex",
      "LastName": "Wilber",
      "WorkPhone": "+1 858 555 0110"
    },
    "Title": "シングル誰かマルチ自分"
  }
}

※よく使われるプロパティのみを取得するよう指定しています

いずれも1アクションで、ユーザ情報としてよく利用しそうな、表示名やメールアドレスが取得できます。
ここで取得できた値は当然、その後のフローで利用することができます。

ユーザ列の値を使ってフィルタ

次に、複数のアイテムを取得し、ユーザ列の値に指定のユーザが含まれるものだけを取得してみます。

ここでも、先ほどの2種類のアクションで分けて実行します。

先ほどは単一のユーザ列での実行だったので、今度は複数入力可能なユーザ列で実行します。

"複数の項目の取得"の場合

以下のように指定して実行することで、取得できます。
フィルタに入力した値が、取得できるJSONのKeyと違うので気を付けてください。

image.png

  • 実行方法(アクションに設定するプロパティ)
項目 説明
サイトのアドレス SampleSite 対象のリストが置いてあるサイト
リスト名 UserFieldTest 対象のリスト
フィルター UserMulti/Title eq 'Alex Wilber' 対象のユーザの表示名と Alex Wilber を比較
  • 取得できるアイテム
{
  "statusCode": 200,
  "headers": {
   ---  ---
  },
  "body": {
    "value": [
      {
   ---  ---
        "ID": 2,
        "Title": "シングル自分マルチ自分と誰か",
   ---  ---
        "UserMulti": [
          {
   ---  ---
            "DisplayName": "Okada Naoya",
   ---  ---
          },
          {
   ---  ---
            "DisplayName": "Alex Wilber",
   ---  ---
          }
        ],
   ---  ---
      },
      {
   ---  ---
        "ID": 4,
        "Title": "シングル誰かマルチ誰か",
   ---  ---
        "UserMulti": [
          {
   ---  ---
            "DisplayName": "Alex Wilber",
   ---  ---
          },
          {
   ---  ---
            "DisplayName": "Joni Sherman",
   ---  ---
          },
          {
   ---  ---
            "DisplayName": "Patti Fernandez",
   ---  ---
          }
        ],
   ---  ---
      }
    ]
  }
}

"SharePoint に HTTP 要求を送信します"の場合

以下のように指定して実行することで、取得できます。
URIが大変ですが、フィルタに入力した値は、取得できるJSONのKeyと同じです。

image.png

  • 実行方法(アクションに設定するプロパティ)
項目 説明
サイトのアドレス SampleSite 対象のリストが置いてあるサイト
方法 GET
URI 長いので以下に記載
サンプルフォーマット
_api/web/lists/getbytitle('{targetlistname}')/items()?$select=Title,{targetfieldname}/Id,{targetfieldname}/Title,{targetfieldname}/EMail,{targetfieldname}/Name&$expand={targetfieldname}&$filter={targetfieldname}/Title eq 'Alex Wilber'

※items()はアイテム全体を取得

項目 説明
targetlistname 対象のリスト名
targetfieldname 対象のユーザ列
入力例
_api/web/lists/getbytitle('UserFieldTest')/items()?$select=Title,UserMulti/Id,UserMulti/Title,UserMulti/EMail,UserMulti/Name&$expand=UserMulti&$filter=UserMulti/Title eq 'Alex Wilber'
  • 取得できるアイテム
{
  "d": {
    "results": [
      {
        "__metadata": {
   ---  ---
        },
        "UserMulti": {
          "results": [
            {
              "__metadata": {
   ---  ---
              },
   ---  ---
              "Title": "Okada Naoya",
   ---  ---
            },
            {
              "__metadata": {
   ---  ---
              },
   ---  ---
              "Title": "Alex Wilber",
   ---  ---
            }
          ]
        },
        "Title": "シングル自分マルチ自分と誰か"
      },
      {
        "__metadata": {
   ---  ---
        },
        "UserMulti": {
          "results": [
            {
              "__metadata": {
   ---  ---
              },
   ---  ---
              "Title": "Alex Wilber",
   ---  ---
            },
            {
              "__metadata": {
   ---  ---
              },
   ---  ---
              "Title": "Joni Sherman",
   ---  ---
            },
            {
              "__metadata": {
   ---  ---
              },
   ---  ---
              "Title": "Patti Fernandez",
   ---  ---
            }
          ]
        },
        "Title": "シングル誰かマルチ誰か"
      }
    ]
  }
}

※よく使われるプロパティのみを取得するよう指定しています

いずれも2件取得で、同様のフィルタ結果を取得することができました。

フィルタ部分に演算子として eq を使っているのですが、結果としては完全一致ではなく、複数入力されたユーザに含まれているかの比較を行う仕様になっています。

ここでわかりにくい部分としては、"複数の項目の取得"のフィルタは、UserMulti/Title eq 'Alex Wilber' というフィルタ条件を指定しているにも関わらず、UserMulti/DisplayName eq 'Alex Wilber' で処理を実行してくれるところです。

これでは"複数の項目の取得"でフィルタ条件とにらめっこした人には気が付きにくいんじゃないかな?と思いますが、結果としては"SharePoint に HTTP 要求を送信します"で指定している条件と同じ条件で、動作をさせることができます。

まとめ

ということで、"複数の項目の取得"で取得できるプロパティと、それを使ったフィルタ条件に関しては、関連性がなく見えますが、フィルタしたい場合は、"SharePoint に HTTP 要求を送信します"などで利用する SharePoint REST API のお作法で設定すれば期待の結果が得られると思います。

実際の利用に関しては、先ほどのプロパティの中でも、EMail(=Email)、Title(=DisplayName) あたりが使えるかと思います。
※昔、EMail の M が大文字じゃないと値がフィルタできないと気が付くのに、半日くらいかけた悲しい思い出があります。

参考

フィルタ条件の書き方は以下がわかりやすいのでよく参考にさせていただいています。

感想

"複数の項目の取得" は API2.0かなあって思っていたのですが、以下のようなものを実行しても、"複数の項目の取得"のような結果を取得することはできませんでした。
そもそもLookupに対応してなさそうな気もするので、内部的には2回くらいリクエスト出してるのかな?
もしかしたら方法があるのかもしれませんが、Graph API から実行する場合などはお気を付けください。

https://{hostname}/_api/v2.0/sites/{hostname}:/sites/{sitename}:/lists/{listname}/items/{itemid}?$select={userfieldname},{userfieldname+"LookupId"}&$expand=fields($select=*,{userfieldname})
{
   ---  ---
  "fields": {
   ---  ---
    "ID": 1,
   ---  ---
    "UserSingle": "Okada Naoya",
    "UserSingleLookupId": "7",
   ---  ---
  }
}
3
9
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
3
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?