【Power Automate】特定の日だけ処理するフローの作り方|毎日起動+リスト照合

Power Automateで特定の日だけ処理するフローの構成を示す図 Power Automate

Power Automateでは、「毎月15日に動かす」のように日付が決まっている処理は、繰り返し(Recurrence)トリガーの設定だけで組めます。

ただ、動かしたい日が月や年によって変わる場合、繰り返しトリガーでは設定できません。そこで私は、毎日フローを起動して「今日が処理を実行する日かどうか」を判定し、該当しない日は何もせずに止める形で実装しました。

この記事でできること

  • 処理を実行する日をSharePointリストで管理する
  • 毎日フローを起動して、今日が該当日かどうかを判定する
  • 該当しない日は何もせず、成功した状態で停止する
  • 該当した日は、後続の処理を行う

完成イメージ

該当日に条件がTrueになり後続の処理まで進んだ実行履歴の画面
該当日でない日に終了アクションで停止した実行履歴の画面

フローは平日の朝に動きます。該当しない日は条件のFalse側にある終了アクションで止まり、実行履歴には成功として記録されます。該当した日だけ、条件の下に並べた処理へ進みます。

全体の実装構成

上から順に、次のアクションを並べています。

アクションの順番アクション役割
1繰り返し(Recurrence)平日の毎朝7時に起動する
2InitMonth(変数を初期化する)今日の「月」を整数で持つ
3InitDay(変数を初期化する)今日の「日」を整数で持つ
4GetScheduleRulesB(複数の項目の取得)起動日リストの全行を取得する
5FilterBStartDay(アレイのフィルター処理)今日と一致する行だけに絞り込む
6条件絞り込んだ件数が1件以上かどうかで分ける
7終了(Terminate)条件のFalse側に置き、該当日でない日はここで止める

6の条件の下に、実際に動かしたい処理を並べます。この記事では判定するところまでを扱うので、後続の処理の中身は問いません。

実装手順

Step1|起動日を管理するリストを用意する

SharePointリストを1つ作ります。1行が1回の起動日にあたります。

列(内部名)種類中身
Title1行テキスト起動日の名前(人が見て分かる用)
RuleMonth数値起動する月
RuleDay数値起動する日
SharePointリストで該当日を設定している画面

列の内部名は、日本語で作成すると式の中で列名を扱うときに分かりにくくなるため、英語で作成しています。

このリストには年を持たせていません。判定に使うのは月と日だけです。

Step2|毎朝決まった時間に起動するトリガーを置く

トリガーは繰り返し(Recurrence)です。私は次の設定にしました。

項目設定値
間隔1
頻度
タイムゾーン(UTC+09:00) 大阪、札幌、東京
設定曜日月・火・水・木・金
設定時刻7
設定分0

フローは平日の朝に動きますが、実際に処理まで進むのはSharePointリストの起動日だけです。残りの日は次のStepで作る判定に引っかからず、何もせずに終わります。

Step3|今日の月と日を変数に取り出す

「変数を初期化する」を2つ置き、種類は整数にします。

// InitMonth の値
int(convertFromUtc(utcNow(),'Tokyo Standard Time','MM'))

// InitDay の値
int(convertFromUtc(utcNow(),'Tokyo Standard Time','dd'))

変数名はそれぞれ intMonth・intDay にしています。

utcNow() はUTCの時刻を返すため、そのまま月日を取り出すと日本時間とずれる日が出ます。convertFromUtc で東京の時刻に変換してから、月と日を取り出しています。

int() で全体を囲んでいるのは、このあとでリストの数値列と比較するときに型をそろえるためです。

Step4|リストの起動日と今日を突き合わせる

「複数の項目の取得」でStep1のリストを取得し、続けて「アレイのフィルター処理」で絞り込みます。

差し込み元(From)には、取得アクションの出力を指定します。

// アレイのフィルター処理の「差し込み元」
outputs('GetScheduleRulesB')?['body/value']

フィルターの条件は詳細モードに切り替えて、次の式を入れます。

// フィルター条件(詳細モード)
and(equals(item()?['RuleMonth'], variables('intMonth')),
    equals(item()?['RuleDay'],   variables('intDay')))
アレイのフィルター処理で条件を詳細モードに設定している画面

リストの各行について、月と日の両方が今日と一致するかを見ています。

このアクションが返すのは配列です。今日が起動日として登録されていれば1件入り、登録されていなければ0件になります。次のStepでは、この件数を見て分けます。

Step5|起動日でない日は何もせずに止める

該当日でない日に後続の処理をスキップさせるため、条件アクションを置きます。設定は次のとおりです。

項目設定値
左辺(式)length(body('FilterBStartDay'))
演算子以上
右辺1

そして、True側は空のままにし、False側にだけ「終了(Terminate)」を置いて、状態を「Succeeded」にします

True側を空にするのは、実行したい処理をすべてTrue分岐の中に入れると入れ子構造になって読みにくいためです。状態を「Succeeded」にするのは、該当日でないこと自体は異常ではないためです。

終了アクションはフロー全体を止めます。該当しない日をFalse側の終了アクションで止めておけば、該当日に実行したい処理を条件の下にそのまま並べられます。

ハマりポイントまとめ

項目起きたこと対処
フィルターの条件基本モードのままでは、2つの条件を組み合わせた指定ができない詳細モードに切り替えて and() の式で書く
比較する値の型リストの数値列が小数として渡ってくることがある型を int() で整数にそろえる

まとめ

今回のポイントは次の3つです。

  • 繰り返し(Recurrence)トリガーに書けない日程は、毎日起動して「今日が該当日か」を判定する形にすると扱える
  • 実行する日はフローの中ではなくリストで持つと、日付が変わってもフローを直さずに済む
  • 該当しない日は、条件のFalse側に置いた終了アクション(Succeeded)で止める

判定の型を1つ作っておくと、他の業務にそのまま流用できます。Power Platformを触り始めたばかりの方に向けて、こういった詰まりポイントをこれからも発信していきます。よかったらブログをブックマークして、またのぞきに来てください。

あわせて読みたい

条件を通過した後に動かす処理の例(Plannerのタスク設定)として、次の記事も参考にしてください。

【Power Automate】期限を毎月固定日にする式|startOfMonth+addDays
Power Automateで期限を毎月の固定日にする式の作り方を解説します。当月の25日などをPlannerのタスク作成で指定するとき、utcNowではなくstartOfMonthを起点にaddDaysで日数を足すと、フローの実行日に左右されず狙った日を期限にできます。
【Power Automate】Plannerに1人1タスクを自動配布する|バケット振り分け方法
Power AutomateでSharePointの名簿からPlannerのタスクを1人1つ自動作成する手順をまとめました。バケットのGUIDの控え方、Switchによる課別の振り分け、変数の初期化、100件で打ち切られないための改ページ設定まで解説します。

コメント

タイトルとURLをコピーしました