【Power Automate】営業日計算を利用する前に確認したい設定と条件

【Power Automate】営業日計算を利用する前に確認したい設定と条件
🛡️ 超解決

Power Automateでフローを作成する際、営業日(ビジネスデイ)を計算したい場面は多くあります。たとえば「請求書の処理期限を営業日ベースで設定する」「メール送信を営業日だけに制限する」といった要求です。しかし、実際にフローを動かしてみると、土日や祝日が正しく反映されない、1日ずれてしまう、というトラブルが発生することがあります。この記事では、Power Automateにおける営業日計算の基本設定と、計算が期待通りにならない場合の確認ポイントを整理します。

【要点】この記事で確認すること

  • 最初に見る場所: Power Automateの式エディタで使用している日付関数(addDays、TODAY、WORKDAY系)の書き方と、フローのタイムゾーン設定
  • 切り分けの軸: 計算結果がずれる原因は「休日リストの未設定」「タイムゾーンのUTC/JST混在」「フロー実行時刻の影響」の3つに分類できます
  • 注意点: 会社PCのローカル時間ではなく、Power Automateのタイムゾーン設定とAzure ADの休日設定を確認してください。SharePointリストの日付を使う場合はリストのタイムゾーンも影響します

ADVERTISEMENT

営業日計算の基本:TODAYとWORKDAY関数の使い方

Power Automateで日付を扱う際、最もよく使われるのが「addDays」関数です。たとえば「addDays(utcNow(), 3)」と書くと現在のUTC時刻から3日後を返します。しかしこれでは単純にカレンダー日を加算するだけで、土日や祝日は考慮されません。営業日計算をするには、別のアプローチが必要です。

現在、Power Automateの式エディタにはWORKDAY関数は用意されていません。そのため、営業日計算を実現するには以下の方法が一般的です。

  • 方法1: 「条件」アクションで曜日を判定し、土日ならスキップする
  • 方法2: 休日リスト(SharePointリストやExcel)を参照して、該当日を除外する
  • 方法3: 「スケジュール」トリガーで営業日のみ実行するよう繰り返し間隔を調整する

これらの方法は単体では不十分なことが多く、組み合わせて使う必要があります。特に「方法2」の休日リストは、日本独自の祝日(振替休日、国民の休日など)を漏れなく管理する必要があるため注意が必要です。

式エディタでの一般的な記述例

たとえば、今日が営業日かどうかを判定するには以下のような式を「条件」アクションで使います。

// 今日の曜日を取得(0=日曜、6=土曜)
dayOfWeek(utcNow())

これが0または6の場合、土日なのでスキップします。しかしこれだけでは祝日を除外できません。そこで、休日リストをSharePointリストで管理し、該当する日付がリストに含まれているかを「Filter array」や「Condition」でチェックするのが標準的な実装です。

営業日計算がずれる原因と確認ポイント

フローで営業日計算が期待通りにならない場合、原因は大きく3つに分類できます。それぞれの確認ポイントを解説します。

原因1: タイムゾーンの違い

Power Automateの「utcNow()」関数は常にUTC時刻を返します。日本標準時(JST)で計算したい場合は、「convertTimeZone」関数を使ってJSTに変換する必要があります。たとえば「convertTimeZone(utcNow(), ‘UTC’, ‘Tokyo Standard Time’)」です。この変換を忘れると、日付が1日ずれる原因になります。特に深夜0時前後のフロー実行で影響が出やすいです。

原因2: 休日リストの未整備・不備

多くのフローでは、休日を定義したリスト(SharePointリストやExcel)を参照して営業日を計算します。しかし、以下のようなケースで計算が狂います。

  • 祝日データが古い(翌年の祝日が未登録)
  • 振替休日や国民の休日が漏れている
  • リストのタイムゾーン設定がUTCになっていて、日付がずれて登録されている

リストに日付を登録する際は、必ずPower Automateと同じタイムゾーン(通常は東京)で統一してください。

