Outlookの繰り返しのスケジュールでは「毎月何日」といった決まった日に予定を入れることは可能ですが、土日祝を考慮した「毎月第何営業日」という予定を入れる設定はありません。
月初のタスクを繰り返し設定できればと思い、営業日と繰り返す期間などを指定するだけで自動で予定を入れるフローを作成したので紹介します。
フローの概要
フローで実施していることの概要は以下の通りとなります。実施内容としてはシンプルとなりますが、ループ処理などが入り実際の作成は若干複雑になっています。
- 祝日の取得
- まず、Outlookの予定表から指定期間内の祝日を取得し、それらをリストとして保持します。
- このリストは、営業日を計算する際に祝日を除外するために使用されます。
- 営業日の計算とスケジュールの設定
- 次に、フローは実行日の翌月から始まり、指定された月数分、各月に対して以下の処理を行います。
- 月の初日から順に日付をチェックし、土日や祝日でない日を営業日としてカウントします。
指定された営業日に達した時点で、その日にOutlookのスケジュールを設定します。
準備
準備として、OWAに日本の祝日を追加しておきます。
- OWAの予定表を開き、「予定表を追加」をクリックします。
- 「祝日」をクリックし「日本」のチェックボックスを選択します。
フローの作成
- トリガーを設定する
都度実行となるため手動のトリガーを設定します。
入力に以下の内容を設定します。
種類 項目名 説明 数 期間(月数) 繰り返したい月数を数値で入力してください 数 営業日 第何営業日に指定するか数値で入力してください テキスト 作業名 作業名を入力してください テキスト 開始時間 00:00形式で指定してください テキスト 終了時間 00:00形式で指定してください - 「変数を初期化」アクションを設定する
このフローでは変数を8つ使用します。
- startDate
月初の日付を格納する文字列変数です。
値には以下の式を挿入してください。
addToTime(addHours(utcNow(), 9), 1, 'Month', 'yyyy-MM-01THH:mm:ss')
- currentDate
スケジュールを設定する日付を格納する文字列変数です。
値には前述のstartDate変数を挿入してください。
- businessDayCounter
営業日のカウントをする数値変数です。
値は0を設定してください。
- monthCounter
繰り返す月数をカウントする数値変数です。
値は0を設定して下さい。
- targetBusinessDays
指定した営業日の日数を格納する数値変数です。
値はトリガーの出力である動的アイテムの「営業日」を挿入してください。
- periodMonths
指定した期間を格納する数値変数です。
値はトリガーの出力である動的アイテムの「期間(月数)」を挿入してください。
- holidays
祝日の日付を一時的に格納する文字列変数です。
値は空にしてください。
- holidaysList
祝日の日付一覧を格納する配列変数です。
値は空にしてください。
- startDate
- 「時間への追加」アクションを設定する
次の祝日取得の期間を定めるために繰り返しが完了した翌月の日付を取得します。
「間隔」には以下の式を挿入してください。
add(variables('periodMonths'),1)
- 「イベントのカレンダー ビューの取得 (V3)」アクションを設定する
期間内の祝日の日付を取得します。
「終了時刻」には「時間への追加」アクションの出力である動的アイテムの「算出時間」を挿入します。
- 「変数の設定」アクションを設定する
値には「イベントのカレンダー ビューの取得 (V3)」アクションの出力である動的アイテムの「開始時間」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「配列変数に追加」アクションを設定する
期間内の祝日一覧を作成します。
項番5で生成されたApply to each内に「配列変数に追加」アクションを追加し、値に以下の式を挿入します。
formatDateTime(variables('holidays'),'yyyy-MM-dd')
- 「Do until」アクションを設定する(1つ目)
monthCounterが指定した月数(periodMonths)以上になるまで繰り返します。
条件に詳細設定モードにて以下を挿入します。
@greaterOrEquals(variables('monthCounter'), variables('periodMonths'))
- 「Do until」アクションを設定する(2つ目)
currentDateが一ヶ月後の日付以上になる、またはbusinessDayCounterが指定した営業日数(targetBusinessDays)と等しくなるまで繰り返します。
項番7で設定した1つ目のDo until内にもう一つの「Do until」アクションを設定します。
条件に詳細設定モードにて以下を挿入します。
@or(greater(variables('currentDate'), addToTime(variables('startDate'), 1, 'Month', 'yyyy-MM-ddTHH:mm:ss')), equals(variables('businessDayCounter'), variables('targetBusinessDays')))
- 「条件」アクションを設定する
currentDateが土曜日ではない、かつ日曜日ではない、かつ祝日ではないことを判別します。
項番8で設定した2つ目のDo until内に「条件」アクションを設定します。
条件はAndで3つ設定します。
- 式<dayOfWeek(variables('currentDate'))><次の値に等しくない><0>
- 式<dayOfWeek(variables('currentDate'))><次の値に等しくない><6>
- 式<contains(variables('holidaysList'), formatDateTime(variables('currentDate'), 'yyyy-MM-dd'))><次の値に等しくない><true>
- 「変数の値を増やす」アクションを設定する
項番9の条件のはいの場合に「変数の値を増やす」アクションを設定します。
値は1を設定します。
- 「条件」アクションを設定する
businessDayCounterが指定した営業日数(targetBusinessDays)と等しいか判別します。
項番9の条件のはいの場合に「条件」アクションを設定します。
条件は以下を設定します。
<businessDayCounter><次の値に等しい><targetBusinessDays>
- 「イベントの作成 (V4)」アクションを設定する
作業日のスケジュールを設定します。
項番9の条件のはいの場合に「変数の値を増やす」アクションを設定します。
式には以下を挿入します。
formatDateTime(variables('currentDate'),'yyyy-MM-dd')
開始時刻・終了時刻には上記の式とトリガーの出力である動的アイテム開始時間・終了時間の間に「T」を入れます。
- 「時間への追加」アクションを設定する
currentDateを1日進めます。
項番8で設定した2つ目のDo until内に「条件」アクションを設定します。
- 「変数の設定」アクションを設定する
項番13の出力である動的アイテムの「算出時間」をcurrentDateに挿入します。
項番8で設定した2つ目のDo until内に「変数の設定」アクションを設定します。
- 「時間への追加」アクションを設定する
startDateを1か月進めます。
項番7で設定した1つ目のDo until内に「時間への追加」アクションを設定します。
- 「変数の設定」アクションを設定する
項番15の出力である動的アイテムの「算出時間」をstartDateに挿入します。
項番7で設定した1つ目のDo until内に「変数の設定」アクションを設定します。
- 「変数の設定」アクションを設定する
項番16で更新したstartDateをcurrentDateに挿入します。
項番7で設定した1つ目のDo until内に「変数の設定」アクションを設定します。
- 「変数の設定」アクションを設定する
businessDayCounterをリセットします。
項番7で設定した1つ目のDo until内に「変数の設定」アクションを設定します。
- 「変数の値を増やす」アクションを設定する
monthCounterを1加算します。
項番7で設定した1つ目のDo until内に「変数の値を増やす」アクションを設定します。
以上でフローの設定は完了です。
ループが2重になっているところはアクションの位置が分かりづらいのでループ以降の全体像を以下に示します。
おわりに
Outlookのtipsで土日祝を考慮したスケジュール設定方法を探したのですが見つからず、Power Automateでもすぐ作れるかなと思いましたが思ったより時間がかかりました。
今回は自分のスケジュールに作業予定ですが、スケジュールのアクションを工夫すれば定例会議にも応用できそうです。