IDEAL's Voice

株式会社イデアルの社員がやってみた技術的な内容を投稿しています。

【PowerAutomate】祝日や週末を考慮して当月の最終営業日にTeamsでリマインドする方法

目次

ご挨拶

イデアルの藤田と申します。
どうぞよろしくおねがいします。

やりたいこと

PowerAutomateで毎月の最終営業日になったら
リマインドの通知を自動化したい。

ロジック

処理に必要な情報を書き出します。

  • 毎週月曜日から金曜日のAM09:00にPowerAutomateを起動
  • 当月末の日付を取得
  • 当月末の月末の曜日を取得
  • 曜日が土曜日であれば:取得した日付を-1日(金曜日の日付を取得するため)
  • 曜日が日曜日であれば:取得した日付を-2日(金曜日の日付を取得するため)
  • 取得した日付が祝日であれば:取得した日付を-1日
  • 祝日と土曜が連なる場合を考慮し、ループ処理とする
    ※月末に祝日が連続する月は掲載時点ではありませんが、
     ループ処理内に含めております。
  • PowerAutomateが起動した日付と取得した最終営業日が一致した場合、Teamsに通知

PowerAutomate全体構成

PowerAutomate作成手順

スケジュール済みクラウドフロー構築

まずは、「毎週月曜日から金曜日のAM09:00にPowerAutomateを起動」を作成します。
[新しいフロー]-[スケジュール済みクラウドフロー]を選択し、
下記画像のように設定後し、作成ボタンを押下。

日本時間の年月日を取得

当月の最終営業曜日を取得するための準備として、
日本時間の年月日をyyyyMMdd形式で取得します。

以下、作成順です。

  • [+ 新しいステップ] - [組み込み]タブ - [日時] - [現在の時刻]
  • [+ 新しいステップ] - [組み込み]タブ - [日時] - [タイムゾーンの変換]

    項目 設定値
    基準時間 [現在の時刻]
    @body('現在の時刻')
    書式設定文字列 yyyyMMdd
    変換元のタイムゾーン UTC協定世界時
    変更先のタイムゾーン UTC)大阪、札幌、東京

変数作成

変数を作成していきます。

  • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数を初期化する]

以下、各変数の用途をざっくり記述します。

  • -N日=当月の最終営業日と曜日取得時に利用
     ※初期値が設定されていることにご注意ください
  • 曜日=最終営業日と判定された曜日を格納
  • 最終営業日=最終営業日と判定された年月日を格納
  • ループ判定=ループ判定を格納し、分かりやすくするため
  • 祝日判定結果=祝日判定結果を格納

処理

ループ処理

制御ループ処理を用いて、当月の最終営業日を取得するために[Do Until]を作成します。

  • [+ 新しいステップ] - [組み込み]タブ - [コントロール] - [Do until]
  • ループ処理終了条件:[ 変数:ループ判定 ] [ 次の値と等しい ] [ OK ]


月末の日付取得

ループ内にて月末の日付と曜日を取得し、変数へ格納していきます。

  • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

項目 設定値
名前 年月日
値(※) addDays(startOfMonth(addDays(startOfMonth(convertFromUtc(utcNow(),'Tokyo Standard Time')),32)),variables('-N日'),'yyyyMMdd')

実行結果、[変数:年月日]には[20220430]が入ります。

※関数の処理について、ざっくり記述します
1. 現在の日時(20220415 とする)を取得。
(例 2022-04-15T00:00:00.0000000)
2. startOfMonthにてタイムスタンプの月の開始を返します。
(例 2022-04-15T00:00:00.0000000 ⇒ 2022-04-01T00:00:00.0000000)
3. 次にaddDaysにて「2. startOfMonth~」より取得した値に32日を追加します。
(例 2022-04-01T00:00:00.0000000 ⇒ 2022-05-03T00:00:00.0000000)
4. startOfMonthにて「3. 次にaddDays~」より取得した値の月の開始を返します。
(例 2022-05-03T00:00:00.0000000 ⇒ 2022-05-01T00:00:00.0000000)
5. 最後にaddDaysにて「4. startOfMonth~」より取得した値に-N日(初期値:-1)を追加します。
(例 2022-05-01T00:00:00.0000000 ⇒ 2022-04-30T00:00:00.0000000)
6. 「2022-04-30T00:00:00.0000000」をyyyyMMdd形式(年月日)で取得。
(例 2022-04-30T00:00:00.0000000 ⇒ 20220430)


月末の曜日取得

続いて、ループ内にて月末の曜日を取得し、変数へ格納していきます。

  • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

