5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PERSOL CROSS TECHNOLOGYAdvent Calendar 2024

Day 2

PowerAutomateで「土日・祝日」以外の日付を利用した処理を行う

Last updated at Posted at 2024-12-01

今回はPowerAutomateでフローを作成するときのヒント。

Problem

PowerAutomateのワークフローで「土日・祝日」以外の日付を割り出して処理に用いたい。

例えば、アンケートの回答依頼およびリマインドを行うフローのなかで、フローの起動した日時が回答期限日のN日前から当日まで(あるいは、決まった日付の当日からN日後まで)に該当する場合のみ、メインのロジック(回答依頼もしくはリマインド)を行いたいようなケース。
土日や祝日は非営業日なので依頼やリマインドをしても意味がない。「N日前」(あるいは「N日後」)を勘定する中で「土日・祝日」は除外したい。

weekday()関数を使用すれば曜日はわかるから土日は簡単に除外できる。しかし祝日はそうはいかない。

Solution

Outlookにデフォルトで存在する「日本 の休日」予定表を利用する。

フローのサンプルを示す。まずは全体像:

image.png

  1. イベントの取得(V4) japaneseHolidays ─「日本 の休日」予定表のイベント(予定)を取得。過去〜現在〜未来の90件のイベントが得られる。
  2. 選択 holidays ─イベントの開始日時startのみ、それもISO8601表記のTより前部分(つまり日付部分)のみを抽出した配列を作成。
  3. 選択 732days ─フロー実行日時の前365日・後365日(「後」には当日を含む)の日付の配列を作成。このあとの処理でここから土日・祝日を除外する。
  4. アレイのフィルター処理 nonHoliWeekDays ─フロー実行日時の前365日・後365日の配列から土日と祝日に該当するものを削除。後続アクションでこの配列を使って、「土日・祝日」以外の日付を利用した処理を実行する。

次に個々のアクションのパラメーター:

image.png

予定表IDで「日本 の休日」を選択。フィルタークエリを指定して最小限の結果セットを得ようとしたが、start le ...などの比較演算子を使用するとエラーになってしまった。このため何も指定していない。
このアクションを実行すると次のようなイベント(予定)の一覧を示すJSONが得られる。ここには過去〜現在〜未来の90件のイベントが含まれる:

image.png

これを次のアクションで加工:

image.png

startプロパティのみ、それもISO8601表記のTより前側(日付部分)のみを要素とする配列に変換する。

From: @{outputs('イベントの取得_(V4)_japaneseHolidays')?['body/value']}
Map: @{first(split(item()?['start'],'T'))}

結果得られる配列のイメージは次のような感じ:

image.png

もう1つ日付の一覧を作成:

image.png

こちらはフロー実行日時の前後の2年分の日付からなる配列を作成。

From: @{range(-365,732)}
Map: @{formatDateTime(addDays(utcNow(),item()),'yyyy-MM-dd')}

結果得られる配列のイメージは次のような感じ:

image.png

以上の2系統の配列を利用して「土日・祝日」以外の日付からなる配列を作成:

image.png

フィルタークエリで先ほどの2年分の日付のリストから土日と祝日を除外。

From: @{body('選択_732days')}
Filter Query: @equals(@{or(contains(body('選択_holidays'),item()),equals(mod(dayOfWeek(item()),6),0))},false)

結果得られる配列のイメージは次のような感じ:

image.png

使用例1 フロー実行日の「3日後」(ただし土日・祝日を除く)を割り出す

image.png

アレイのフィルター処理 greaterThanToday の Filter Query: @greater(@{item()},@{formatDateTime(utcNow(), 'yyyy-MM-dd')})

作成 3daysLater の 入力: @{body('アレイのフィルター処理_greaterThanToday')?[2]}

使用例2 特定日付の「3日前」(ただし土日・祝日を除く)を割り出す

image.png

作成 targerDate yyyy-MM-dd の 入力: @{formatDateTime(addDays(utcNow(),0),'yyyy-MM-dd')}
作成 targetDatePosition の 入力: @{div(indexOf(join(body('アレイのフィルター処理_nonHoliWeekDays'),''),outputs('作成_targetDate_yyyy-MM-dd')),10)}
作成 targetDateMinus3 の 入力: @{body('アレイのフィルター処理_nonHoliWeekDays')?[sub(outputs('作成_targetDatePosition'),4)]}

今回は「土日・祝日」以外の日付を求める方法を示しましたが、この応用で「営業日」(非営業日以外)を求めることもできるでしょう。非営業日を列挙したOutlookの予定表を作成し、定期的にメンテナンスをしておく。そしてその予定表を使ってワークフローで「営業日」を求めるわけです。デフォルトで備わっている「日本の 休日」予定表と違ってメンテナンスの手間がありますが・・・

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?