子フロー：月間営業日配列取得

# きっかけ
PowerAutomateの主な用途はTeams通知ですが、休みに業務周知が届くのはワークライフバランスにも反しますし、見落としにもつながるので避けたいですね。また「第〇営業日が申請期限」「翌営業日が週次定例会」など営業日を判定できると、よりきめ細やかな周知が行えます。[子フロー：年間祝日カレンダー取得](https://qiita.com/shutaro_y/items/968e4a56af67b5e49753) と連動した月間営業日配列を取得できる子フローを作ったので内容を紹介します。
※営業日判定は別の子フローで詳細説明します。

＜親フロー処理内容＞
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c1642f5a-73ef-e820-1208-022b610f708f.png">

＜実行結果＞
子フローの返り値として月間営業日配列を受け取れます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/42e84d97-8458-2319-eab9-eb291eaf003a.png">

# 子フロー全体像
各パートの詳細内容は後述します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/8fd05b73-2c0a-c265-b9f3-970786395d88.png">

:::note warn
2024/2/21 ループ処理影響でパフォーマンス悪かったのでフロー見直しました。もともと10～20秒かかった処理が3秒程度に改善してます。
:::

---
# ①トリガ設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c3938210-8edd-da2f-93a6-5ff514f0433e.png">

親フローからは2つの引数を渡します。

[任意：数値] 対象年月
営業日を取得する年月（6桁）を指定します。指定がない場合は当月年月情報を取得できるようオプション設定にします。

---
# ②変数初期化
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/d7a537e5-6459-2523-9d81-9239fa56399f.png">

『変数を初期化する』で3つの変数を設定します。初期値設定するのは2つです。

* 対象年
本日日付の年(4桁)を初期値として設定します。
`@{int(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time','yyyy'))}`

* 対象月
本日日付の月(2桁)を初期値として設定します。1桁月は0パディングするため文字列設定します。
`@{convertTimeZone(utcNow(),'UTC','Tokyo Standard Time','MM')}`

---
# ③入力対象年月＝空値？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c03f39ef-59f4-dc19-8a49-4c7b3020cc04.png">

『条件』で入力対象年月の空値判定をします。

* 左辺： (式)triggerBody()?['number']
* 条件：次の値に等しい
* 右辺： (式)null

条件分岐以下の構成は以下の通りです。
<img width="1200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/9edd3484-5d37-d6d2-9b6e-619d3e03207a.png">

---
### ③-2) 数値桁数OK？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/8f9e40cc-583a-9f29-4088-fc5418bab936.png">

『条件』で入力対象年月の空値判定をします。
左4桁は祝日対応している2022～2050年を、右2桁は1～12の月を指定可能範囲とします。
* And（条件1）
  * 左辺： (式)`triggerBody()?['number']`
  * 条件：次の値以上
  * 右辺： 202200
* And（条件2）
  * 左辺： (式)`triggerBody()?['number']`
  * 条件：次の値以下
  * 右辺： 205000
* And（条件3）
  * 左辺： (式)`mod(triggerBody()?['number'],100)`
  * 条件：次の値以上
  * 右辺： 1
* And（条件4）
  * 左辺： (式)`mod(triggerBody()?['number'],100)`
  * 条件：次の値以下
  * 右辺： 12

---
### ③-3) 対象年変数の設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/4e00f228-f494-e237-1a46-5f3113b58cb2.png">

『変数の設定』で入力値を加工して対象年に設定します。
* 値：`@{int(substring(string(triggerBody()?['number']),0,4))}`

---
### ③-4) 対象月変数の設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/076a0c7e-9977-44cb-06cc-1bf7329fba66.png">

『変数の設定』で入力値を加工して対象月に設定します。
* 値：`@{substring(string(triggerBody()?['number']),4,2)}`

---
### ③-5) PowerApp または Flow に応答する(空応答)
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/5cebd48f-b09f-3b0e-f4e7-a93ae6ad060e.png">

『PowerApp または Flow に応答する』で休日配列を空配列で設定します。

* 営業日配列：`[]`

---
### ③-6) 終了（エラー）
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/a383121d-70c2-5804-4c1f-8915140cb719.png">

『終了』で処理を止めます。

---
# ④子フロー：休日配列取得の実行
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/d7e5451e-d086-93f8-ed4d-ad1bc1c7871c.png">

『子フローの実行』で[子フロー：年間祝日カレンダー取得](https://qiita.com/shutaro_y/items/968e4a56af67b5e49753) を呼び出します。
対象年は引数を考慮して値を設定、会社の営業日なので会社休暇は「あり」とします。
* 子フロー：`サブ：年間休日取得`
* 対象年：`@{variables('対象年')}`
* 会社休暇：`はい`

:::note warn
子フローの名前は環境に合わせて適宜直してください
:::

---
# ⑤スコープ：営業日配列生成
構成は以下の通りです。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/459d5eef-b8d2-afec-0624-075b40dd2431.png">

---
### ⑤-1) 操作配列の設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/7c1e0efd-ea7e-4484-4ab6-bb3ef8e62a36.png">

『変数の設定』で操作配列に対象月の1～28日を配列設定します。
* 名前：操作配列
* 値：`[
  "@{variables('対象年')}-@{variables('対象月')}-01",
  "@{variables('対象年')}-@{variables('対象月')}-02",
  "@{variables('対象年')}-@{variables('対象月')}-03",

    :
    
  "@{variables('対象年')}-@{variables('対象月')}-26",
  "@{variables('対象年')}-@{variables('対象月')}-27",
  "@{variables('対象年')}-@{variables('対象月')}-28"
]`

---
### ⑤-2～7) 〇日あり？　操作配列に〇日追加
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/d9acda67-2c72-e543-8244-06ab0eac8904.png">

29～31日は操作配列の最後の値（年月日情報）に1日加え、同一月であればその日付を追加します。
* 条件
  * 左辺：(式)`addDays(last(variables('操作配列')),1,'MM')`
  * 条件：次の値に等しい
  * 右辺：(式)`variables('対象月')}`
* 配列変数に追加
  * 名前：操作配列
  * 値：`@{variables('対象年')}-@{variables('対象月')}-XX`

:::note warn
配列変数に追加の値のXX＝29～31を設定
:::

---
### ⑤-8) 操作配列から平日抽出
『アレイのフィルター処理』の詳細設定モードで操作配列から月～金曜かつ祝日以外を抽出します。
* 差出人：`@variables('操作配列')`
* 条件：`@and(greaterOrEquals(dayOfWeek(item()), 1), lessOrEquals(dayOfWeek(item()), 5), not(contains(json(outputs('子フロー：休日配列取得の実行')?['Body']?['休日配列']), item())))`

:::note warn
祝日配列の子フローの名前は環境に合わせて適宜直してください
:::

---
# ⑥PowerApp または Flow に応答する
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/ea31e7f8-c902-9cfa-681c-dc082ca129ce.png">

『PowerApp または Flow に応答する』で作成した営業日配列をソート・JSON文字列化して返り値として設定します。

営業日配列：`@concat('["',join(sort(body('操作配列から平日抽出')),'","'),'"]')`

:::note warn
営業日配列は応答値に配列型設定できないため、配列形式の文字列で設定します。親フロー側で扱う場合はjson関数で変換する必要があります。
:::