やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

(Power Automate)OData フィルタで日時を指定する方法について

先日、Power Automate で OData のフィルタを指定する際に日時を条件に設定する必要がありましたが、その指定方法にハマったのでメモしておきます。

ちなみに OData は Microsoft Graph API の操作を行うためのクエリ言語です。

docs.microsoft.com

環境

やろうとしたことは「SharePoint のイベントリストに登録したデータから特定の期間のデータを取得する」というものです。

例えば以下のようなイベントが登録されているものとします。

f:id:iyemon018:20201010160954p:plain

ここから、2020年10月10日~2020年10月12日までのイベントを取得するイメージです。

まずはフローを実行する

f:id:iyemon018:20201010161328p:plain

イベントを取得する場合は SharePoint の"複数の項目の取得"から取得します。 なお、イベントはリスト名の候補には出てこないのでカスタム入力する必要があります。

問題はこの"フィルター クエリ"の箇所です。 まずは、フィルター クエリを指定せずに実行した結果の JSON を見てみましょう(不要な部分は省略しています)。

{
   "statusCode":200,
   "headers":{
        //省略
   },
   "body":{
      "value":[
         {
            "@odata.etag":"\"1\"",
            "ItemInternalId":"2",
            "ID":2,
            "Title":"テスト10月10日",
            "EventDate":"2020-10-10T00:00:00Z",
            "EndDate":"2020-10-10T23:59:00Z",
            "EventType":0,
            "Modified":"2020-10-10T07:08:30Z",
            "Created":"2020-10-10T07:08:30Z",
            // 省略
         },
         {
            "@odata.etag":"\"1\"",
            "ItemInternalId":"3",
            "ID":3,
            "Title":"Test記念日",
            "EventDate":"2020-10-12T00:00:00Z",
            "EndDate":"2020-10-12T23:59:00Z",
            "EventType":0,
            "Modified":"2020-10-10T07:09:02Z",
            "Created":"2020-10-10T07:09:02Z",
            // 省略
      ]
   }
}

これを見るとEventDateが開始日時、EndDateが終了日時であることが分かります。 なので、今回の要件を満たすにはフィルター クエリには「2020年10月10日 <= 開始日時 <= 2020年10月12日」を指定すれば良いですね。

ちなみになんでフィルター クエリなのか?というとこっちのほうが実行時間が短いからです(多分)。 例えば、フィルター クエリを指定せずに全データを取得してから Apply to each で必要な期間だけ取得することもできますが、データ量が増えてくるとどうしても時間がかかります。 特に Power Automate は。 この時必要になる時間は(正確には検証していませんが)フィルター クエリを指定したほうが短いです。 Apply to each を使う場合、データを削除しない限りは実行時間が短くなることは無いので、この方法を採用しています。

フィルター クエリを設定する

ドキュメントを見ると次のような論理演算子がサポートされています。

  • eq: 等しい
  • ne: 等しくない
  • lt: より小さい
  • gt: より大きい
  • le: 以下
  • ge: 以上
  • and: かつ
  • or: または
  • in: 含まれる
  • not: 否定

上記のフィルター条件を指定する場合、は次のようになります。

EventDate ge 2020-10-10T00:00:00Z and EventDate le 2020-10-12T00:00:00Z

では実行しましょう。

f:id:iyemon018:20201010162751p:plain

はい。失敗しますね。

エラー詳細には次のようなメッセージが出力されると思います。

式 "EventDate ge 2020-10-10T00:00:00Z and EventDate le 2020-10-12T00:00:00Z" が無効です。 Creating query failed.
clientRequestId: <id>
serviceRequestId: <id>

この問題を修正するには次のようにフィルター クエリを修正します。

EventDate ge '2020-10-10T00:00:00Z' and EventDate le '2020-10-12T00:00:00Z'

変わった箇所は、日時を ' (シングルクォーテーション)でくくっているところです。 これを実行するとフローは成功します。

f:id:iyemon018:20201010163139p:plain

スケジュールを指定して実行している場合は以下のように変数に日時を保存しておいてフィルターを指定するのが良いと思います。

formatDateTime(variables('FromDateTime'), 'yyyy-MM-ddT00:00:00Z')


SharePoint などでリストから特定の情報をフィルタすることはよくあると思います。 日時が含まれるケースは少ないかもしれませんが、そういった場合こそハマりがちなので参考にして頂ければ。