🛤️

Power Automate で祝日判定をして処理を分岐する

2024/04/26に公開

Outlook カレンダーを使うととても簡単

Power Automate (for desktop) で祝日かどうか判定して処理を分岐したい。
そういうことってありませんか?

Outlook のカレンダーを使うととても簡単にできます。

検索するといくつか記事が出てくるのですが、……なんか、タイムゾーンを変換してる人多いな?
って思ったので、違うことを書きます。変換する必要ないよ?

この戻り値を見てみるとタイムゾーンが UTC になっているのが分かると思います。

.timeZone

Office 365 Outlook コネクタのアクションは UTC と書いています。

Outlook.com コネクタは違う例になっていますが、

「タイムゾーンの変換」アクションで書式設定文字列に「ラウンドトリップ日時パターン」を選んでも+09:00の部分が付かないので、この出力をそのまま入れただけだと UTC で処理されます。28 日に昭和の日を取得していますね。

  • 2024-04-28T15:38:00.0000000Z→日本標準時で 29 日 0 時 38 分
  • 2024-04-29T15:01:00.0000000Z→日本標準時で 30 日 0 時 1 分

2024-04-28T16:00:00.0000000Z = 2024-04-29T01:00:00.0000000+09:00
どっちでも同じなんだからそのまま使えばいい。

JST にする際にT00:00:00を付けて変換しているのって、9 時間進めたあとに 0 時に戻してます。
これをそのまま使うと UTC 扱いされます。

UTC → JST → UTC (0:00)
UTC → UTC (+09:00) → UTC (0:00)

日本のタイムゾーンで取得してないです。

そもそも時刻を弄る必要がないので変換は不要。


ということで、祝日を判定する方法、PA と PAD、両方書きました。

  • 前提
    • Outlook のカレンダーに「日本の休日」がある(なければ追加してください。)

PAD

  1. 現在の日時を取得

    項目
    取得 現在の日時
    タイムゾーン Windows タイムゾーン
    Windows タイムゾーン (UTC) 協定世界時

    生成された変数: %CurrentDateTime%

    1. 出力変数は適宜変えてください。
    2. システムタイムゾーンの方が使いやすいと思いますし、概ねそれで問題ないと思いますが、
      時差で日付が変わっちゃう時間帯に動かす場合は時間を変更するか、
      Windows タイムゾーンで取得するか。……他にもいろいろあると思います。
  2. 「イベントのカレンダー ビューの取得 (V3)」で祝日を取得

    項目
    カレンダー ID 日本の休日
    開始時刻 %CurrentDateTime%
    終了時刻 %CurrentDateTime%

    開始時刻と終了時刻は、現在の時刻をそのまま入れて OK

イベントのカレンダー ビューの取得 (V3)

デバッグ実行

以下のような応答が返ってきます。

GetEventsCalendarViewV3Response

昭和の日
色々なプロパティが用意されています。

祝日イベントがなかった場合

空のリストが返ってきます。

空

If 文で、平日を True にするなら空である

項目
最初のオペランド %GetEventsCalendarViewV3Response.value%
演算子 空である

祝日を True にするなら空ではない

項目
最初のオペランド %GetEventsCalendarViewV3Response.value%
演算子 空ではない

リストのカウントを使うなら

項目
最初のオペランド %GetEventsCalendarViewV3Response.value.Count%
演算子 と等しい (=)
2 番目のオペランド 0
項目
最初のオペランド %GetEventsCalendarViewV3Response.value.Count%
演算子 より大きい (>)
2 番目のオペランド 0

などで判定できます。


PA

PA も一緒です。

全体

  1. イベントカレンダー ビューの取得 (V3)
    PADと同じ

  2. If 文で分岐
    2 つ紹介します。

    1. 「終日イベントですか?」を使って比較

      @items('For_each')?['isAllDay'] is equal to true
      

      この動的なコンテンツを追加すると Foreach で囲まれます。
      Foreach

    2. リストのカウントを使って比較

      length(outputs('イベントのカレンダー_ビューの取得_(V3)_日本の祝日')?['body/value'])
      is greater than
      

      この関数を使った方がフローの見た目はすっきりします。
      最初の全体フローはこっちで作っています。

今回書いた条件式は、祝日のとき True になります。


まとめ

  • 祝日の判定を行うなら、Outlook カレンダーが使える
  • 開始時刻と終了時刻は同じ時刻(現在の日時)を入れると楽
  • タイムゾーンは UTC

https://learn.microsoft.com/ja-JP/power-automate/convert-time-zone

Discussion