【Power Automate】ループ内で変数の値を変える方法とか重複判定とか

Power Automateビギナーのぽんぞうです。こんにちは。

この記事を書いている時点では、一通りPower Automateで自動化したいことはやりきれましたが。

フローの作成中につまずいたり、悩んだ事がまだいくつかあるので。

備忘録を書いていこうと思います。

今回は、Power Automateの「変数」の扱い方についてです。

ループ内で変数の値を変更しようとして、かなり手間取ったので。

ついでに、同じくループが入れ子になっている場合で、内部のループが終わった後に外部ループ内で条件を作って何かしらの動作をする時のフローの位置についても書いておきます。

「変数の設定」を使う

以前の投稿で、日付を使い回すのに「変数を初期化する」を利用しました。

これを使えばどこでも変数を使えるんだなーと、気楽に考えて。

For eachのループ内で使ってみたらエラー。

どうやら「変数を初期化する」では、ループ内で変数を設定できないようです。

少し調べてみたら、ループ内で使用するには「変数の設定」を利用するとのこと。

まずはループ外に「変数を初期化する」で変数を追加します。

そして、ループ内で変数のアクションから「変数の設定」を追加し、ループ外に作成した変数を選び。

変数に格納する値を入力すれば、動的に変数の値が変わってくれるようになります。

変数の設定

ループ外に「変数を初期化する」で設置した変数の値は空白で大丈夫です。

どちらにしろループ内で変数を変更するので、値をいれる意味もあまりないとは思います。

が、ループ内で変数の値は初期化され、指定された値に変わるので。

初期値が合っても大丈夫だとは思います(試してないのですみません)。

ただし、データ型の変更は「変数の設定」ではできず、「変数を初期化する」の内容を引き継ぐことになるので。

ループ内で変数に格納する値の型には注意した方が良いでしょう。

ループの入れ子の外側の値を変数に格納する

そもそもループ内で変数を設定したかった理由が、エクセルのセルに入力されている値とShare Pointに登録してあるデータを比較したかったからなのですが。

外側にエクセルのデータを取得するループ、内側にShare Pointのデータを取得するループとなり、外側のエクセルのデータが内側で参照されていませんでした。

エクセルのデータを選択はできるものの、保存すると参照しているのがShare Pointとなってしまい、内側のループではデータを取得できていないという状態です。

であれば、変数を使って渡すしかないよなぁ・・・と詰まったのが、変数について調べるきっかけです。

で、先程の流れ通りループの外側に「変数を初期化する」で空の変数を作り。

1つ目のループの中で「変数の設定」を置き、作った変数を選び値を設定しておきます。

ループの中と外の設定
旧デザイナーですがご了承ください。

これで、1つ目のループで取得したデータの値を変数に格納し、2つ目のループ内での比較に使えるように。

1つ目と2つ目のループに設置する内容

「変数の設定」で格納した値はループの最後の値が保持されるようなので。

使い回す場合には注意ですね。

ループの結果で条件を分岐する重複チェック

ここまでの流れは、「変数の設定」とそれを追加する位置が分かれば特に問題なく設定できると思います。

で、Power Automateを使っていて、このアクションを追加する位置が重要だなと思うわけです。

プログラムの読込順のようなものを直感的にできる分、置く場所に寄っては全く期待していない動作となる場合もあります。

・・・自分がそんな感じでした。

例えば、先程の例でエクセルのセルの値とShare Pointのデータの値が等しい場合に、何かしらの動作をして欲しいとします。

最初は内側の2つ目のループに「条件」で分岐して処理を実行すれば良いかと思ったんですがー。

そうすると、Share Pointに登録しているデータ全件に対して動作してしまい、データの追加を自動化してたんですが、全件分の不要なレコードが登録されてしまいました。

良く考えてみればそりゃそうなんですが。

なので、ここでもループの外で変数を設定し、データ型はBoolean、初期値は関数でfalseとしておきます。

これも前の記事で書きましたが、trueやfalseはただ入力するだけではなく、関数として書くようにしましょう。

真偽値の設定

で、2つ目のループで使う「条件」は「真」だったら、「変数の設定」でtrueを格納するようにし。

「偽」だったらfalseのままにするようにします。

条件での真偽値の変更

で、2つ目のループの外(つまり、1つ目のループの内側)で、「条件」で動作を設定します。

条件の設置箇所

これで、

・1つ目のループでエクセルの値を取得する
・取得したエクセルの値でShare Pointのデータの値をチェック
 →等しければ変数にtrueを格納
 →等しくなければ変数はfalseのまま
・チェックの結果がtrue
 →エクセルの値を使用してShare Pointにデータの追加
・チェックの結果がfalse
 →なにもしない
・次のエクセルの値へ

という動作に。

変数に初期値を設定して、ループ内の条件で動作を分けるという、いわゆるデータの重複チェックのような機能となりました。

いやぁ・・・結構はまりました。

変数の扱い方でできることが広がる

様々なアプリを連携することができ、データを使い回すことができる便利なPower Automateですが。

変数の使い方がキモになりそうだなと感じました。

結局はデータを使用して動作を決めるのであれば、使用するデータをどの様に扱うかが重要になるわけで。

その受け渡しができるアクションが、「変数」というある意味コアな機能なんですね。

配列の格納など他にも色々できるみたいですし、JSON形式でも格納できるみたいなので。

扱い方次第でスマートなフローなのに複雑な処理も作れそうです。