項目 設定値
名前 曜日
addDays(startOfMonth(addDays(startOfMonth(convertFromUtc(utcNow(),'Tokyo Standard Time')),32)),variables('-N日'),'dddd')

結果、[変数:曜日]には[Saturday]が入ります。


分岐処理

取得した月末の年月日・曜日の情報をもとに、
当月の最終営業日であるか処理していきます。

取得した曜日が土曜日であるか

  • [+ 新しいステップ] - [組み込み]タブ - [コントロール] - [条件]
  • 分岐条件:[ 変数:曜日 ] [ 次の値と等しい ] [ Saturday ]
  • はいの場合

    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の値を増やす]

      項目 設定値
      名前 -N日
      -1
    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

      項目 設定値
      名前 ループ判定
      NG
  • いいえの場合

    • [+ 新しいステップ] - [組み込み]タブ - [コントロール] - [条件]
      • 分岐条件:[ 変数:曜日 ] [ 次の値と等しい ] [ Saturday ]

取得した曜日が日曜日であるか判定

 

  • はいの場合

    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の値を増やす]

      項目 設定値
      名前 -N日
      -2
    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

      項目 設定値
      名前 ループ判定
      NG
  • いいえの場合

    • [+ 新しいステップ] - [標準]タブ - [Office 365 Outlook] - [イベントのカレンダー ビューの取得 (V3)]
    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]
    • [+ 新しいステップ] - [組み込み]タブ - [コントロール] - [条件]

取得した日付が祝日であるか判定

分岐条件:[ empty(variables('祝日判定結果')) ] [ 次の値と等しい ] [ false ]

  • はいの場合

    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の値を増やす]

      項目 設定値
      名前 -N日
      -2
    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

      項目 設定値
      名前 ループ判定
      NG
  • いいえの場合

    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の設定]

      項目 設定値
      名前 ループ判定
      NG

簡易ではありますが、2022年4月に実行した場合の処理イメージとなります。

  1. 月末の日付取得(変数:-N日=-1)=20220430
  2. 曜日を取得=Saturday(土曜日)
  3. 分岐処理の結果、取得した曜日は土曜日と判定。
    1. [変数:-N日]の値に-1増やす。
    2. [変数:ループ判定] NGに設定。
    3. 再度、ループ処理実行。
  4. 月末の日付取得(変数:-N日=-2)=20220429
  5. 曜日を取得=Friday(金曜日)
  6. 分岐処理の結果、取得した曜日は土曜日ではないと判定。
  7. 分岐処理の結果、取得した曜日は日曜日ではないと判定。
  8. 日本の休日より2022年4月29日の情報取得
  9. 日本の休日取得結果、祝日判定(昭和の日)
    1. [変数:-N日]の値に-1増やす。
    2. [変数:ループ判定] NGに設定。
    3. 再度、ループ処理実行。
  10. 月末の日付取得(変数:-N日=-3)=20220428
  11. 曜日を取得=Thursday(木曜日)
  12. 分岐処理の結果、取得した曜日は土曜日ではないと判定。
  13. 分岐処理の結果、取得した曜日は日曜日ではないと判定。
  14. 日本の休日より2022年4月28日のイベント情報取得
  15. 日本の休日取得結果、祝日ではないと判定。
  16. 20220428が最終営業日と判定。
  17. [変数:年月日] 20220428に設定。
  18. [変数:ループ判定] OKに設定。
  19. ループ処理終了。

分岐処理

最終営業日と判定した年月日と
PowerAutomateが起動した年月日を比較し、
分岐処理を実行します。

  • [+ 新しいステップ] - [組み込み]タブ - [コントロール] - [条件]
    • 分岐条件:[ 変数:年月日 ] [ 次の値と等しい ] [ 変換後の時間 ]

  • はいの場合
    • [+ 新しいステップ] - [組み込み]タブ - [変数] - [変数の値を増やす]

項目 設定値
投稿者 フローボット
投稿先 フローボットとチャットをする
Recipient <自身のメールアドレス>
メッセージ <任意のメッセージ>


  • いいえの場合
    • 処理なし


長々と記載しましたが、作成手順は以上です。


結果

最終営業日と判定した年月日と
PowerAutomateが起動した年月日が一致した場合のみ、Teamsに通知が来ます。

まとめ

以上の手順でPowerAutomateを作成したら、実際に通知が届くかどうかを確認してみましょう。 最終営業日にTeamsでリマインドされると、締め切りや報告などの作業を忘れずに行えます。 ただし、祝日の情報はOutlookのカレンダーに依存するため、正確さを保証するものではありません。祝日が変更された場合は、カレンダーの更新を忘れずに行ってください。

以上、お読みいただきありがとうございました。