【#PowerAutomate Tip's】フィルタークエリー (OData クエリ) メモ

Power Automate にある SharePoint の「複数の項目の取得」アクションで[フィルタークエリー]が利用可能なことをご存じでしょうか？フィルタークエリーを利用すると、該当のアクションでデータをクエリで指定した条件(例えば”金額が500より大きいモノ”など）で絞り込んで取得することができる仕組みです。SQL文で言うところの、Where条件みたいな感じですね。

最近はフローチェッカーが「クエリ使った方が効率的だよ」という警告を表示してくるので、気になっていた方もいるでしょう。そのフィルタークエリーですが、”OData クエリ"という記述を利用しないといけません。

今回は「OData クエリは、たまにしか利用しないので使いたい度にイチイチ検索するのがメンドクサイ！しかも、Docs の説明分かりづらい！！！」ってなった当方が、当方のためにクエリについてメモする回です。

# フィルタークエリーの場所
SharePoint アクションから「複数の項目の取得」を追加 → [詳細オプションを表示する]をクリック → 展開された状態で確認できます。
※スクリーンショットは『試験的な機能』がオンになった状態です。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/960cf920-e870-82a3-b774-0a97fb6de4c1.png)

## 試験的な機能 オンの場合
いわゆるプレビュー機能がONになっていると、フィルタークエリーがフローエディターの GUI上で”ある程度”指定できるようになっています。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/9aae9a4c-6456-2d8b-9b59-41ae7d25a6da.png)


処理対象となる列（左側の選択肢）の型によって選べる条件が異なります。下記はカスタムリストに必ずある”更新日時”を指定した場合です。上記の”タイトル”と選択肢が異なってますよね。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/77b236a3-8ea7-536c-5eab-40f54b721e5b.png)


この機能、まだ全ての条件を網羅しているようでは無さそうです。例えば、タイトルは1行テキストですが”〇〇から始まる”などの条件は GUI 上では出てきません。そのような GUI で条件式が見当たらない場合は[詳細モードに切り替える]をクリックして、自らの手で入力する必要があります。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d7895131-5402-eeb9-0ef8-eb83e9a9cdde.png)
このクエリを指定するときに「あれ？どうだっけ？」となるので、メモしておこう！ってなったのです。

# 参考情報
[SharePoint REST サービスでサポートされる OData クエリ演算子](https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/use-odata-query-operations-in-sharepoint-rest-requests#odata-query-operators-supported-in-the-sharepoint-rest-service)

[Supported operators](https://docs.microsoft.com/ja-jp/onedrive/developer/rest-api/concepts/filtering-results?view=odsp-graph-online&WT.mc_id=BA-MVP-5004053#supported-operators)

# eq (Equal)
イコール。
●●と等しい。

## 例)SPO列の値が ”Nagoya” と等しい

```
SPO列名 eq 'Nagoya'
```


# ne (Not Equal)
ノットイコール。
●●と等しくない。

## 例)SPO列の値が ”Gifu” と等しくない

```
SPO列名 ne 'Gifu'
```


# gt (Greater than)
”より大きい”。
列の値（A）が B より大きい → A > B 。

## 例1)SPO列の値が  100 より大きい

```
SPO列名 gt 100
```

## 例2)SPO列の値が現在日時より大きい
日付の比較をする場合、シングルコーテーション(')で比較する値(A ＞ B の”B")を囲わないとダメ。
よくわすれる(汗

```
SPO列名 gt 'utcnow()'
```


# ge (Greater than or equal)
”以上”。
列の値（A）が B 以上 → A >= B 。

※例は前述と同様なので割愛


# lt (Less than)
”より小さい”。
列の値（A）が B より小さい → A < B 。

## 例1)SPO列の値が  800 より小さい

```
SPO列名 lt 100
```

## 例2)SPO列の値が現在日時より小さい
つまり、現在日時よりも”前”を取得したい場合。

```
SPO列名 lt 'utcnow()'
```


# le (Less than or equal)
”以下”。
列の値（A）が B 以下 → A <= B 。

※例は前述と同様なので割愛


# and
”A && B” のアンド。”および” とか ”なおかつ”。
複数の判定式を連結する際に、A および B としたい場合に利用。

## 例)価格が100以上で、在庫が50より少ない

```
価格 ge 100 and 在庫 lt 50
```


# or
”A || B” のオア。”または”。
複数の判定式を連結する際に、A または B としたい場合に利用。

## 例)価格が100、または500

```
価格 eq 100 or 価格 eq 500
```


# startswith
値が〇〇で始まるモノを取得する。
対象の値が、比較値の文字列で開始されているモノ。

## 例)Name が"中村"で始まるモノ

```
startswith(Name, ’中村’)
```


# endswith
値が〇〇で終わるモノを取得する。
対象の値が、比較値の文字列で終了するモノ。

## 例)Name が"子"で終わるモノ

```
endswith(Name, ’子’)
```


# substringof (〇〇を含む)
値に〇〇が含まれているモノを取得する。
対象の値に、比較値が含まれているモノ。

## 例)Nameに”太郎”が含まれているモノ

```
substringof('太郎', Name)
```

※コイツは、比較したい値が第1引数になります。
※ややこしい！分かりづらい！


# 日付関連
day() だったり month() だったりも利用可能らしいですが、当方が1回も使った試しがないので割愛！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/538121a3-72c2-1522-8655-75033e2a55c6.png)

## 使えるらしいが当方が利用したコトが無いヤツら
- day
- year
- hour
- minute
- second

上記は、OData クエリでこねくり回すより、Power Automate のアクションや関数を活用したほうが分かりやすいんじゃないかな、って思ってます。

# 諸注意
SharePoint Online の列名は内部名（Titleなど）で指定する必要があります。
マルチバイト文字で列名を作成してしまった方は大変だと思いますが、しょうがないね・・・。

SharePoint のリストや列は、必ず半角英数で作成した後に、日本語表記へ修正するようにしましょう。


# まとめ
「OData クエリ、慣れないね！」

はい、いまだに慣れません。覚えられる量なんでしょうけどねぇ・・・。いっそ、SQL文（T-SQL）で統一して条件指定できればいいのに。。。

それでは、皆さま。素晴らしい Power Platform Life を！