👋

【Power Automate Desktop】大規模フローを楽にする変数管理テクニック

2025/03/07に公開

はじめに

Power Automate Desktopではすべての変数がグローバルに扱われるため、フローが大規模になるほど

  • 「この変数はどこで使ってるの?」
  • 「同じような変数が増えすぎて管理できない!」

と悩む方も多いのではないでしょうか。

ネット上では変数管理について詳しく書かれた記事が少ないため、私が実際に活用している方法を共有します。

本記事では、変数が増えすぎて困っているユーザーに向けて、JSON を使った効果的な変数管理方法を紹介します。
この方法を使うことで、フローの可読性・拡張性が向上し、デバッグや保守が楽になります。

記事の流れ

以下の順で記載していきます。

  • 管理方法とユースケースの紹介
  • アクションの設定方法
  • 考案に至った経緯(何を課題と感じていたのか)

管理方法とユースケース

案1 JSON 形式で変数を論理グループ化する

変数をあらかじめ JSON 形式のオブジェクトとして定義し、性質や役割ごとに論理的にグループ化する方法です。

この方法を使うと以下のようなメリットがあります。

  • 関連する変数を一括管理できる
  • 変数の用途が明確になる
  • 変数の追加・削除が簡単で、フローの拡張や変更にも強くなる

JSON そのものについては、こちらの記事を参照ください。
https://zenn.dev/hyung8/articles/4a50af486e5a06

JSON による変数グループ化の具体例を紹介していきます。

ユースケースA ユーザー指定の定数を明示的にする

ユーザーが事前に手入力すべき定数的な変数、フロー中に動的に変わる変数、両者を区別するのに使えます。
例えば、他者にフローを共有する際に「変数 UserInfo の中身だけを書き換えて」と伝えるだけで済みます。

UserInfo
{
  "User": {
    "Name": "山田", // 苗字のみを記入  この様にコメントも埋め込めます
    "ID": "12345" // 社員番号下5桁を記入
  },
  "PC": {
    "DataSaveDirectory": "C:/Users/username/Documents/projectX",
    "ID": "67890"
  }
}

ユースケースB 関連性のある変数を一覧で確認しやくする

シェアポイントから特定のファイルを検索・ダウンロードする場合を考えてみます。

  • FolderA の中身一覧を取得
  • 対象のフォルダを検索(FolderB)
  • FolderB の中身一覧を取得
  • 対象のファイルを検索(FileX)
  • FileX をダウンロード

といったフローになることが多いかと思います。

ファイルがダウンロード出来なかった場合、どこのアクションが想定外の挙動になっているでしょうか?

上記アクションに関連する変数だけなら、原因を特定するのは容易です。
しかし実際には、無関係なアクションの変数も一覧に表示されるため、原因の特定に手間がかかります。

JSON にしていないとき

そこで、以下の様に JSON で各アクションの結果を集約します。

SharePointDownload
{
  "Site": {
    "Path": "https://domain.sharepoint.com/sites/sitename",
  },
  "RootFolder": {
    "Path": "/Doclib1/projectX/data",
    "ID": "xxxxxxxxx",
    "Items": ""
  },
  "ChildFolder": {
    "Path": "",
    "ID": "",
    "Items": ""
  },
  "TargetFile": {
    "Path": "",
    "ID": ""
  }
}

フロー実行後に SharePointDownload をフロー変数一覧から開くと以下の様に表示されます。
ChildFolderItems が空になっているので、この段階でデータが上手く取得できていないと簡単に判断できます。

JSON にしたとき
案1 JSONで変数をグループ化
案1 JSONで変数をグループ化 詳細画面

ユースケースC 機能拡張に伴い変数を追加する

事前に定数として設定する変数 mail を追加したい場合、通常の変数の設定アクションを用いる方法だと、アクション数とフロー変数が増加します。
JSON にしておけば、新しい変数を追加する際、1行追記するだけで済むため管理が容易になります。

UserInfo
{
  "User": {
    "Name": "山田",
    "ID": "12345",
    "mail": "address" //ここを追加
  },
  "PC": {
    "DataSaveDirectory": "C:/Users/username/Documents/projectX",
    "ID": "67890"
  }
}

案2 一時的な変数は「Tmp」命名を連続アクション限定で使用する

一時的な変数(例えば直後のアクションだけで使う中間結果など)は、変数名を一律「Tmp」にすると、フロー変数が無駄に増えるのを防げます。

ユースケースA 一時的な計算や中間結果を扱う場合

たとえば、「ユーザーのメールアドレスから @ の前の文字列を取り出して、さらに _ を削除する」というフローを考えてみます。

通常、以下のようなフローを作ることが多いでしょう。

Tmpを使わない場合

この例では、変数 CroppedText は直後のアクション(テキストの置換)でしか使われていません。
しかし、こうした一度しか使わない変数がフローの中に残ってしまうと、どれが本当に必要な変数なのか分かりにくくなり、管理を煩雑にします。

そこで、「Tmp」を活用した方法を使って以下のようにスッキリさせます。

Tmpを使う場合

CroppedText のような「中間結果の一時変数」を Tmp という名前に統一し、最後に必要な値だけを意味のある名前に格納することで、フローが見やすくなり、変数の数も減ります。

もしデバッグのために途中経過(テキストのトリミングの結果)を確認したい場合は、以下のように工夫します。

Tmpを使う場合 トレースを意識した場合
詳細画面

アクションの設定方法

案1 JSON形式で変数を論理グループ化する

JSON形式で定義した変数は、そのままフロー内で利用できません。そのため、以下のように設定します。

  • 変数の設定アクションで JSON を記述
  • その後、JSON をカスタムオブジェクトに変換アクションでオブジェクト化する
UserInfo
{
  "User": {
    "Name": "山田", // 苗字のみを記入  この様にコメントも埋め込めます
    "ID": "12345" // 社員番号下5桁を記入
  },
  "PC": {
    "DataSaveDirectory": "C:/Users/username/Documents/projectX",
    "ID": "67890"
  }
}

フロー全体
JSONの記述
カスタムオブジェクトへ変換

JSON の書き方については、こちらの記事を参照ください。
https://zenn.dev/hyung8/articles/4a50af486e5a06

変数へのアクセス方法は %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)」を参照ください。
https://zenn.dev/antez/books/568dd4d86562a1/viewer/04e48e

通常のプログラミングではどうするか?

一般的なプログラミング言語では、変数の管理をしやすくするために、以下のような方法が取られます。

※筆者が慣れている C# という言語を例にしています。

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 は関数の実行中のみ有効です。

C#
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