patorashのブログ

方向性はまだない

PowerAutomateで毎月第2水曜日にTeamsで通知するやつを作った。

まだちゃんと動くか検証できてないですけど、これをやったので、その実装の話を書いておこうと思う。まぁメモです。

PowerAutomateの繰り返しは、しょぼい

Teamsの会議の予定は、繰り返しでカスタムを選択すると、毎月第3水曜日に会議を予約することができる。いいですね。

f:id:patorash:20210106132254p:plain
Teamsの予定表は第3水曜日の指定が可能

しかし、PowerAutomateの繰り返しは、それができない…。

f:id:patorash:20210106132437p:plain
PowerAutomateでは、第3水曜日とか指定できない

毎週水曜日とか、隔週水曜日とか3週間毎とかはできるんだけれど、第3水曜日とかそういう指定ができない。

f:id:patorash:20210106132611p:plain
できても、何週間毎とか…。

しかし、やりたい。

ロジックを考える

やりたいことは、「第3水曜日に勉強会を行うので、その1週間前に勉強会の開催の告知をしたい」なのだが、どうすればいいかわからなかったので、ググったら、良いヒントが。

[Power Automate] 月末(の最終営業日)にリマインダーを送るmatkjin8.wordpress.com

この記事の中で

[遅延]アクションを使うと、指定した期間フローを待機(一時停止)させることができる

というのがあり、これだ!!と思い、計算に入ります。

第2水曜日になりうる日付を抽出する

月初の1日がどの曜日になるかで決まります。

  • 日曜日だった場合、11日
  • 月曜日だった場合、10日
  • 火曜日だった場合、9日
  • 水曜日だった場合、8日
  • 木曜日だった場合、14日
  • 金曜日だった場合、13日
  • 土曜日だった場合、12日

という感じで考えると、8〜14日になります。そのため、PowerAutomateの起動日は毎月8日に設定します。

f:id:patorash:20210106140520p:plain
毎月8日の12:00に起動。

次に、何日待つかを扱う変数を初期化します。

f:id:patorash:20210106140811p:plain

次に、月初を取得して変数startDayofMonthに格納します。値には、式にして startOfMonth(convertFromUtc(utcNow(), 'Tokyo Standard Time')) を入れます。 f:id:patorash:20210106140854p:plain

次に、月初の曜日を取得して変数weekdayに格納します。値には、式にして、 dayOfWeek(variables('startDayOfMonth')) を入れます。

f:id:patorash:20210106141040p:plain

変数weekdayには、日曜日ならば0、月曜日ならば1という感じで、最大6までの整数が入ってます。では、何日待てばいいでしょうか?

月初の曜日 weekday 第2水曜日 何日待つか
日曜日 0 11日 3日
月曜日 1 10日 2日
火曜日 2 9日 1日
水曜日 3 8日 0日
木曜日 4 14日 6日
金曜日 5 13日 5日
土曜日 6 12日 4日

単純計算で出せるかと思ったけれど、なんかいいのが思いつかなくて、

  • 日〜水曜日までならば、 3 - weekday = 待つ日数
  • 木〜土曜日までならば、10 - weekday = 待つ日数

でいいかなと思ったので、条件を追加。

f:id:patorash:20210106142600p:plain

はいの場合は、3 - weekdayにするので、sub関数を使って変数daysToWaitに値を設定。式には、 sub(3, variables('weekday')) を入れます。

f:id:patorash:20210106142723p:plain

いいえの場合は、10 - weekdayにするので、sub関数を使って変数daysToWaitに値を設定。式には、 sub(10, variables('weekday')) を入れます。

f:id:patorash:20210106142829p:plain

これで何日待つかは決まったので、処理を遅延させます。変数daysToWaitの日数だけ遅延させます。

f:id:patorash:20210106142959p:plain

2022-01-24 追記:2021-12に、変数daysToWaitが0のまま、「待ち時間」に設定したら、エラーが起きました。「待ち時間」には1以上を設定しなければなりません。

f:id:patorash:20220124140023p:plain
daysToWaitが0の場合を考慮して条件分岐させる

あとは、Teamsでメッセージを投稿するようにしました。

まだ動いてないのでなんとも言えませんが、今月でいえば13日になって通知が来たら成功です。

ちゃんと動いてくれています。よかった!

まとめ

遅延っていうやつは便利そう。