「エラーが出ないのに日付が1日ずれる」Power Automateでいちばん気づきにくい不具合

記事
IT・テクノロジー
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)を使った業務の自動化を承っています。同じような詰まりでお困りでしたら、出品サービスをご覧ください。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す