ADVERTISEMENT

【Power Automate】休日を除いて期限計算したい時の注意点

【Power Automate】休日を除いて期限計算したい時の注意点
🛡️ 超解決

Power Automateを使って期限日を自動計算する機会は増えていますが、単純に日数を加算するだけでは土日や祝日が含まれてしまい、実際の営業日と乖離することがあります。特に社内の承認フローやタスク管理では、休日を除いた正確な期限計算が求められます。しかし、Power Automateには標準で「営業日加算」を行う関数が用意されていないため、自分でロジックを組む必要があります。本記事では、休日を除外した期限計算を実装する際に陥りやすい失敗とその対策を具体的に解説します。

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

  • 最初に見る場所: 使用しているPower Automateのライセンスと利用可能なコネクタ。休日データの取得方法が制限されるため、事前に確認が必要です。
  • 切り分けの軸: 休日を静的リストで管理するか、動的に取得するか。また、タイムゾーンの変換が正しく行われているかも重要です。
  • 注意点: 会社の休日ルールに合わせるには、管理者が管理するカレンダーや共有リストの利用を検討してください。勝手にローカルリストを作ると更新漏れの原因になります。

ADVERTISEMENT

Power Automateにおける休日を考慮した日付計算の基本

Power Automateで日付を操作するには、主に「addDays」「utcNow」「convertFromUtc」「dayOfWeek」などの式を使用します。例えば、今日から5営業日後の日付を計算したい場合、単純に「addDays(utcNow(), 5)」とすると土日祝日を含めた5日後になってしまいます。これを防ぐには、加算する日にちを1日ずつ増やしながら、その日が休日かどうかをチェックするループ処理が必要です。

休日を判別する方法としては、大きく分けて「静的リストを用いる方法」と「動的に取得する方法」の2つがあります。静的リストはSharePointやExcelに休日一覧を用意しておく方法で、動的取得はOffice 365 Groups Calendarや外部APIを利用する方法です。それぞれメリット・デメリットがあり、会社の規模や運用ルールに応じて選択します。

なお、タイムゾーン変換も重要な要素です。Power Automateの日時はデフォルトでUTC(協定世界時)として扱われるため、日本時間で計算する場合は「convertFromUtc(utcNow(), ‘Tokyo Standard Time’, ‘yyyy-MM-dd’)」のように変換してから処理を始める必要があります。変換を忘れると、日付が1日ずれる原因になります。

休日を除外する主なアプローチ

静的休日リストの利用(SharePointリスト)

最も手軽な方法は、SharePointに休日一覧のリストを作成し、フロー内でそのリストを参照して条件分岐を行う方法です。リストには日付と休日名を列として設定し、年ごとに更新します。フローでは、ループで1日ずつ加算しながら、その日付がリストに存在するかを「Get items」アクションで確認します。存在する場合はさらに1日加算し、存在しなければその日を営業日と判断します。

動的取得(Office 365 Groups Calendar)

会社でOutlookのグループカレンダーに休日を登録している場合、そのカレンダーからイベントを取得して休日とみなす方法もあります。この方法は、管理者がカレンダーを更新すれば自動で反映されるためメンテナンスが容易です。ただし、カレンダーに予定が大量にあるとパフォーマンスが低下する可能性があるため、フィルター条件を適切に設定する必要があります。

組み込み関数のみで簡易的に実現する方法

土日だけを除外したい場合は、外部リストを使わずに「dayOfWeek」関数を利用できます。ループの中で加算日の曜日をチェックし、土曜(6)または日曜(0)であればスキップします。しかし、この方法では祝日を考慮できないため、祝日が多い国や業種では実用的ではありません。あくまで簡易的な暫定対応として使いましょう。

実践手順:SharePointリストを使った休日除外計算

ここでは、開始日から指定された営業日数後の日付を計算するフローを、SharePointリストを用いて構築する手順を説明します。SharePointリストには「Title」列(日付)と「HolidayName」列(テキスト)を用意し、休日データを事前に入力しておきます。

  1. SharePointリストの作成:サイトコンテンツから新しいリストを作成し、「日付」列を追加(列名は「HolidayDate」)し、日付型に設定します。さらに「HolidayName」列(テキスト型)を追加して休日名を入力できるようにします。運用前に、当年のすべての祝日を登録します。
  2. フローのトリガー設定:例えば「スケジュール」トリガーや「新しいアイテムが作成されたとき」トリガーを選びます。ここでは手動トリガーでテストします。
  3. 変数の初期化:「変数を初期化する」アクションで、開始日(startDate)と営業日数(businessDays)、カウンター(counter)、結果日(resultDate)を用意します。startDateには「convertFromUtc(utcNow(), ‘Tokyo Standard Time’, ‘yyyy-MM-dd’)」を設定し、businessDaysには任意の数値を指定します。counterは0で初期化します。
  4. ループ(Do until)の設定:「Do until」アクションで、counterがbusinessDaysに達するまで繰り返す条件を設定します。ループ内ではまず1日加算(addDays(resultDate, 1, ‘yyyy-MM-dd’))し、その日付をresultDateに代入します。次に「アイテムの取得」アクションでSharePointリストからresultDateに一致する休日を検索します。
  5. 条件分岐とカウンター制御:検索結果が空であれば(休日でなければ)、counterを1増やします。空でなければ(休日ならば)、counterは増やさずに次のループに進みます。これにより、休日はスキップされてカウントされません。
  6. ループ脱出後の処理:ループを抜けたら、resultDateが求める期限日です。必要に応じてメール通知やレコード更新を行います。なお、ループの上限回数(最大繰り返し回数)を設定しないと、リストに存在しない過去の日付で無限ループになる恐れがあります。必ず「カウント上限」を設定してください。目安は「businessDays × 2 + 10」程度です。

