Power Automate: SharePoint の FilterQuery でユーザー（オブジェクトとか）をフィルターする方法

# 目的

SharePoint 系で取得データを減らす場合に FilterQuery を利用するかと思います。
簡単なもの（String/Intger/Boolean）であれば、特に困ることもないのですが、ユーザーを元にしようとするとちょっと手古摺ったので記録と共有を

# 今回の肝

- オブジェクトは、'/' で指定可能っぽい？

```text:こんな感じ
OData__x30e6__x30fc__x30b6__x30fc_/EMail eq 'uka2san@gmail.com'
```

# 概要

やることは単純です。

1. 列名を取得する（Editor/Authorならここは不要）
1. FilterQuery を定義

## 列名を取得する（Editor/Authorならここは不要）

### 一度 Action を実行してから結果から取得する

例えば、以下の場合であれば

```text:列名
OData__x30e6__x30fc__x30b6__x30fc_
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f36b2695-3c7e-841c-90b7-db64648e33b4.png)
Editor/Author は 上記のように Default で同一名称なのでそのまま利用すればOK


### リストでフィルターをかけて、URL から名称を取得する

知りたい列をフィルターした際に用意される URL Parameter から列名を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f7da4506-7192-b857-2609-c1c4af894c1e.png)

```url:URL_Parameterのみ
FilterField1=_x30e6__x30fc__x30b6__x30fc_
```

取得した OData名に、"OData_" を連結して完成

```text:列名
OData__x30e6__x30fc__x30b6__x30fc_
```

## FilterQuery を定義

```text:こんな感じ
OData__x30e6__x30fc__x30b6__x30fc_/EMail eq 'uka2san@gmail.com'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/93e474ff-7cb2-830d-1e9c-8ac5e099a75d.png)

# 嵌りポイント
|嵌りポイント|正|誤|補足|
|-|-|-|-|
|全角半角|EMail|Email|この違いだけでエラーになります。|
|'/' と '#'|Editor/ID|Editor#ID|JSON取得すると '#' もあるので・・ついつい|
|OData_付加時の'_'|OData__****|OData_****|'_'も追加するのかよ！と。一度実行してJSONで確認がよさげ|
|先頭の '$'|$filter|filter|一度これ落として動かないと判断・・<br>Rest APIの場合|
|プロパティ名|定義|JSON|[InternalName](https://qiita.com/baku2san/items/7d78b84d666a2b6d4588#internalname) を取得する必要あり。|

https://social.technet.microsoft.com/wiki/contents/articles/31210.sharepoint-2013-get-user-details-from-person-or-group-field-using-rest-api.aspx

## InternalName

JSON の名称は微妙に違うので信用しないように。

1. [ここ](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.sharepoint.spbuiltinfieldid?view=sharepoint-server
)にデフォルトの定義
1. Rest API での取得方法 [ここ](https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest) <br> API <code>https://{site_url}/_api/web/lists(guid'{list_guid}')/Fields</code><br>例 <code>_api/web/GetFolderByServerRelativeUrl('/sites/testforflow/Shared Documents')</code>
1. [ここ](https://social.technet.microsoft.com/wiki/contents/articles/31210.sharepoint-2013-get-user-details-from-person-or-group-field-using-rest-api.aspx) が当初役立ちました。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d6e8a796-948b-8241-2f46-9942b5a62bbc.png) 

# あとがき

https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest

Automate で実行すると重いかなって時は、Rest APIを直接叩いて確認してから使いましょう。
で、うまくいったら、Filter だけを FilterQuery で使用する感じです。

|Parameter|概略|
|-|-|-|-|
|filter|フィルター：FilterQuery が書けるんでここで試してからがいいかと|
|select|取得対象を絞る|
|Expand|そのままだと Editor/EMail とか取れないので、これを使う|


```text:今回のActionでのRestの例
_api/web/lists/getbytitle('FirstList')/items?$select=OData__x30e6__x30fc__x30b6__x30fc_/ID,OData__x30e6__x30fc__x30b6__x30fc_/EMail&$Expand=OData__x30e6__x30fc__x30b6__x30fc_/ID&$filter=(OData__x30e6__x30fc__x30b6__x30fc_/EMail eq 'uka2san@gmail.com')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ba80a89e-5c3e-9e5d-29c7-63917686afa6.png)

# Keyword

How to Get Items with Filter Query by user