Power Automateで祝日や土日、業務時間後を判定する

# はじめに

Power Automateで祝日や土日、業務時間後を判定し、「業務時間外だけ何か処理をしたい」または「業務時間だけ何か処理をしたい」というニーズに応えられるようにしてみました。

# 祝日データの準備

まず、祝日データを用意します。

内閣府の国民の祝日に関するページからCSVがダウンロードできるので、それをExcelとして保存し、テーブルにしておき、OneDriveなどに保存してPower Automateから参照できるようにします。

* [国民の祝日について - 内閣府](https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/1fc32d9c-0ccc-49ac-b531-df8465c4aabd.png)

# Power Automate 全体像

こんな感じになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/d5816ebc-931d-e1c8-dfdf-6593ac53106d.png)

# 解説

ひとまず今回は「土日、祝日、業務時間に特定の処理を行う」方で作ってみます。

## トリガー

今回はテストがしやすいようにトリガーは「手動」にして、実行時にUTCのISO 8601形式で入力するようにします。実際にはメールの受信やFormsの投稿など適宜変更します。

受け取ったあと、タイムゾーンの変換アクションで日本時間に変換しておきます。日時を変数に入れるときに式で判定してもいいのですが、ここでアクション作っておくと、トリガーが変わっても基準時間変えるだけでいいのであえて入れてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/c4d224e3-b891-15fa-01b5-5f77c11157a2.png)

## 変数の初期化

トリガーとなる日時から後の処理で必要な以下の3要素を変数に入れておきます。

* 年月日
* 日時のうちの「時」の24時間表記（例 22:30なら"22"）
* 曜日

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/df27c2e7-a64b-f799-2810-901e50654b7a.png)

年月日は文字列で格納します。式でformatDateTimeを使い、"2021-02-20"のような形式で格納します。

```
formatDateTime(body('日本時間に変更'),'yyyy-MM-dd')
```

「時」は後で大小比較をしたいので整数で格納します。式でformatDateTimeを使い、"HH"で24時間表記の「時」のみ取り出します。（hhだと12時間表記になって計算がおかしくなるので注意）

```
int(formatDateTime(body('日本時間に変更'),'HH'))
```

曜日は式でdayOfWeek関数を使うと取り出せます。
日月火...土の順で1,2,3...6の数字として判定したものを格納します。
ここも整数型の変数なので、intで変換しておきます。

```
int(dayOfWeek(body('日本時間に変更')))
```

## 祝日情報の読み込み

祝日情報を読み込みます。Excelの「表内に存在する行を一覧表示」アクションを使います。
このアクションで、先ほど内閣府の国民の祝日データをもとに作成したExcelを読み込みます。

この時、フィルタークエリで、今回トリガーで指定された日付で絞り込みます。
また、DateTime形式はISO 8601にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/bd37bd68-084a-6edf-2548-4b7f59293e19.png)

## 祝日の判定

祝日を判定し分岐します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/72c98087-426a-03a8-84df-8a4d309d8ec1.png)

祝日の判定は、祝日情報の読み込みで取得したデータが存在するかどうかで判定します。
式でempty関数を利用します。

```
empty(outputs('祝日情報の読み込み')?['body/value'])
```

祝日情報にデータがないと、上記の式はtrueを返し、データがあるとfalseを返します。
言い方を変えると、式がfalseだと祝日ということになります。

祝日の場合は「はい」の分岐に進み、処理（今回は通知送信）を行います。

祝日でない場合は「いいえ」の分岐に進みます。

## 土日の判定

最初に曜日を判定しているので、その変数を使います。
曜日が0（日曜）または6（土曜）の場合は「はい」の分岐に進み、処理を行います。

「いいえ」の場合はさらに業務時間かどうかの判定に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/741d1400-c81c-9fa9-c948-597a5b71b857.png)

## 業務時間の判定

最初に時間の「時」の部分（22:30の「22」）を変数に入れいているのでこれを使います。

今回は業務時間を9-17時としました。
なので、And条件で、「時」が9以上かつ17未満であるかどうかを判定します。

条件を満たす場合は「はい」の分岐に進みますが、この場合、業務時間内ということになります。

今回は「土日、祝日、業務時間に特定の処理を行う」ことを想定しています。
言い方を変えると「業務時間内は処理を行わない」ので、「はい」の場合はここで処理を終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/29856748-6535-eca9-7101-e263a4aba78a.png)

「いいえ」の場合は「業務時間ではない」ことになるので、後続の処理に続きます。

## 処理

今回はダミーでモバイル通知を入れてありますが、適宜差し替えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/42b7b80f-3881-83af-1bb6-dcf2257acc86.png)

# 注意点

業務時間の判定は以下のケースでテストしていますが、本番利用の際は各自でテストいただいた上でご利用ください。

* 平日 業務時間：2021/2/22（月）10時
 * 2021-02-22T01:00:00
* 平日 業務時間外：2021/2/22（月）20時
 * 2021-02-22T12:00:00
* 土曜：2021/2/27（土）10時
 * 2021-02-27T01:00:00
* 祝日：2021/2/23（祝）10時
 * 2021-02-23T01:00:00

また、今回、業務時間を9-17時として作りましたが、厳密には17時ちょうどは業務時間外と判定されます。（16:59:59まで業務時間判定なので実用上は問題ないと思いますが）

なお、業務時間で17:30など「分」も考慮したい場合はもう少し作りこみが必要です。

## おわりに

相談受けて作ってみたのですが楽しかったです。