rksoftware

Visual Studio とか C# とかが好きです

Power Automate を始める際に最初に学ぶ 10 のこと

■ 最初に学ぶこと

どんなものを学習するにしても、最初に知っておくことは多数あります。Power Automate でもそれは変わりません。Power Automate は既に普通に使われていますが、これから始める方に向けた情報についてはしかし、まだまだこれからのプロダクトだと思います。

知らずに始めると大変なことになることを知らずに始めてしまう方も少なくないと思います。私はそうでした。そこで私が最初に知ってきたかった基本的なことをまとめてみます。

■ 目次

  1. エラー処理
  2. ノーコード・ローコードではない。大量のコードが必要
  3. 変数を使う必要はない。イミュータブルでできる
  4. 複数の定数の宣言
  5. スコープを絞れない
  6. ソリューションは必須
  7. 式をコピペする
  8. 条件の書き方
  9. null との永遠の戦い
  10. データ操作を全て確認しておく

■ エラー処理

IT の世界でまず真っ先に学ぶことは何でしょう? そう、エラー処理 ( 例外処理 ) です!
それは Power Automate の世界でも同じです。

エラー処理 ( 例外処理 ) とは?

IT の世界では何らかの業務処理は必ず失敗をする可能性があります。その際にコンピュータは個人の労力の持ち出しで良い感じに辻褄を合わせたりはしません。失敗したときにどうするかを必ず決めておかなければなりません。必ずです。

必ずです。

必ずです。これを設計しないことはあり得ません。Power Automate でも同じです。

良くあるコードでは

多くのプログラミング環境で、例外という機能があります。try catch finally という言い方をすれば多くのプログラミング言語話者に通じると思います。

Power Automate では

スコープ というアクションと 実行条件の構成 を使います。

  1. エラーを検知したい処理を スコープ の中に作る
  2. エラーになった場合の処理を スコープ の次に置く
  3. エラーになった場合の処理の 実行条件の構成 を設定する
  4. エラー時の動作を設定する ( ここではエラー発生をメールで通知しています )

こんな感じです。

{
 "result": "@{result('スコープ')}",
 "フローの名前": "@{workflow()?['tags/flowDisplayName']}",
 "フローの詳細画面の URL": "https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/details",
 "フローの実行履歴詳細の URL": "https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run/name']}"
}

この通知内容で、どのフローでエラーが起きたのか、そしてフローの詳細画面や実行履歴詳細への URL を通知できます。テンプレートとしてコピペしてしまってください。基本中の基本です。

■ ノーコード・ローコードではない。大量のコードが必要

Power Automate では に大量のコードを書くことになります。
例えばある文字列の配列のそれぞれの要素に対して、その値が pre_{4 桁の連番} というデータだった場合に連番を一つ増やした値に置き換えるということを考えてみます。

投入データと結果

こんな感じでやってみます。
投入データ ["pre_0002", "no"] → 出力データ ["pre_0003", "no"]

C# の場合

私が得意なので C# で書いてみます。こんな感じですね。とてもシンプルで分かりやすく書けています。

const string pre = "pre_";  new[] { "pre_0002", "no" }.Select(s => (s.StartsWith(pre) && int.TryParse(s.Substring(pre.Length), out var i)) ? $"{pre}{i + 1:0000}" : s);

Power Automate の式の場合

正直厳しいと言わざるを得ません。

if(and(startsWith(item(), 'pre_'), isInt(slice(item(), min(length(item()), length('pre_'))))), concat('pre_', slice(concat('000', add(int(slice(item(), min(length(item()), length('pre_')))), 1)), sub(length(string(int(slice(item(), min(length(item()), length('pre_')))))), 1))), item())


コードの横スクロールバーの長さの違いだけでもかなりの差が出ています。

つまり

Power Automate では、プロ開発に比べてかなり難しいコードを、プロ開発よりはるかに多いコード量書かなければなりません。最初から大量の難しいコードを書く前提で挑む必要があります。

■ 変数を使う必要はない。イミュータブルでできる

