ローコード開発のリファクタリング Power Automate 編
概要
開発をした人間以外が引き継いだ際に理解しやすいようきれいに整理しておきましょうというのが目的です。
しかしながら、フローを整理しすぎて高度なことを詰め込みすぎると、引き継いだ担当者が同等の知識がないと修正ができないということになり、誰も修正できないといった状況になりかねません。フロー作成者は一人で頑張るのではなく、普段から周囲と学んだ技術を共有してフローを管理していくというのが理想です。
手法
アクションの整理
アクション名を変更する
アクション名をわかりやすいように変更します。元のアクションが何だったのかわかるように残しつつ、処理の要約を記述します。
メモを残す
[メモを追加する] 機能で、処理の詳細なコメントを残しておくことができます。
スコープを利用して処理をまとめる
関連するアクションをスコープにまとめる
関連するアクションを一つの スコープ アクション内にまとめます。スコープのアクション名もそのスコープ内でどのような処理を行っているのか処理の要約を記載しておきます。後続の例外処理を スコープ 毎で扱えるようになります。
変数の定義に [作成] アクションを使う
[変数の初期化] のアクションは、スコープ内や条件文、反復処理の中で使うことができません、そのためグループ化されているアクションの外側であらかじめ変数を用意して置かなければなりません。
データ操作 の[作成] のアクションは、どこでも呼び出すことができるのでローカル変数的につかうことができます。
型の指定がないのでなんでも入れられてしまう点に注意してください。厳密に変数の型を気にして処理を作りたい場合は、[変数の初期化] のアクションを使用してください。
条件文をネストしないようにする
スイッチ文をつかってみる
条件が複数に分岐する場合は、スイッチのアクションをつかってみましょう。
条件文でフローを終了させる
特定の条件を満たした場合に処理をするという流れではなく、条件を逆転させ条件を満たしていない場合は、後続の処理をせずにフローを終了させるというようにします。
条件分岐が多岐にわたる場合はフロー自体を分ける
条件分岐が多岐にわたり、処理の流れが複雑になってしまうのであれば、一つのフローで作ることにこだわらずに、それぞれの条件で起動する専用のフローに分けることを検討しましょう。
フローを分ける
一つのトリガーで長い処理を作らないようにトリガーを組み合わせる
一つのフローの中で、全てを解決しようとするのではなく、起動するトリガーを複数に分けることができないかを検討します。
例えば、「テーブルの値を更新したら、それをメールで通知する」というフローを、「テーブルの値を更新する」フローと「テーブルが更新されたことをトリガーにメールを送信する」フローに分けます。
反復処理
自動で Apply to each が挿入されないようにアイテムを指定する
Power Automate のアクションでは、配列で値が取得できる可能性がある場合は、たとえ配列のアイテムが1つであったとしても、ループ処理として扱うことになり、自動で Apply to each が挿入されてしまいます。配列ので一つしかアイテムを使用しないという場合には、その一つのアイテムを取り出して後続の処理を行うようにします。
条件で処理を抜けるように Do Until を利用する
Apply to each のループ処理は、指定されている配列のアイテムの個数分処理が繰り返されます。特定の条件で処理を終了したいというような場合は、Do Until を利用します。
Apply to each を使わないで配列を加工する
Select アクションを利用することで、配列を効率的に加工できます。
Select アクションの利用手順
-
入力配列の準備
- 配列データを用意します。※例として、以下のような JSON 形式の配列の場合を想定します。
[ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ]
- 配列データを用意します。※例として、以下のような JSON 形式の配列の場合を想定します。
-
Select アクションを追加
- Power Automate のフローで「Select」アクションを追加します。
-
マッピング設定
- 「Map」セクションで、出力のキーと値を定義します。
- Key:
fullName
- Value:
item()?['name']
- Key:
- これにより、元の配列から新しい配列を以下の形式で生成できます:
[ {"fullName": "Alice"}, {"fullName": "Bob"} ]
- 「Map」セクションで、出力のキーと値を定義します。
関数を使う
Power Automate のアクション内で呼び出すことのできる関数があります。数値や文字列の加工をする場合に利用します。
よく使われる関数の一例です。
文字列操作
-
concat
: 文字列を結合します。 -
substring
: 文字列の一部を取得します。 -
replace
: 文字列内の特定の部分を置き換えます。
数値操作
-
add
: 数値を加算します。 -
sub
: 数値を減算します。 -
mul
: 数値を乗算します。
日付操作
-
addDays
: 指定した日数を日付に加算します。 -
formatDateTime
: 日付を特定のフォーマットに変換します。
条件分岐
-
if
: 条件に基づいて異なる値を返します。 -
equals
: 2つの値が等しいかどうかを確認します。
配列操作:
-
union
: 2つの配列を結合し、重複を排除します。 -
intersection
: 2つの配列の共通部分を取得します。
エラーを検知しやすいようにする
Power Automate の実行履歴を見た際、エラー終了している原因を探すために内部の処理を追わなければいけないのは大変です。フローを実行した際にエラーになる可能性があることが事前にわかっている場所は、例外処理を行い、明示的に終了アクションを失敗やキャンセルとして呼び出すようにしておきます。フローの内部を追わなくても、なぜエラー終了したのかを判断しやすくなります。
データソース
SharePoint リストの内部名を分かりやすくする
SharePoint リストをデータソースとして扱う際に、列名を日本語で作成してしまうとエンコードされた表示になってしまうため、どの列を使ったらよいのかわかりにくくなります。リストに列を追加する際は、まず英語で列を作成し内部名が確定した後に、日本語にリネームして表示名を変更します。
ソリューションを活用する
ソリューションを活用すると、フローは Dataverse で管理されるようになり、より汎用性のあるフローを構築できるようになります。
環境変数を利用する
別の環境にインポートした際に、中の処理を編集しなくても環境変数の値を変更すれば、インポートした環境にあった処理ができるように作ることができます。
子フローを利用して共通処理を抜き出す
ソリューション内にフローを配置すると、フローの中で別のフローを子フローとしてよびだすことができるようになります。
フローの中で同じような処理を複数呼び出すような作りの場合、その処理を子フローとして抜き出します。子フロー化することにより、その処理だけをテストできるようになるため、複雑な条件を満たさなくてもその部分の単体テストができるようになります。
データの受け渡しに JSON を利用する
子フローでデータを受け渡しする際に、トリガーでパラメーターを追加することもできますが、JSON 文字列でデータを受け渡すようにしておくと、パラメーターの増減の部分を修正しなくても、受け渡すデータの中身を変更することが容易になります。