最近、月一の社内勉強会がまったくの不定期開催になっていたので、Teamsの予定で毎月でスケジューリングしておいた。そして、PowerAutomateで1週間前になったら「来週勉強会やでぇ〜」と告知するやつをたった今作った。
— パトラッシュ💉💉@リーダー業 (@patorash) 2021年1月5日
まだちゃんと動くか検証できてないですけど、これをやったので、その実装の話を書いておこうと思う。まぁメモです。
PowerAutomateの繰り返しは、しょぼい
Teamsの会議の予定は、繰り返しでカスタムを選択すると、毎月第3水曜日に会議を予約することができる。いいですね。
しかし、PowerAutomateの繰り返しは、それができない…。
毎週水曜日とか、隔週水曜日とか3週間毎とかはできるんだけれど、第3水曜日とかそういう指定ができない。
しかし、やりたい。
ロジックを考える
やりたいことは、「第3水曜日に勉強会を行うので、その1週間前に勉強会の開催の告知をしたい」なのだが、どうすればいいかわからなかったので、ググったら、良いヒントが。
[Power Automate] 月末(の最終営業日)にリマインダーを送るmatkjin8.wordpress.com
この記事の中で
[遅延]アクションを使うと、指定した期間フローを待機(一時停止)させることができる
というのがあり、これだ!!と思い、計算に入ります。
第2水曜日になりうる日付を抽出する
月初の1日がどの曜日になるかで決まります。
- 日曜日だった場合、11日
- 月曜日だった場合、10日
- 火曜日だった場合、9日
- 水曜日だった場合、8日
- 木曜日だった場合、14日
- 金曜日だった場合、13日
- 土曜日だった場合、12日
という感じで考えると、8〜14日になります。そのため、PowerAutomateの起動日は毎月8日に設定します。
次に、何日待つかを扱う変数を初期化します。
次に、月初を取得して変数startDayofMonthに格納します。値には、式にして startOfMonth(convertFromUtc(utcNow(), 'Tokyo Standard Time'))
を入れます。
次に、月初の曜日を取得して変数weekdayに格納します。値には、式にして、 dayOfWeek(variables('startDayOfMonth'))
を入れます。
変数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 = 待つ日数
でいいかなと思ったので、条件を追加。
はいの場合は、3 - weekdayにするので、sub関数を使って変数daysToWaitに値を設定。式には、 sub(3, variables('weekday'))
を入れます。
いいえの場合は、10 - weekdayにするので、sub関数を使って変数daysToWaitに値を設定。式には、 sub(10, variables('weekday'))
を入れます。
これで何日待つかは決まったので、処理を遅延させます。変数daysToWaitの日数だけ遅延させます。
2022-01-24 追記:2021-12に、変数daysToWaitが0のまま、「待ち時間」に設定したら、エラーが起きました。「待ち時間」には1以上を設定しなければなりません。
あとは、Teamsでメッセージを投稿するようにしました。
まだ動いてないのでなんとも言えませんが、今月でいえば13日になって通知が来たら成功です。
ちゃんと動いてくれています。よかった!
まとめ
遅延っていうやつは便利そう。