Power Automate には 作成 というイミュータブル値を作るアクションがあります。
名前が分かりづらいので、「イミュータブル」とかに名前を変更して欲しいと常々思っています。

できるだけイミュータブルにすべきという話

値はできるだけイミュータブル ( 変更不可能な ) にすべきというのは現代の共通認識です。変更可能な値 ( 変数 ) は意図せぬ変更がされるコードは含まれてしまう可能性がありバグの元です。それは当然 Power Automate でも同じです。基本中の基本です。

■ 複数の定数の宣言

複数の定数を宣言する場合、作成 を複数使うのではなく、JSON の解析 を使います。
これにより、

  • アクションの箱が少なくなってフロー見通しが良くなる
  • アクションの数が少なくなってアクション要求数が減り実行にかかるお金も節約できる

という大きな効果があります。

フローの見通しの差

作成 では値の数だけアクションの箱を並べることになります。しかし JSON の解析 ならアクションの箱は 1 つだけで済みます。


この例では定数は 2 つだけですが、定数を 10 つ 20 つと増えたときの前者の絶望感は想像は難しくないと思います。

作成 の場合

JSON の解析 の場合

■ スコープを絞れない

Power Automate の変数等はスコープを絞れません。一つのフローの中で常トップレベルです。また、変数はトップレベルの階層にしか置けません。

スコープを絞れない

一つのフローの中である限り回避方法はありません。あきらめましょう。

トップレベルにしか置けない

作成 はトップレベルでないところにも置けるので、できるだけ 変数 ではなく、作成 を使うことで制約を避けられます。

常にグローバル

別のスコープであっても同じ名前の 作成 は作れません。

深い階層で作られた値をどの階層でも使えます。

■ ソリューションは必須

ソリューションを使うことで、親子フローを作ることができます。
親フローから子フローを呼び出して、子フローの処理が終わったら親フローに戻ってきます。この機能を使うことで変数のスコープを疑似的に絞ることができます。

例えばこんなフロー

繰り返しの処理の中で作られた値を配列にしたい場合です。繰り返しの外、トップレベルで 変数 を宣言しなければなりません。ただ、繰り返しの処理結果を格納したいだけなのに。

※ この例であれば 選択 アクションでも事足りますがあくまで例なので、選択 ではすまない処理があると思ってください。

親子フローを使えば

親子フローを使えば、変数 の生存範囲を子フローの中に絞ることができます。

コンカレンシー制御にも

この 変数 制約の回避や、子フローの再利用性によって Power Automate で並列実行処理を使えるようになります。 コンカレンシー制御 という機能もこの 変数 の制約回避によって活かせるようになってきます。
コンカレンシー制御 の他にも並列実行の技術はありますが、その際も子フローの再利用性が効いてきます。

■ 式をコピペする

式を直接書くことは実は多くありません。大体コピペします。しかし単純ではありません。

まず狭い

まず式の入力欄はとても狭いです。例えば前述の簡単な処理の式など。ここでコーディングすることは正直厳しいと言わざるを得ません。

if(and(startsWith(item(), 'pre_'), isInt(slice(item(), min(length(item()), length('pre_'))))), concat('pre_', slice(concat('000', add(int(slice(item(), min(length(item()), length('pre_')))), 1)), sub(length(string(int(slice(item(), min(length(item()), length('pre_')))))), 1))), item())

文字列を構成するときなども

文字列の中に式を書く場合も。

テキストエディタなどで書いて

Power Automate の編集の GUI 内でコピペできることはなんとなく触ればわかるかもしれません。しかしそれだけではすまないのが現実です。いくつかの定型式を用意しておいて適宜使ったり、Visual Studio Code やメモ帳などでコーディングした式を貼り付けたり。
実は GUI でコピーした式をテキストとして Visual Studio Code やメモ帳などに貼り付けできます。その際の形式が次のようなテキストです。

@{utcNow()}

@{} の間に式が書かれています。そして、この形式のテキストをペーストすれば前述の画像のような GUI で設定したものと同じように張り付きます。

