フロー実行ごとにテーブルの値を順に取得する

## はじめに

以前の記事、[ファイルの情報を取得し、自動送信する](https://qiita.com/toukamin/items/83c619423e5dcd597874) を少しパワーアップさせます。

フロー実行ごとに、ある値を1ずつ増加させて、その値をキーとしてテーブルから値を取得し実行ごとに異なる値を出すようなフローを作ってみます。



## やりたいこと

[以前の記事](https://qiita.com/toukamin/items/83c619423e5dcd597874) から、以下の処理を追加する。

* ファイル（テーブル構造）のレコード数を取得
* キー と レコード数 が等しいかどうか
    * 等しいとき：テキストファイルを 1 に上書き
    * 等しくないとき：テキストファイルを 1 + キー に上書き

![step2_加工.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/64ee89de-bd35-478b-da79-3c672dadd77d.png)

フローが実行されるたびに ID = (前回の実行ID + 1) の値を取得する。
キーが最後のレコードを取得した後に、キーを最初のレコードを指定するよう上書きすることで、ループ的な出力結果を実現できる。

## フロー全体図

最終的に以下のようなフローを作成した。
![フロー全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/4186ed2b-c5e5-8e24-82e5-6b6dc6f174b4.png)

1. トリガー（ここではスケジュール）
1. [ファイルコンテンツの取得](https://learn.microsoft.com/en-us/connectors/onedrive/#get-file-content)
1. [変数を初期化する](https://learn.microsoft.com/en-us/power-automate/create-variable-store-values#initialize-a-variable)
1. [行の取得](https://learn.microsoft.com/en-us/connectors/excelonline/#get-a-row)
1. [メールの送信(v2)](https://learn.microsoft.com/en-us/connectors/outlook/#send-an-email-(v2))
1. [変数を初期化する](https://learn.microsoft.com/en-us/power-automate/create-variable-store-values#initialize-a-variable)
1. [表内に存在する行を一覧表示](https://learn.microsoft.com/en-us/connectors/excelonline/#list-rows-present-in-a-table)
1. [それぞれに適用 Apply to each](https://learn.microsoft.com/en-us/power-automate/apply-to-each)
    1. [変数を増やす](https://learn.microsoft.com/en-us/power-automate/create-variable-store-values#increment-variable)
1. [条件](https://learn.microsoft.com/en-us/power-automate/add-condition)
    1. [ファイルを更新](https://learn.microsoft.com/en-us/connectors/onedrive/#update-file)
    1. [ファイルを更新](https://learn.microsoft.com/en-us/connectors/onedrive/#update-file)

## フロー作成

今回のフローで主要な部分について

### [フローの2 ~ 4] ファイルコンテンツの内容を変数に格納

[以前の記事](https://qiita.com/toukamin/items/83c619423e5dcd597874) では変数に格納しなかったが、`currentValue` という変数を用意し、テキストファイルの内容を変数に格納する。
取得したコンテンツは整数型ではないので、intにキャストして格納する。`int(outputs('ファイル_コンテンツの取得')?['body'])`

その後の [行の取得](https://learn.microsoft.com/en-us/connectors/excelonline/#get-a-row) で、キー値に`currentValue`を指定する。
![ファイルの内容を変数に格納.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/3e57aefc-9fb3-6e5f-ee81-4daa97102b5b.png)

### [フローの6 ~ 8] ファイル（テーブル構造）のレコード数を取得

テーブルの行数を変数に格納する。
変数 `tableRowCount` を用意し、初期値を0に指定。
[表内に存在する行を一覧表示](https://learn.microsoft.com/en-us/connectors/excelonline/#list-rows-present-in-a-table) アクションで、行の一覧を取得する。

取得した行数を `tableRowCount` に格納したい。
それには、[それぞれに適用](https://learn.microsoft.com/en-us/power-automate/apply-to-each) アクションで取得した行をループ処理で回し、`tableRowCount`を増加させる。

![行数を取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/28c71e5e-cff0-cf0a-3cb1-129453e1de11.png)

### [フローの9] キーと行数が等しいかどうかの条件分岐

例えば、キー：`currentValue` =  10 、レコード数： `tableRowCount` = 10 で等しいとき、
フローの最後でテキストファイルのキー値を 1 で更新する。
次のフローの実行では、`currentValue` = 1 、  `tableRowCount`  = 10 で等しくないので、
フローの最後でテキストファイルのキー値を `currentValue` + 1 の値 で更新する
…といった処理を実装するには、

[条件](https://learn.microsoft.com/en-us/power-automate/add-condition) アクションを追加し、
`currentValue` と `tableRowCount` を比較する。
trueのとき、[ファイルを更新](https://learn.microsoft.com/en-us/connectors/onedrive/#update-file) アクションで、ファイルコンテンツに ```string(1)``` と指定。
falseのとき、同じくファイルを更新アクションで、ファイルコンテンツに`string(add(1,variables('currentValue')))` と指定。

![条件分岐.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/f28d0b73-da6f-560f-3dd9-b79c953b8428.png)


## 実行結果

テキストファイルの値を1にして、4回フローを実行。
以下は、Gmail の受信画面（上から最新）

![実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349908/c1cf5ca9-9939-8020-d773-c4a0fd86da0a.png)

ID:3 の次は、ID:1 を取得することができた。

## おわりに

これ以上アクションが増えたら管理が大変そうだなぁと思いました。
慣れれば、これくらいはふつうの量なのでしょうか。