月末月初とか毎月8日とかそういう固定の日付ではなく、ちょっと変動する日付で定期的に来るイベントについて、前営業日に通知を送る場合のPower Automateのクラウドフローです。
意外と探すとドンピシャな内容は出てこないんだけど、エッセンスとしては使い古されたものの集まりです。
やりたいのはこのような感じ。
土日と祝日を回避して、その前の平日に通知を送ります。(カレンダー通りの営業日を前提にしています)
今回のフローでポイントになるのは祝日の判定ですが、これにはOutlookのカレンダーに追加してある「日本の祝日」カレンダーを使っています。
祝日の追加方法は以下が参考になります。
フロー全体は下図のような構成です。
毎日フローを実行して、直近のイベント日付を何らかのソース(ここではListsに入れたイベント)から取得して、フロー実行日とイベント日の間の営業日数を計算しています。
他のケースに応用できるよう、今回はイベント日は決まっているものとして、土日祝を取り除き営業日数を計算する部分を紹介します。
1. 祝日リスト作成
Outlook に追加した祝日カレンダーからイベント日・フロー実行日周辺の祝日一覧を作成していきます。
ここで利用するのが Office 365 Outlook の "Get calendar view of events" アクションなのですが、このアクション微妙な動きをしておりまして、本来フロー実行日からイベント日までの祝日が欲しいわけですが、うまく一覧してくれないんですよね。(余分なのが入ったり)
どうせうまく取れないのであれば、丸々2か月分の祝日一覧を作ることにします。
上図のとおり、Convert Time Zoneのアクションでフロー実行日の月の初日と、2か月後の初日をとります。 (7/15に実行するなら、7/1と9/1をつくる)
ポイントになるのはフォーマット文字列で、yyyy-MM-01T00:00:00
とすることでそれぞれの月の1日の0時00分を得ることができます。
あとは"Get calendar view of events" アクションのStartとEndにそれぞれを指定して実行するだけです。取得結果はイベント名などを含んでいるので、Selectアクションで日付だけにします。
この部分までを実行すると以下のとおり、7月と8月の祝日の日付のみを含む配列ができました。
2. 営業日数計算
営業日計算の各ステップについては上図に解説を書いています。
まずはイベント日とフロー実行日の差分日数を出しています (この段階では単なる日数)
div( sub( ticks(イベント日), ticks(フロー実行日) ), 864000000000 )
こんな構造の式です。詳細は以下のブログが詳しいので、確認してみてください。
How to calculate difference between two times in Power Automate
次にここで得られた日数を使って0始まりの数字の配列を作ります。[0,1,2,...(日数)-1]
これにはrange()
関数を利用しています。
range(0, 日数)
Selectアクションの入力にこれをセットし、Map部分には
addDays(フロー実行日, 配列の値)
となるように式を設定しています。これにより、例えば 7/15 にフローを実行して 7/19がイベントの場合には
[ "2022-07-15T00:00:00Z", "2022-07-16T00:00:00Z", "2022-07-17T00:00:00Z", "2022-07-18T00:00:00Z" ]
という、フロー実行日~イベント前日までの日付一覧ができるわけです。
日付一覧ができたら、土日と祝日を取り除いていきます。
『土日を取り除く』は各日付の曜日番号をみて1~5 (= 月~金) のものを抽出する という操作です。これには Filterアクションを使っています。
土日を取り除いた結果から、さらに祝日を取り除きます。
このフィルター条件 @not(contains(body('Select_-_祝日日付一覧作成'), item()))
は、『祝日一覧の中に、日付一覧 (から土日をぬいたもの) の日付が入っていないこと』という条件です。
こんな具合で、出てくる結果は
- フロー実行日からイベント前日までの日付一覧
- その中から土日を取り除き
- さらに祝日をとりのぞいた日付の一覧
となるわけです。
通知する場合には、この日付一覧の長さを見て、1なら通知、それ以外はフロー終了としてください。
おわり
たまには仕事でも使えそうなフローをご紹介しました。
Outlookのカレンダーから祝日を取ってきて一覧化するところ、日数から日付一覧を作成するところがポイントになります。
ちょっとOutlookの接続情報があるのでフローを配布できませんが、何かのお役に立てば幸いです。