この Visual Studio Code やメモ帳で @{} の間に式を書いて、コピーしてペースト。これがなければまともに式は取り扱えません。覚えておきましょう。基本中の基本です。

■ 条件の書き方

条件 は Power Automate でフローを作る際、ほぼ必須のアクションですがその扱いは非常に難しいと言わざるを得ません。

条件の設定の見た目


これを見て騎乗デバッグできる方もいないことはないと思いますが、相当のセンスをお持ちだと思います。少なくとも私には厳しいと言わざるを得ません。さらに 条件 では コードのプレビュー もできないのがまたつらいところです。

true 次の値に等しい

そんな時は、条件の設定の左辺に true、真ん中の比較の選択肢を 次の値に等しい に設定します。そして and 関数や or 関数を使って一つの式で全部の条件を書きます。

or(
  and(
    equals(outputs('作成')?[0], 1),
    greater(outputs('作成')?[1], 3)
  ),
  and(
    not(equals(outputs('作成')?[0], 1)),
    less(outputs('作成')?[1], 0)
  )
)


式を見る際に ( コピペで Visual Studio Code やメモ帳に貼り付ける必要はあるでしょうが ) 非常に把握しやすくなります。

■ null との永遠の戦い

Power Automate はとにかく null でエラーになります。Power Automate による実装作業は null との闘いの作業と言っても過言ではありません。

関数の引数に null を渡すとまずエラーになる

関数の引数として null を受け取るとエラーになる関数が非常に多くあります。まずエラーになるという覚悟でいた方が良いでしょう。例えば文字列の長さを調べられる length 関数も。0 を返してくれてもいいじゃない、と思うのですがそうはいきません。無慈悲にエラーです。慈悲はない。

こんなフローが

エラーになります。

文字列が数値に見えるかの関数

文字列が数値に見えるかの関数も無慈悲にエラーです。慈悲はない。false 返してくれたらうれしいのに。

じゃあどうするのか

equals 関数で null かどうかを評価し if 関数で分岐します。これを至る所で書くのが Power Automate の流儀です。慈悲はない。

@{if(equals(outputs('作成')?[1], null), false, isInt(outputs('作成')?[1]))}

こんな感じです。一つフローを作るのに何回、何十回と書くことになります。定型として覚えてしまいましょう。

■ データ操作を全て確認しておく

Power Automate は式を大量に書くのが特徴であることは前述しました。しかしお世辞にも関数の品ぞろえが良いとは言えないのもまた大きな特徴です。正直厳しいと言わざるを得ません。

しかし関数は把握しやすい

しかし関数がどんなものがあるのか把握しやすいのも Power Automate の特徴です。次のような感じで GUI で簡単にどんな関数があるか一覧できます。一覧の長さも非常に短いのでそれもまた把握しやすい要因です。

でも足りない

でも足りないというのが正直なところです。正直足りないと言わざるを得ないこともまた特徴です。
そんな時にもしかしたら助かるかもしれないのが データ操作 というカテゴリのアクションです。これでも十分というにはほど遠いのが正直なところですが、関数では力不足なちょっとしたことができたりします。

今日日、一般的なプログラミング言語では filtermap などが存在しないことなど考えられないと思います。C# でいえば WhereSelect です。これらは当然 Power Automate にもあります。しかし関数ではなくアクションとして存在しているので気が付くのに時間がかかってしまうのが厄介なところです。Power Automate では filterアレイのフィルター処理map選択 というアクションになっています。

このように基本的な機能が データ操作 に存在しています。まず真っ先にここにどのような機能があるのか確認しておきましょう。

■ まとめ

Power Automate の最初の一歩で読む情報たちになかなか無いものの最初に知っておかないと非常に厳しいと言わざるを得ない、10 つの要素をまとめてみました。これで Power Automate を使ってすぐに世界に価値を提供できるようになる人が少しでも増えたらと思います。

この 10 のまとめ、いかがでしたか? 皆さんの思う、最初に知っておくべきこともぜひ教えてください。