MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

(不)定期にあるイベントの前営業日に通知を送る

月末月初とか毎月8日とかそういう固定の日付ではなく、ちょっと変動する日付で定期的に来るイベントについて、前営業日に通知を送る場合のPower Automateのクラウドフローです。

意外と探すとドンピシャな内容は出てこないんだけど、エッセンスとしては使い古されたものの集まりです。

やりたいのはこのような感じ。

土日と祝日を回避して、その前の平日に通知を送ります。(カレンダー通りの営業日を前提にしています)

今回のフローでポイントになるのは祝日の判定ですが、これにはOutlookのカレンダーに追加してある「日本の祝日」カレンダーを使っています。

祝日の追加方法は以下が参考になります。

support.microsoft.com

フロー全体は下図のような構成です。

毎日フローを実行して、直近のイベント日付を何らかのソース(ここでは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の接続情報があるのでフローを配布できませんが、何かのお役に立てば幸いです。