Power Automateで期限のリマインドを作ると、かなりの確率で最初にぶつかる不具合があります。
「通知は届く。エラーも出ていない。でも、日付が1日ずれている」
自分の検証環境で実際に踏んだものです。原因と直し方を書いておきます。
■ 症状
SharePointリストに入れた「期限日」をもとに、期限の7日前にTeamsへ通知するフローを作ったとします。
・フローは毎朝きちんと動く
・実行履歴も「成功」と表示される
・エラーメッセージは出ない
・ただ、通知される対象が1日ずれている
■ なぜ気づきにくいのか
エラーが出ないからです。
フローが失敗すれば通知が来るので気づけます。ところがこの不具合は、フローとしては正常に完了しています。画面を見ているかぎり、どこにも異常がありません。
気づくのは、たいてい「あれ、この案件もう期限が過ぎていない?」と人間が気づいたときです。仕組みを入れた意味が薄れてしまいます。
■ 原因
日付の比較に、タイムゾーンの指定が入っていないことです。
Power Automateの utcNow() は、名前のとおりUTC(協定世界時)を返します。日本時間より9時間前です。
つまり日本時間の朝8時に実行すると、UTCではまだ前日の23時です。この状態で「今日から7日後まで」を計算すると、基準の日付が1日ずれます。
■ 直し方
日付を計算する前に、タイムゾーンを日本時間へ変換します。
convertFromUtc(utcNow(), 'Tokyo Standard Time')
これを起点にしてから addDays や formatDateTime をかけます。SharePointのフィルタークエリで使う場合は、こういう形になります。
Deadline le '@{formatDateTime(addDays(convertFromUtc(utcNow(),'Tokyo Standard Time'),7),'yyyy-MM-dd')}'
■ 直したあと、ここを確認します
直したつもりで直っていないことがあるので、確認のしかたも決めておきます。
「動いた」ではなく「動かないはずの条件で動かない」ことを確認するのが確実です。
具体的には、期限が8日後の行を1件だけ作ります。7日前通知の設定なら、翌朝この行は通知に載らないはずです。載ってしまったら、まだ条件が効いていません。
うまくいく例だけを試すと、たまたま動いているのか本当に効いているのかが分かりません。
■ 同じ形をした落とし穴が、もう一つあります
SharePointの列名です。
SharePointの列は、作成したときの名前がそのまま内部名になります。日本語で「期限日」という列を作ると、内部名は _x671f__x9650__x65e5_ のようなエンコードされた文字列になります。
これもエラーにはなりません。ただ、Power Automateのフィルタークエリや式で扱うときに、思ったとおりに動かなくなります。
列は英数字で作ってから、表示名だけを日本語に変える。これで避けられます。既存のリストが日本語名で作られている場合は、列の設定画面のURLから内部名を調べることになります。
■ 共通しているのは「エラーにならない」こと
この2つに共通するのは、失敗として扱われないことです。
エラーが出る不具合は、出た瞬間に直せます。やっかいなのは、正常に完了しているのに結果だけが違うものです。
こういう不具合を見つけるには、実行履歴の「入力」と「出力」を開いて、実際にどんな値が渡ったのかを見るしかありません。フローの構成図を眺めていても、そこには何も書いていないからです。
Microsoft 365(Power Automate/SharePoint/Teams)を使った業務の自動化を承っています。同じような詰まりでお困りでしたら、出品サービスをご覧ください。