この手順は一見シンプルですが、いくつかの落とし穴があります。次のセクションで詳しく解説します。

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

タイムゾーンの未変換による日付ズレ

最も多い失敗が、UTCのまま日付を扱ってしまうことです。例えば日本時間で2025年1月1日を開始日にしたい場合、utcNow()は2024年12月31日15:00(UTC)を返すため、そのまま日数を加算すると1日ずれます。必ずconvertFromUtcを使って日本時間に変換してから使用しましょう。

文字列と日付の型変換ミス

Power Automateでは日付を文字列として扱うことが多く、addDays関数は文字列型の日付を期待します。しかし、SharePointから取得した日付が異なる形式(UTCタイムスタンプなど)の場合、直接比較すると正しく動作しません。対策として、フォーマットを統一(例:’yyyy-MM-dd’)するためにformatDateTime関数を使うとよいでしょう。

ループ内での変数更新忘れ

Do untilループの中でresultDateを更新し忘れると、同じ日付をチェックし続けて無限ループになります。必ずループの開始時に1日加算し、その結果をresultDateに再代入してください。また、SharePointリストのフィルター条件が正しいか(日付が完全一致か)も確認が必要です。

週末のみ考慮し、祝日を無視

土日だけを除外する簡易ロジックで済ませてしまうケースです。日本のように祝日が多い国では、ゴールデンウィークや年末年始で大幅なズレが生じます。本番運用前に、必ず会社の休日カレンダーと照合してください。

管理者に確認すべきポイント

休日を正しく扱うためには、IT管理者や人事部門との連携が欠かせません。以下の項目を事前に確認してください。

  • 会社の休日カレンダーの所在:SharePoint、Outlookカレンダー、あるいは社内ポータルサイトのどこで管理されているか。Power Automateでアクセスできるかどうか確認します。
  • テナント全体の休日設定の有無:Microsoft 365には組織全体の休日設定(Outlookの「休日カレンダー」)を追加できます。これを利用すれば、各ユーザーのカレンダーに自動反映され、フローからも取得可能です。
  • Power Automateライセンス制限:SharePointコネクタやOutlookコネクタは無料プランでも使えますが、プレミアムコネクタ(例えばHTTP要求で外部APIを呼ぶ場合)が必要な場合があります。シード権限で足りるか、有償ライセンスが必要か確認します。
  • データ保持ポリシー:休日データを外部APIから取得する場合、会社のセキュリティポリシーに違反しないか確認します。

状況別比較表

方法 メリット デメリット 推奨シチュエーション
静的リスト(SharePoint) 実装が容易。オフラインでも動作。自由に休日を定義可能。 リストの更新が必要。年が変わると更新漏れのリスク。大量の休日があるとループが長くなる。 休日が比較的少ない、または年に数回しか更新しない企業。
動的取得(Office 365 Calendar) 管理者がカレンダーを更新すれば自動反映。メンテナンス不要。 カレンダーの予定が増えるとパフォーマンス低下。フィルターが複雑になりがち。 すでにOutlookカレンダーで休日を一元管理している企業。
組み込み関数のみ(週末除外) 外部データ不要。実装が最も速い。 祝日を考慮できない。精度が低い。 土日のみを除外したい暫定的な自動化、または祝日がない期間の限定運用。

よくある質問(FAQ)

Q: 休日が連続する場合(例えば年末年始)はどうすればいいですか?

A: ループ内で1日ずつチェックするため、連続する休日も自動的にスキップされます。ただし、ループ回数が増えるため、パフォーマンスに影響が出ることがあります。上限回数を多めに設定するか、あらかじめ休日リストに連続した休日をすべて登録しておいてください。

Q: 午前中だけの休日や部分的な休日はどう扱いますか?

A: 通常の休日計算では日付単位で扱うため、時間まで考慮するにはデータ型に日付時刻型を使用し、条件を細かく設定する必要があります。例えば、午前中のみ休日の場合、その日は半日営業日としてカウントするロジックを別途組みます。実装は複雑になるため、まずは日付単位で運用し、どうしても必要な場合に限定して検討してください。

Q: 地域ごとに休日が異なる場合はどうすればよいですか?

A: SharePointリストに「地域」列を追加し、フロー内で対象の地域を指定してフィルターします。動的取得の場合は、地域別のカレンダーを用意するか、外部APIのパラメータに地域コードを含めます。フローが複数地域を扱う場合は、条件分岐を使って処理を切り替えるとよいでしょう。

Q: ループが長くなると実行時間が気になります。対策はありますか?

A: ループの前に、開始日から終了日までに含まれる休日を一括でカウントする方法もあります。例えば、SharePointリストから開始日と終了日の範囲内の休日をすべて取得し、その数だけ日数を追加する方式です。ただし、実装が複雑になるため、ループで処理できる範囲であればそのままでも問題ありません。Power Automateの従量課金を考慮し、実行頻度が高い場合は最適化を検討してください。

まとめ

Power Automateで休日を除いた期限計算を行うには、静的リストか動的取得を用いたループ処理が必要です。タイムゾーン変換や型変換を忘れると微妙なズレが生じるため、テストを徹底しましょう。会社の休日ルールに合わせるために、管理者と連携して正しい休日データを用意することが成功の鍵です。また、ループの上限回数を設定し、無限ループを防止してください。これらの注意点を押さえて、正確なワークフローを構築してください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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

ADVERTISEMENT