原因3: フロー実行時刻と営業日開始・終了の定義

たとえば「営業日10日後」を計算するとき、現在時刻が営業時間内かどうかでカウント開始日が変わることがあります。単純に日付だけ見ればいい場合と、時刻も考慮すべき場合があるため、要件を明確にしてください。また、フローが深夜に実行されると、UTCとの変換で「今日」がずれてしまうこともあります。

チェック項目 確認内容 修正方法
タイムゾーン フローの「タイムゾーン」設定と、使用している日付関数のタイムゾーンが一致しているか フローの設定でタイムゾーンを「Tokyo Standard Time」に変更し、関数でもconvertTimeZoneを使う
休日リスト 登録されている日付が正しいタイムゾーンか、祝日が漏れていないか リストの列のタイプを「日付のみ」にして、日付に時刻を含めない。データを最新の祝日カレンダーで更新する
日付の比較 「今日」の判定にutcNow()をそのまま使っていないか convertTimeZoneでJSTに変換した上で、formatDateTimeで日付部分だけ抽出する
ループ処理 営業日数だけループする際、終了条件が正しいか ループカウンタと、休日リストに該当する日をスキップする条件を確認する

管理者に確認すべき設定と環境依存の情報

Power Automateの営業日計算に関連して、管理者に確認する必要がある情報があります。特に組織全体で使うフローや、共有リソースを参照する場合は以下の点を押さえてください。

  • 休日リストの共有場所: 社内で共通の祝日リストが存在するか。存在する場合、そのリストのURLとアクセス権限を確認してください。存在しない場合は、自分でSharePointリストを作成し、管理者に公開を依頼する必要があります。
  • フロー実行アカウントの権限: フローを実行するサービスアカウント(通常はフロー作成者のアカウント)が、休日リストを読み取れる権限を持っているか確認してください。共有リストの場合は、アカウントにアクセス権が付与されている必要があります。
  • Power Automate環境のタイムゾーン設定: フロー作成画面の右上にある「設定」から「タイムゾーン」を確認してください。デフォルトは「UTC」です。日本で使う場合は「(UTC+09:00) Osaka, Sapporo, Tokyo」に変更しておきましょう。ただし、この設定は新しいフローにのみ適用される場合があるため、既存のフローは個別に確認する必要があります。
  • SharePointリストのタイムゾーン設定: SharePointリスト自体にもタイムゾーン設定があります(サイト設定 > 地域設定)。ここがUTCになっていると、リストに日付を登録した際に自動変換されてずれることがあります。管理者に依頼して「東京」に設定してもらいましょう。

これらの確認を管理者と共有することで、環境起因の問題を事前に排除できます。

よくある失敗パターンと対処法

実際に筆者が遭遇した失敗例をいくつか紹介します。同じミスを防ぐために参考にしてください。

  1. utcNow()をそのまま使って日付比較した結果、1日ずれた。 たとえば「formatDateTime(utcNow(), ‘yyyy-MM-dd’)」で今日の日付を取得すると、UTCのままなので日本時間では前日になることがあります。必ずconvertTimeZoneでJSTに変換してからformatDateTimeを使ってください。
  2. 休日リストに時刻付きの日付を登録したため、比較が一致しなかった。 SharePointリストの日付列はデフォルトで時刻を含む設定になっています。列の書式を「日付のみ」に変更するか、フロー側でformatDateTimeを使って日付部分だけを比較してください。
  3. ループで営業日をカウントする際、最初の日が休日だとスキップされずにカウントされてしまった。 ループの開始日に休日リストをチェックする条件を最初に置く必要があります。ループのロジックを見直しましょう。
  4. 「Apply to each」で休日リストを回すとき、大量のデータでパフォーマンスが低下した。 休日リストの行数が多すぎるとフローが遅くなります。リストを年度ごとに分割するか、ODataフィルターで必要な期間だけを取得するよう工夫してください。
  5. トリガーが「スケジュール」で毎日実行にしているのに、営業日だけ動いてほしい。 この場合、トリガーは毎日実行にしておき、最初のアクションで今日が営業日かどうかを判定し、営業日でなければ終了(Terminate)するようにします。または「条件」でスキップしても構いません。

