ミムチ

毎日チームに、翌営業日のスケジュールを通知したいのですが、フローで翌営業日を判定する方法が分かりませんぞ…

パワ実

その場合、「Do Until」のループアクションを使う必要がありますね。

この記事では、Do Untilとは何か?と、Do Untilを使った翌営業日の判定方法を解説します。

「Do Until」は「For each」と同じく、よく使われるループアクションの1つです。

「Do Until」アクションの使い方を理解すると、色々なフローで活用できるので、ぜひ最後までみてください!

この記事でわかること
  1. Do Untilの基本的な仕組み
  2. For each(Apply to each)との違い
  3. Do Untilで翌営業日を判定するフローの実装方法

YouTube動画で見たい方は、こちらからどうぞ!

Do Untilとは?

Do Untilの仕組み

Do Untilは、「コントロール」カテゴリにあるアクションで、条件がTrueになるまでループ内のアクションを繰り返し実行します。

Do Untilの基本的な動作は、以下のようになります。

Do Untilの基本的な動作
  1. ループ内のアクションを実行する ※1回目は必ず実行される
  2. 条件を判定する
  3. 条件がFalseなら、1に戻って再度アクションを実行する
  4. 条件がTrueになったら、ループを終了する

例えば以下のようなフローで、Do Untilの条件を「変数 num = 3」と設定した場合の動きを見てみます。

1回目のループでは上の図のように、ループ内のアクションが実行され、Excel表に「1」の値を追加します。

2回目のループでは上図のように、変数num=2のためループに入り、Excel表に「2」の値を追加します。

3回目では上図のように、変数num=3となったため、Do Untilの条件を満たし、ループから抜けて次のアクションが実行されます。

ミムチ

なるほど、条件を満たすまで、何度もループするのですな!

ただし、無限ループを防ぐために、Do Untilには以下の2つの制限を設定できます。

無限ループを防ぐ設定
  • 件数:ループの最大実行回数を設定(例:60回)
  • タイムアウト:ループの最大実行時間(例:PT1H =1時間)

例えば上記のような設定をすると、条件が永遠にTrueにならない場合でも、カウントが60回に達するか、1時間が経過すると、ループは自動的に終了します。

パワ実

これらは、詳細パラメーターで設定できます。

For each(Apply to each)との違い

For eachとDo Untilは、どちらもループ処理のアクションですが、目的と使い方が大きく異なります。

For eachとDo Untilの違い

For Each

  • 用途:アレイ(配列)の要素を1つずつ処理する
  • ループ回数:アレイの要素数
  • 入力データ:アレイ型のデータが必要
  • 主な使用例:取得したExcelの行を1行ずつ処理

Do Until

  • 用途:条件がTrueになるまで繰り返す
  • ループ回数:条件次第(最大回数の制限あり)
  • 入力データ:不要(条件式のみ)
  • 主な用途:条件を満たすまで繰り返す

For eachは、SharePointリストやExcelで取得した全データに対して、何か処理をする際によく使います。

一方でDo Untilは、条件を満たすまで繰り返し処理をするものです。

今回解説する「翌営業日の判定」では、日付が営業日(土日祝日以外)になるまで日付を1日ずつ加算していく必要があります。

このようなケースでは、Do Untilを使う必要があります。

For eachの仕組みについては、以下の記事をご参考ください。

【PowerAutomate入門】Apply to eachとは?~アレイ(配列)を1つずつ処理する方法~ この記事では、Power Automateの「コントロール」アクションの一つ「Apply to each」の使い方を解説します。...

Do Untilで翌営業日を判定する方法

Do Untilの使用例として「翌営業日を判定する」方法を紹介します。

翌営業日の判定では、日付が営業日(土日祝日以外)になるまで、日付を1日ずつ加算していきます。

土日だけでなく、祝日も考慮したい場合、今回はSharePointリストに祝日一覧を登録しておく方法をとっています。

フローのロジック

今回作成するフローの全体構成は以下のようになります。

翌営業日判定のフローのロジック
  1. Recurrence(トリガー):スケジュールでフローを開始
  2. 変数を初期化する:targetDate 判定対象の日付を格納する変数
  3. 変数を初期化する:isBusinessDay 営業日かどうかのフラグ(True/False)
  4. Do Until:isBusinessDayがTrueになるまでループ
    1. 複数の項目の取得:SharePointリストから祝日を検索
    2. 条件分岐:土日祝日かどうかを判定

      →True(土日祝の場合):変数targetDateを1日加算

      →False(営業日の場合):変数isBusinessDay=True
ミムチ

何だか複雑そうですな…

パワ実

最初はロジックの理解が難しいかもしれませんが、少しずつ解説していきますね!

詳しい実装方法を解説していきます。

フローの実装方法

①祝日リストの用意

SharePointリストで、以下のような「祝日リスト(Holiday)」を準備します。

※祝日リストは、毎年メンテナンスが必要になります。

パワ実

土日判定は関数式で簡単にできますが、祝日判定は難しいのと、組織特有の休暇(年末年始・夏季休暇等)も考慮するためです。

②フローの実装

次に、Power Automateを実装していきます。

1.スケジュールトリガーの次に、「変数を初期化する」アクションを追加し、以下のように変数「targetDate」を設定し、明日の日付を格納します。

