広告

Power Automate Desktop:サブフローに引数を指定する方法について確認してみた

Power Automate Desktop

Power Automate Desktop(PAD)でサブフローに引数を指定する方法について確認してみました。

このコンテンツはプログラミングやローコード開発の経験がある方向けの内容となっていますので、もしこれからPower Automate Desktopでの自動化にチャレンジしてみたい、という方は「はじめてのPower Automate Desktop – 使い方・解説記事まとめ」をご覧になってみてください。

PADでの「サブフロー」とRobin言語の「関数」

Power Automate Desktop(PAD)では、アクションのブロックを「サブフロー」として分類管理ができるようになっています。

Power Automate Desktopの編集画面の上にはタブで構成されたエリアがあり、ここにメインとなるフローとなるほか、複数のサブフローがタブで表示されます。

これはいわゆる一般的なプログラムの「関数」のようなものなのですが、実際には関数のように引数や戻り値などを設定することができません。

Robin言語の「関数」

Power Automate Desktop(PAD)は内部言語にRobin LanguageというPRA向けのスクリプト言語が使われているのですが、このRobinにはFUNCTION構文により関数の定義、CALL文による関数の呼び出しが行えます。

Power Automate Desktopでは、ひとつひとつのサブフローが内部的にはFUNCTION構文で構成された関数となっているのではないかと想定されます。

イメージとしては下記のようなものとなります。

FUNCTION Subflow_1
    # サブフロー1
END

FUNCTION Subflow_2
    # サブフロー2
END

ただ、Power Automate Desktopの編集画面ではサブフロー全体をコピーしても、FUNCTION ~ ENDより内側のコードしか取り出すことができません

そのためFUNCTION構文を含めた関数全体のソースコードがどうなっているのかを現状は確認することができません。

Power Automate Desktopでの変数スコープ

サブフローは関数のようなもの、と書きましたが実際に動作させてみると、Power Automate Desktop環境ではサブフローの動作はちょっと独特なものになっています。

サブフローに配置した「変数の設定」アクションのソースコードは以下のようになっています。

SET NewVar TO $'''hoge'''

これは本来「ローカル変数の宣言」なのですが、Power Automate Desktopではサブフローに配置した変数がローカル変数の宣言であるにもかかわらず、グローバル変数のようにメインフローや他のサブフローからも参照できてしまいます。

また、Power Automate Desktopのサブフローは引数や戻り値を取ることがないため、厳密には関数と同じように動作させることができません。

この辺りは筆者も厳密な仕様がよくわかっていないため、実際の挙動を参考に調べてみました。

Power Automate Desktopでの変数をグローバルっぽくする挙動の正体

恐らくですが、サブフローのための関数は以下のような内部構造になっており、関数内で作った変数をすべて戻り値として返し、変数を共通化しているのではないかと思われます。

# 変数を作る
set 変数A to 値A
set 変数B to 値B

# サブフローはすべての変数を受け取り、サブフロー内で作った変数もすべて返すようにする
FUNCTION Subflow_1 変数A, 変数B OUTPUT 変数A, OUTPUT 変数B, OUTPUT 変数C
    # 関数内で値を書き換える
    set 変数A to 値X

    # 関数内で新たな変数を作る
    set 変数C to 値C
    
    ...
END

# サブフローを呼ぶときにすべての変数を渡して、サブフロー内の変数も受け取る
CALL Subflow_1 変数A:変数A 変数B:変数B 変数C=>変数C

このサブフローの呼び出しやメインフローの内部構造については明らかになっていないため、あくまで想像ですが、変数のスコープなどを意識せずプログラム初心者でも扱いやすくするために、Power Automate Desktopでは関数のやり取りなどを直接編集できないようにして内部コントロールしているのではないかと思われます。

このような理由のため、Power Automate Desktopのサブフローで引数や戻り値を使うことはできないようです。

Power Automate Desktopでは「関数(引数に対して対応する値)」ではなく「サブフロー」と呼んでいるのもこのあたりの機能の違いから来ているのでしょうね。

Power Automate Desktopに限った話として、基本的にすべての変数はグローバル参照と考えておけば事故はないと思いますが、、、もし情報がございましたら是非教えてください

コメント

タイトルとURLをコピーしました