営業日計算を安定させるための実践手順

ここからは、実際にフローで営業日計算を実装する際の手順を具体的に示します。SharePointリストを休日リストとして利用する前提です。

  1. 手順1: 休日リストを作成する
    SharePointサイトで「休日リスト」という名前のカスタムリストを作成します。列として「日付」(日付のみ)と「備考」(テキスト)を追加します。あらかじめ内閣府の祝日データなどを元に、数年分のデータを入力しておきます。
  2. 手順2: フローのタイムゾーンを設定する
    フローエディターの右上にある「フローの設定」を開き、「タイムゾーン」を「(UTC+09:00) Osaka, Sapporo, Tokyo」に変更します。
  3. 手順3: 今日の日付をJSTで取得する変数を追加する
    「変数の初期化」アクションを使って、以下の式で今日の日付を文字列として取得します。
    formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'yyyy-MM-dd')
  4. 手順4: 休日リストから該当する日付を取得する
    「SharePoint」コネクタの「アイテムの取得」または「アイテムのフィルター処理」を使用して、手順3で取得した日付と一致するアイテムを検索します。ODataフィルターは「Date eq ‘2025-02-11’」のように指定します。
  5. 手順5: 営業日かどうかを判定する条件を作成する
    「条件」アクションで、手順4の結果が空かどうかを判定します。空であれば営業日、結果があれば休日として処理を分岐します。さらに、曜日が土日の場合も条件に追加します。
    条件式の例:
    @or(equals(dayOfWeek(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time')), 0), equals(dayOfWeek(...), 6), greater(length(outputs('休日リスト_フィルター')), 0))
  6. 手順6: 営業日ベースの日付計算をするループを実装する
    たとえば「3営業日後」を計算する場合、変数「カウンタ」を0、「計算日」を今日として設定し、「Apply to each」で繰り返し処理を行います。各繰り返しで計算日を1日進め、それが営業日かどうかを手順5と同じ方法でチェックし、営業日ならカウンタを+1します。カウンタが目標値に達したらループを抜けます。

これらの手順を踏むことで、正確な営業日計算が可能になります。なお、ループが長くなる場合は「Do until」アクションの使用も検討してください。

よくある質問(FAQ)

Q1: フロー内で「WORKDAY」関数は使えますか?
A1: 標準の式エディタではWORKDAY関数は提供されていません。代替として、上記の方法で休日リストとループを使って実装します。サードパーティのコネクタを使う方法もありますが、セキュリティポリシーを確認してください。

Q2: 休日リストをExcelで管理しても大丈夫ですか?
A2: 可能ですが、Excelの場合はファイルの場所(OneDriveやSharePoint)とアクセス権限、同時編集の競合に注意してください。安定性を重視するならSharePointリストがおすすめです。

Q3: 営業日計算の結果が1時間単位でずれることがあります。なぜですか?
A3: 時刻の扱いが原因です。タイムゾーン変換の際に時刻まで含めて変換していると、日付の境界でずれが生じます。日付のみを扱う場合は、必ずformatDateTimeで日付文字列に変換してから比較してください。

まとめ

Power Automateで営業日計算をするには、タイムゾーンの統一、休日リストの整備、そして曜日判定の3つが基本です。多くのずれは「utcNow()をそのまま使っている」「休日リストのタイムゾーンが合っていない」という単純なミスから発生します。まずはフローのタイムゾーン設定と使用している関数のタイムゾーンを確認し、次に休日リストのデータが最新かどうかをチェックしてください。この記事で紹介した手順と確認ポイントを参考に、安定した営業日計算フローを構築しましょう。


この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。