変数の初期化の設定

  • 名前:targetDate ※任意の変数名でOK
  • タイプ:文字列
  • 値:関数式(fx)から以下の式を入力
addDays(convertFromUtc(utcNow(), 'Tokyo Standard Time'), 1)

※Power AutomateのutcNow()関数は、UTC(協定世界時)で現在日時を取得するため、convertFromUtc関数で、日本時間に変換します。

2.「変数を初期化する」アクションをもう一つ追加し、以下のように変数「isBusinessDay」を設定します。

変数の初期化の設定

  • 名前:isBusinessDay ※任意の変数名でOK
  • タイプ:ブール値
  • 値:false

3.コントロールの「Do Until」を追加し、以下のように設定します。

Do Untilの設定

  • ループ停止条件:
    – 左:動的なコンテンツ(⚡)で変数「isBusinessDay」を設定
    – 中央:等しい
    – 右:関数式(fx)で、trueを設定
  • 件数:20 ※任意の最大ループ件数を設定
  • タイムアウト:PT1H ※任意のタイムアウト時間を設定

この条件で、変数「isBusinessDay」が「true」になったらループを抜けます。

変数「targetDate」が営業日となった時点で、変数「isBusinessDay」を「true」にします。

4.Do Until内に、SharePointの「複数の項目の取得」を追加し、以下のように設定します。

複数の項目の取得の設定

  • サイトアドレス:祝日リストのSharePointサイトを選択
  • リスト名:祝日リスト(Holiday)を選択
  • フィルタークエリ:holiday eq ‘<以下の関数式>’ のように設定
    ※holidayは祝日リストの日付列の内部名を入力
    ※<以下の関数式>の部分は、関数式(fx)から設定
formatDateTime(variables('targetDate'), 'yyyy-MM-dd')

ここで、targetDate(最初は翌日の日付を格納)が、祝日であれば、レコードが1件取得され、祝日でなければデータが取得できないため、次の条件の判定に使うことができます。

5.コントロールの「条件」を追加し、次のように3つの条件式を、「または」で設定します。

条件の設定(または)

  1. targetDateが祝日か?(祝日リストにデータがある場合、empty関数はfalseを返す)
    <祝日判定の関数式> 等しい false ※関数式で入力
  2. targetDateが日曜日か?
    <曜日の数値を取得> 等しい 0
  3. targetDateが土曜日か?
    <曜日の数値を取得> 等しい 6

※<祝日判定の関数式>と、<曜日の数値を取得>は、関数式(fx)から、以下の式を入力します。

empty(outputs('複数の項目の取得')?['body/value'])
dayOfWeek(variables('targetDate'))

empty関数では、「複数項目の取得」の取得結果が「空である」場合に、Trueを返します。

そのため、「複数の項目の取得」でフィルタークエリの条件(祝日リストの日付列=targetDate)に当てはまるデータがある(=targetDateが祝日)場合、関数式はfalseを返します。

dayOfWeek関数は、日付の曜日を数値で返し、0=日曜日、6=土曜日 となります。

そのため上記の条件式で、targetDateが、祝日、日曜、土曜のいずれかであるかを判定できます。(True→targetDateが土日祝日、False→targetDateが営業日)

6.Trueの場合、targetDateが土日祝日のため、1日追加します。

変数の設定で、直接自分の変数(targetDate)を関数式で使うことができないため、データ操作の「作成」を追加し、以下の関数式(fx)を設定します。

addDays(variables('targetDate'), 1)

7.その下に、「変数の設定」を追加し、変数targetDateを以下のように設定します。

変数の設定

  • 名前:targetDate を選択
  • 値:動的なコンテンツ(⚡)から、作成の出力を選択

8.条件のFalseの方には、「変数の設定」を追加し、変数「isBusinessDay」に「true」を設定します。

9.最後に、取得された翌営業日(targetDate)を使い、Teams通知等のアクションを設定します。

※この部分は任意のアクション設定をします。

③フローのテスト

例えば1/21(水)にフローを実行すると、以下のように翌営業日(1/22(木))がTeams投稿されます。

試しに、祝日リストに1/22(木)を入れて、1/21(水)にフローを実行してみます。

すると、祝日リストに登録された1/22(木)をスキップし、以下のように、翌営業日が1/23(金)として通知されます。

パワ実

このような感じで、土日祝日を除く、翌営業日の判定ができました!

まとめ

この記事では、Do Untilの仕組みと、土日祝日を除く翌営業日を判定するフローの実装方法を解説しました。

Do Untilは、設定した条件がTrueになるまで、ループ内のアクションを繰り返し実行します。

例えば、土日祝日を除く翌営業日を判定したい場合、変数として設定した日付が、営業日になるまで、1日ずつ追加していく処理をするのにDo Untilを活用できます。

パワ実

Do Untilは、様々なフローのロジックで使うので、ぜひ覚えておいてください!

ABOUT ME
パワ実(Microsoft MVP)
2021年からPower Platformの勉強中。 2023年にIT系・コンサルタントに転職し、仕事でPower Platformを活用したコンサルを行っています。 2025年~Microsoft MVP for Business Applications 受賞。Power Platformを使っていく中で、知りえた情報をブログ、Youtube、Xで発信しています。 2025年8月~現在は、フリーランスとして、Power Platform系ITコンサルタントとして活動中。 Power Platformに関するご相談は以下のページからお願いします! https://www.powerplatformknowledge.com/contact/