【Power Automate】日付比較はデータ取得先に寄ってのフォーマットがあるのでformatDateTime()を通しておく

Power Automateを使い始めてから試行錯誤して、自動化したい機能を無事自動化できましたが。

最後まで調整に苦しんだのが、日付データの取り扱いでした。

エクセルのセルのデータを扱う場合の前準備として、書式設定で設定しておく」ということは以前に書きましたがー。

Share Pointなど、他のデータとの比較をする場合はformatDateTime()を使っておくのが無難だなと。

なぜか日付が正確に比較されない

一通りフローを組んでテストをしてたんですがー。

なぜか、毎回特定の「条件」コントロールでの分岐がうまく動いてくれません。

例えば、AとBが等しいときはCでなければD、という条件だとして、等しいのにDと判断される、という感じでした。

Aにはエクセルのセルに入力していた日付データ。

Bに使用していたのがShare Pointに登録した日付データです。

エクセルに入力されている日付データを使用する場合、Power Automateのエクセル「複数の項目を取得する」のアクションの、「DateTime形式」を「ISO8601」にしておく必要がありますが。

そこは問題なく。

エクセルの書式設定でも問題なく。

「んん?」

となってました。

で、もう一度テストして比較しているデータを確認してみたところ。

エクセルの方は、"yyyy-MM-ddTHH:mm:ssZ"という形で取得しているのに対し。

Share Pointの方は"yyyy-MM-dd"という内容でした。

タイムスタンプの文字列同士の比較なので、"yyyy-MM-dd"部分の比較だけとはならないようです。

Share PointはListsの日付データを入力するカラムの設定で、「日付の時刻の形式」を「日付のみ」にしてましたが、エクセルの方は良く考えれば値をそのまま比較に使用してたので、盲点でした。

なので、形式を揃えることに。

formatDateTime()で形式を揃える

Power Automateで日付の形式を揃えるのに、formatDateTime()という関数を使います。

formatDateTime('タイムスタンプ', '表示形式')

第1引数のタイムスタンプは、日付を入力するのでも、動的コンテンツから参照するのでも、どちらでも大丈夫です。

第1引数に入力された日付データを、指定した表示形式に変換してくれます。

これで、判定が正常に動くところは動きましたがー。

まだ正常に判定されないデータが合ったりで。

原因を探ってみると・・・

タイムゾーンの罠

まさかの、Listsのタイムゾーンが太平洋標準時でした。

これは・・・タイミングによってずれるわけだ・・・

これを日本の設定に変えないと行けないのですがー。

権限の問題なのか、タイムゾーン設定をする箇所が見当たらず。

こちらも関数で対処することにしました。

convertTimeZone('タイムスタンプ', '元のタイムゾーン', '変換するタイムゾーン', '表示形式')

・第1引数でタイムゾーンを変換したい日時を設定
・第2引数で変換したい日時の元のタイムゾーンを入力
・第3引数で変換するタイムゾーンを入力
・第4引数は変換したデータの表示形式を指定できる(省略可能)

という感じです。

第4引数があるので、必要かどうかはなんとも言えませんが。

convertTimeZone()をfomatDateTime()のタイムスタンプにすることもできます。

>>参考:フローで日付と時刻の値をカスタマイズまたは書式設定する – Power Automate

Listsのタイムゾーン設定の変更方法

と、convertTimeZone()を使用してとりあえず正常に動くようにはなりましたが。

元のタイムゾーンを変えた方が楽なので、色々と確認しつつ探索していたら。

ようやく変更できましたw

ListsはShare Pointのサービスの一つなので、Share Point自体の設定を変えるところまでたどり着かなければなりません。

なので、まずはListsの画面の右上にある歯車マークから「リストの設定」を選択して、移ったページでもう一度右上の歯車マークから「サイトの設定」を選択します。

設定画面への行き方

開いたページの中から、「地域の設定」を選択すると。

サイトの設定

無事、タイムゾーンを変更できるところにたどり着けます。

地域の設定

これまではなぜか行けなかったのですがー。

自分の予想通り、権限の問題でした。

フローを作っている時にテストの意味合いもあるので。

管理者権限のあるアカウントと、ユーザー権限のアカウントを使いまわしていたため。

Listsを開いていたアカウントがユーザー権限のアカウントで、タイムゾーンが表示されていなかったような気がします。

あれ?と思ったら、アカウントを確認してみるのが良さそうです。

・・・まぁあまりないかもしれませんがw

参考:【PowerApps】SharePointリストのタイムゾーンとの関係について【PowerBI】‐Tableau-id Press

そして一通り

で、また取得するデータ同士で微妙な形式の違いが合っても嫌だなぁと。

エクセルとShare Pointの日付データを比較するものには、formatDateTime()をつけておくことにしました。

入力が手間なのと、どのデータを取得しているのかパット見ではわからなくなりますが。

変数にいれておくのでフローで使い回すのに不便はありません。

いろんな機能を組み合わせることで、より便利になるのがPower Automateなんだなぁ。