Power Automate 非稼働日はフローを処理中断する方法

先日「第30回 Office 365 勉強会」に参加・登壇してきました。（きました、と言ってもご時世なのでオンライン勉強会なんですけどね）

第30回 Office 365 勉強会
https://jpo365ug.connpass.com/event/191573/

実は、Office 365 勉強会で登壇するのは初めて（記憶にある限り）でした。テーマが「365 でリモートワークを。」ということで、当方からは「Teams ＋ Power Platform でチームの状況連携を円滑にした話し（Project Oakdale をそえて）」という内容をお伝えしました。

今回は、登壇内容でも紹介した Power Automate の”繰り返し”（タイマー処理）で、祝日などの”非稼働日”を意識させるポイントを記事にしておこうと思います。

# 当方の登壇資料
当方の登壇資料は下記からご覧いただけます。ご参考までに。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/GyR2Gvzr2nfajB" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/TeruchikaYamada/teams-power-platform" title="Teams ＋ Power Platform でチームメンバーの状況報告を圧倒的効率化！" target="_blank">Teams ＋ Power Platform でチームメンバーの状況報告を圧倒的効率化！</a> </strong> from <strong><a href="//www.slideshare.net/TeruchikaYamada" target="_blank">Teruchika Yamada</a></strong> </div>

# Power Automate の繰り返し＋非稼働日
さて本題。Power Automate の繰り返し（タイマー処理）に対して、非稼働日を意識させる方法です。

## 想定される主なニーズ
下記のような要件ありますよね？

- 祝日は処理したくない
- 非稼働日が不定期（毎月異なる等）
- 所属組織で決められた休日がある（祝日でもない）

もちろん、上記は全て「例えば・・・」のハナシなんですけども、こういうのは存外多いと思ってます。

## 曜日の指定
これ以降の説明では ”月～金” が稼働日、土・日 および祝日 が非稼働日であるという設定ですすめます。Power Automate では曜日で着火する設定が可能です。まずは曜日で着火する箇所を指定します。

「繰り返し」のトリガーで、下記の設定をすれば月～金のみになります。

間隔 ＝ １
頻度 ＝ 週
設定曜日 ＝ 月 ～ 金にチェック

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/53cb1c5d-eb59-b0e3-b3ca-e7a9b136cae6.png)

設定時刻 (時間)、設定時刻 (分) はフローが実行してほしいタイミングを指定してください。例えば、AM 9時に着火させたい場合であれば下記です。

設定時刻 (時間) ＝ 9 にチェック
設定時刻 (分) ＝ 0 （半角数字のゼロ）

## Power Automate は祝日なぞ知らぬ！
前述の設定で曜日指定はできました。土・日を除外できたので、残りは祝日が判断できれば良いですよね？

しかし、Power Automate は日本の祝日なぞ考慮してはくれません。各国の祝日を把握してたら、そりゃスゲェってなりますが、残念ながらそんな機能は現時点では搭載されていません。なので、自前で対処します。では、非稼働日をどうやって把握するか？

土日以外の”非稼働日”を記録しておく場所を用意すれば良いです。
「非稼働日マスター」を準備して「この日付だったら処理を中断する」という流れを作ります。

## 非稼働日マスター（例）
当方が利用している非稼働日マスターは下記になります。データソースは、SharePoint Online のカスタムリストでも、CDS でも、Oakdale CDS でも何でもOKです。ようは「この日付はお休みだよ！」ってのが記録できれば問題ありません。

例えば、テーブル名を「M_NON_WORKING_DAY」と命名しましょうか。列やデータ型は下記の2つがあれば十分です。

| 列名             | 日本語   | データ型 | 説明        |
|----------------|-------|------|-----------|
| HolidayName    | 非稼働日名 | テキスト | 非稼働日の名称   |
| NonWorkingDate | 非稼働日  | 日付のみ | 動作＝“日付のみ” |

なお、上記の［HolidayName］に関しては人間が識別しやすいように追加しているだけです。システム的に必要なのは［NonWorkingDate］のみです。

今回の説明では、Oakdale CDS に作成したテーブルを利用していきます。登録するデータのイメージは下図を参照ください。（イコール、作成するフローも おーくでーる環境下になります。が、今回の主題ではないので詳細は割愛。おーくでーる環境について知りたい方は過去記事を参照ください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/e7d067e4-f544-da9c-98a4-6d6d579c60c7.png)

## 非稼働日の判定
まず、CDS（現在の環境）から［レコードの一覧］アクションを指定して、該当テーブル（エンティティ）から全データをゴッソリ取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/f94bbce1-6e49-bcf7-5dde-0a7a658474db.png)

単一のデータ（行）のみを取得する［レコードの取得］というアクションもあるのですが・・・。そのアクションで単一行を取得するためには、Key として ID が必要なんですよね。この Key を把握できていれば利用可能ですが、タイマー処理系のフローでは処理内でIDを把握するコトはおそらくできてないと思います。なので、きっと今回の例ではコイツは活躍しません。なので、今は忘れて結構ですｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b9ed3c7f-6ffa-f38d-3641-9480639a54d8.png)

と、いう前提を案内したうえで、下記が非稼働日チェックの全体イメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b218989b-1d8d-528e-d205-921039424a60.png)

タイムゾーンの変換をしている意図がピンとこない方は、是非とも自力で調べてみましょう。

非稼働日マスターと、現在の処理日付を比較するには［アレイのフィルター処理］を利用します。既に取得済みの”非稼働日マスター 全データ”に対して、タイムゾーンを変換した日付をぶつけています。右辺は下記です。

```
formatDateTime(body('タイム_ゾーンの変換'), 'yyyy-MM-dd')
```
上記でデータイメージを案内しましたが、Automate の処理中は Oakdale CDS から取得した［日付］が'yyyy-MM-dd'形式になってるんです。なので、形式変換をしている、というワケです。ここは利用しているデータソースによって差異があるかもしれません。ご注意ください。
さて、処理日付が非稼働日マスターに存在していれば、1つのデータが取得できるハズですよね？そのため、後続の処理で「非稼働日マスターから処理日付をぶつけて、データが存在しなかったら稼働日」という判断ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/58f06dee-2e31-e5c1-bcfb-58d1ec248f88.png)
上記のように、条件分岐で「該当のアレイが空っぽ（empty）だったら継続。データがあれば終了」とすれば、非稼働日は処理中断が可能ですね。自分がよく式を忘れるので備忘録的に条件分岐の左辺をメモしておきます。

```
empty(body('非稼働日マスターとの比較'))
```
あとは、継続される処理のながれで稼働日に実施したかった処理を作成ください。

# まとめ
- Power Automate は曜日の判断は可能
    - 日本の祝日などは基本機能で考慮されてない
- 曜日以外で非稼働日などを判定したい場合は専用の仕組みが必要
    - 例えば、非稼働日マスター

チョッとしたテマですが、例えば Teams 等へ通知するフローだったり、メールを飛ばすようなフローの場合、”非稼働日は通知しない”という配慮をするだけで利用者（あるいは、通知やメールを受け取る相手）の気持ちが良くなる可能性ありますよね。あきらめて非稼働日に通知などを飛ばしちゃってた方々、チョッとトライしてみませんか？ご参考になれば幸いです。

それでは、皆さま、素晴らしい Power Platform Life を！