やはりデータ操作は「選択」、選択は全てを圧倒する - Power Automate

# はじめに
明日からいよいよゴールデンウイークが終わってしまう。
皆様はいかがお過ごしでしょうか。

私は（　＾ω＾）・・・。

さて、ゴールデンウイークに、ちょくちょく`Qiita`を更新してきましたが、
**`Power Automate`の[データ操作](https://learn.microsoft.com/ja-jp/power-automate/data-operations)の速度に焦点を当てて、繰り返し処理の速度について紹介します。**

https://learn.microsoft.com/ja-jp/power-automate/data-operations

# 実行するシナリオ
繰り返し処理を用いて、`2024年の日付タイムスタンプと曜日の一覧の配列を作成します。`
イメージはこんな感じです。

| Date | Weekday |
|:-:|:-:|
| 2024-01-01T00:00:00.0000000 | 月 |
| 2024-01-02T00:00:00.0000000 | 火 |
| 2024-01-03T00:00:00.0000000 | 水 |
| 2024-01-04T00:00:00.0000000 | 木 |
| 2024-01-05T00:00:00.0000000 | 金 |

といった具合に作成します。
2024年は366日あるので、366回分の繰り返し処理です。

# 比較対象
1. [Apply to each（現: それぞれに適用する）](https://learn.microsoft.com/ja-jp/power-automate/apply-to-each?tabs=classic-designer)
1. `Do until`
1. [選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)

上記の三つを比較します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2f1407a5-34fc-3a33-7e06-f280073846cb.png)

## 0. 事前準備

`曜日`は`オブジェクト`型の変数で、日本語表記に変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/39ffd5b1-1a24-9e19-dc79-c35cbf9d1374.png)

[Apply to each（現: それぞれに適用する）](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#range)と`Do until`は、結果を格納する配列を、あらかじめ用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/97683a0b-9c6a-fc7a-de9c-00d23a18f90e.png)

開始時間と終了時間は、[作成](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-compose-action)アクションで決め打ちです。

https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-compose-action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4b8cb048-651a-4f3d-ed7a-f39f64c28edc.png)

年間の日数は、[dayOfYear関数](https://learn.microsoft.com/ja-jp/office/client-developer/visio/dayofyear-function)で簡単に取得できます。

```plaintext:dayOfYear関数
dayOfYear(outputs('終了時刻'))
```

https://learn.microsoft.com/ja-jp/office/client-developer/visio/dayofyear-function

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9705ebda-5088-2553-c496-373e59cc0a7d.png)

## 1. [Apply to each（現: それぞれに適用する）](https://learn.microsoft.com/ja-jp/power-automate/apply-to-each?tabs=classic-designer)

`Apply to each`に渡す配列は[range関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#range)で定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4ddce654-392f-9fca-fcac-bd763921b544.png)

```plaintext:配列変数に追加
@{range(1, outputs('日数'))}
```

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#range

`配列変数に追加`に下記の値を設定します。

```plaintext:配列変数に追加
{
  "Date": @{addDays(addDays(outputs('開始時刻'),item()),-1)},
  "Weekday": @{variables('Weekday')?[string(dayOfWeek(addDays(addDays(outputs('開始時刻'),item()),-1)))]}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2ce7e101-5a92-3f97-8cb1-4653f8c36a2b.png)

:::note info
[item()](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#item)から、繰り返し処理の現在地を取得できるため、日別の繰り返し処理が実施できています。
:::

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#item

## 2. Do until
内容はほぼ`Apply to each`と一緒です。
変数`i`をイテレーターとして利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/410f16c4-fbbf-f28e-fa85-0e534d10e185.png)

## 3. [選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)
[データ操作の選択アクション](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)です。

https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/312b6f02-1e64-4f02-71bf-0ffc08642452.png)

`From`は、`Apply to each`同様です。

```plaintext:From
range(1, outputs('日数'))
```

`Map`は下記の設定にしています。

```plaintext:Map
{
  "Date": @{addDays(addDays(outputs('開始時刻'),item()),-1)},
  "Weekday": @{variables('Weekday')?[string(dayOfWeek(addDays(addDays(outputs('開始時刻'),item()),-1)))]}
}
```

やっていることは他と一緒ですね。

# 結果は[選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)が圧勝

見てのとおり、ぶっちぎりで`選択`が速いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/bbc5abc2-17c7-aea0-b0fc-37557256fb01.png)

| 方法 | 速度 |
|:-:|:-:|
| Apply to each | 2分20秒 |
| Do until | 2分32秒 |
| **選択** 🎊🔥✨ | **0.1秒** 🎊🔥✨|

:::note info
作成された配列は、同じ内容です！
:::

**こんなに違うものかと驚きですね！**

Power Automate始めたての時は、とっつきにくい印象がありましたが、
**間違いなく便利なメソッドです！**

一緒に身につけていきましょう！