【Power Automate Desktop】大規模フローを楽にする変数管理テクニック
はじめに
Power Automate Desktopではすべての変数がグローバルに扱われるため、フローが大規模になるほど
- 「この変数はどこで使ってるの?」
- 「同じような変数が増えすぎて管理できない!」
と悩む方も多いのではないでしょうか。
ネット上では変数管理について詳しく書かれた記事が少ないため、私が実際に活用している方法を共有します。
本記事では、変数が増えすぎて困っているユーザーに向けて、JSON を使った効果的な変数管理方法を紹介します。
この方法を使うことで、フローの可読性・拡張性が向上し、デバッグや保守が楽になります。
記事の流れ
以下の順で記載していきます。
- 管理方法とユースケースの紹介
- アクションの設定方法
- 考案に至った経緯(何を課題と感じていたのか)
管理方法とユースケース
案1 JSON 形式で変数を論理グループ化する
変数をあらかじめ JSON 形式のオブジェクトとして定義し、性質や役割ごとに論理的にグループ化する方法です。
この方法を使うと以下のようなメリットがあります。
- 関連する変数を一括管理できる
- 変数の用途が明確になる
- 変数の追加・削除が簡単で、フローの拡張や変更にも強くなる
JSON そのものについては、こちらの記事を参照ください。
JSON による変数グループ化の具体例を紹介していきます。
ユースケースA ユーザー指定の定数を明示的にする
ユーザーが事前に手入力すべき定数的な変数、フロー中に動的に変わる変数、両者を区別するのに使えます。
例えば、他者にフローを共有する際に「変数 UserInfo
の中身だけを書き換えて」と伝えるだけで済みます。
{
"User": {
"Name": "山田", // 苗字のみを記入 この様にコメントも埋め込めます
"ID": "12345" // 社員番号下5桁を記入
},
"PC": {
"DataSaveDirectory": "C:/Users/username/Documents/projectX",
"ID": "67890"
}
}
ユースケースB 関連性のある変数を一覧で確認しやくする
シェアポイントから特定のファイルを検索・ダウンロードする場合を考えてみます。
- FolderA の中身一覧を取得
- 対象のフォルダを検索(FolderB)
- FolderB の中身一覧を取得
- 対象のファイルを検索(FileX)
- FileX をダウンロード
といったフローになることが多いかと思います。
ファイルがダウンロード出来なかった場合、どこのアクションが想定外の挙動になっているでしょうか?
上記アクションに関連する変数だけなら、原因を特定するのは容易です。
しかし実際には、無関係なアクションの変数も一覧に表示されるため、原因の特定に手間がかかります。
そこで、以下の様に JSON で各アクションの結果を集約します。
{
"Site": {
"Path": "https://domain.sharepoint.com/sites/sitename",
},
"RootFolder": {
"Path": "/Doclib1/projectX/data",
"ID": "xxxxxxxxx",
"Items": ""
},
"ChildFolder": {
"Path": "",
"ID": "",
"Items": ""
},
"TargetFile": {
"Path": "",
"ID": ""
}
}
フロー実行後に SharePointDownload
をフロー変数一覧から開くと以下の様に表示されます。
ChildFolder
の Items
が空になっているので、この段階でデータが上手く取得できていないと簡単に判断できます。
ユースケースC 機能拡張に伴い変数を追加する
事前に定数として設定する変数 mail
を追加したい場合、通常の変数の設定
アクションを用いる方法だと、アクション数とフロー変数が増加します。
JSON にしておけば、新しい変数を追加する際、1行追記するだけで済むため管理が容易になります。
{
"User": {
"Name": "山田",
"ID": "12345",
"mail": "address" //ここを追加
},
"PC": {
"DataSaveDirectory": "C:/Users/username/Documents/projectX",
"ID": "67890"
}
}
案2 一時的な変数は「Tmp」命名を連続アクション限定で使用する
一時的な変数(例えば直後のアクションだけで使う中間結果など)は、変数名を一律「Tmp」にすると、フロー変数が無駄に増えるのを防げます。
ユースケースA 一時的な計算や中間結果を扱う場合
たとえば、「ユーザーのメールアドレスから @
の前の文字列を取り出して、さらに _
を削除する」というフローを考えてみます。
通常、以下のようなフローを作ることが多いでしょう。
この例では、変数 CroppedText
は直後のアクション(テキストの置換
)でしか使われていません。
しかし、こうした一度しか使わない変数がフローの中に残ってしまうと、どれが本当に必要な変数なのか分かりにくくなり、管理を煩雑にします。
そこで、「Tmp」を活用した方法を使って以下のようにスッキリさせます。
CroppedText
のような「中間結果の一時変数」を Tmp という名前に統一し、最後に必要な値だけを意味のある名前に格納することで、フローが見やすくなり、変数の数も減ります。
もしデバッグのために途中経過(テキストのトリミング
の結果)を確認したい場合は、以下のように工夫します。
アクションの設定方法
案1 JSON形式で変数を論理グループ化する
JSON形式で定義した変数は、そのままフロー内で利用できません。そのため、以下のように設定します。
-
変数の設定
アクションで JSON を記述 - その後、
JSON をカスタムオブジェクトに変換
アクションでオブジェクト化する
{
"User": {
"Name": "山田", // 苗字のみを記入 この様にコメントも埋め込めます
"ID": "12345" // 社員番号下5桁を記入
},
"PC": {
"DataSaveDirectory": "C:/Users/username/Documents/projectX",
"ID": "67890"
}
}
JSON の書き方については、こちらの記事を参照ください。
変数へのアクセス方法は %UserInfo.User.Name%
もしくは %UserInfo['User']['Name']%
です。
外部エディタを用いた置換方法
- フロー全体を選択し、コピーする
- VSCodeやメモ帳に貼り付ける
- 置換処理を行う
- 編集後、再びフローに貼り付ける
以下の画像では、12 行目の変数の設定
アクションでの %UserInfo.UserName%
を %UserInfo.ID%
に置換処理しています。
案2 一時的な変数は「Tmp」命名を連続アクション限定で使用する
あるアクションの結果を直後のアクションだけで使い、その後は使わない変数の場合、変数名を Tmp
に統一すると変数の数を削減できます。
- アクションの出力変数の名前を Tmp に変更します。
- Tmp を使って何らかの処理をした後、その結果を再び Tmp に代入することも可能です。
考案に至った経緯
直面した課題
Power Automate Desktop ではすべての変数がグローバル変数として扱われるため、フローの規模が大きくなるほど変数の管理が難しくなります。
例えば、約400アクションを含むフローを開発する中で、以下のような問題に直面しました。
-
デバッグ時に変数の確認が煩雑
- 変数が増えるほど、どの変数がどの用途で使われているのか把握しづらくなる。
-
機能拡張時に変数の整理が困難
- 既存の変数が無秩序に増えていくため、拡張時の影響範囲が分かりにくくなる。
-
不要な変数の管理が面倒
- 一時的な変数や一度しか使わない変数も、グローバルな変数一覧に表示されてしまう。
そもそも、グローバル変数とは何?、という方は下記本の「グローバル変数(Global variable)とローカル変数(Local variable)」を参照ください。
通常のプログラミングではどうするか?
一般的なプログラミング言語では、変数の管理をしやすくするために、以下のような方法が取られます。
※筆者が慣れている C# という言語を例にしています。
public struct User
{
public string Name { get; set; }
public int ID { get; set; }
public User(string name, int id)
{
Name = name;
ID = id;
}
}
このように、関連する変数を構造体でまとめることで、管理しやすくなります。
また、関数ごとにローカル変数を定義できるため、一時的な値を不要にグローバル化する必要がありません。
しかし、Power Automate Desktop にはスコープの概念がなく、すべての変数がグローバルとして扱われます。
このため、次のような対策を検討しました。
採用した対策
JSON を活用する
理由:
- 変数を論理的にグループ化し、管理しやすくする。
- 不要な変数を減らし、1つの JSON オブジェクトに統合できる。
- 将来的な機能拡張にも柔軟に対応可能。
他の選択肢(DataTableなど)と比較
手法 | メリット | デメリット |
---|---|---|
JSON | 構造化しやすく、汎用的 | 直接フローで使えず変換が必要 |
DataTable | フロー内で使いやすい | ネスト構造が作れず、用途が限定的 |
そのまま変数を定義 | シンプルでわかりやすい | 変数が増えすぎて管理が困難 |
一時的な変数を減らす(Tmp 変数の導入)
一度しか使わない変数は、その都度新しく作成するのではなく共通の「Tmp」変数を活用する方針を取りました。
一般的なプログラミング言語では、一時変数のスコープは関数やブロック内に限定されます。
例えば以下の C# コードでは、TrimmingNameFromMail()
の変数 tempResult
は関数の実行中のみ有効です。
public string TrimmingNameFromMail(string mail){
string tempResult = mail.Split('@')[0]; // メールアドレスから名前部分を抽出
return tempResult;
}
しかし、Power Automate Desktop では一時変数もグローバルに表示されるため、数が増えすぎてしまいます。
そこで考えたのが「Tmp」命名ルールです。
- あるアクションの出力を、直後のアクションでのみ使用する場合
- 固定の変数 Tmp に格納し、一時的な利用のみ許可する
- Tmp を使い回し、不必要な変数の増加を防ぐ
この運用により、変数の数を減らし、可読性を向上させることができました。
おわりに
Power Automate Desktop では、すべての変数がグローバルであるという制約のため、通常のプログラミングと同じ変数管理は通用しません。
そのため、以下の2つの手法を採用しました。
- JSON を使って論理的に変数を整理
- Tmp 変数を活用し、一時的な変数の増加を抑える
この2つの方法を組み合わせることで、Power Automate Desktop の変数管理を劇的に改善できます。
Discussion