rksoftware

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

Power Automate の作成の参照のルール

Power Automate で作成の出力を別の作成の入力に使いたい。それも後方に出てくる作成の出力を! そう考えたことはありませんか? ありますよね? 私は考えました。

結論としてはダメでした。無念。

■ なぜそんなことを考えるのか

Power Automate では変数はトップレベルに宣言しなければなりません。これが非常に扱いづらい。なるべく変数のスコープは絞るようにしなければ激しいツラミとの闘いを避けられません。

そんなツラミに「作成」アクションが使える場合があります。 rksoftware.hatenablog.com

で、この「作成」アクションを活用してどうにかループカウンター的なものをどうにかループの中に閉じ込められないか。そう考えるのは当然の結果です。普通に使ってはできないのでしょうが、後方で宣言したものを参照できれば頑張って知恵を絞って抜け穴のような仕様を突けばできるかも、そう思ったのは自然な流れだと思います。

まあ、できなかったのですけれど。

■ GUI で設定を試みる

まずは GUI で設定を試みるとどうなるか。
一度こんな感じで順番に組んでみて、ドラッグで 作成 2 を上に移動してみます。

怒られました。

■ 式で設定を試みる

GUI などという甘えた操作に頼っているからダメなのかもしれません。
やはり式で設定! 式で設定はすべてを解決してくれるはず!

コードではこうなります。

だめでした。

The template validation failed: 'The inputs of template action '作成_2' at line '1 and column '1006' cannot reference action '作成'. Action '作成' must either be in 'runAfter' path or within a scope action on the 'runAfter' path of action '作成_2', or be a Trigger.'.

結論。ダメです。

■ なぜ可能性を感じたか?

普通に考えて、ダメだというのは当然の結果です。それでも可能性を感じてしまったことには理由があります。

変数の仕様です。

変数は順序の逆転自在です。こんなフローが 保存 できます。

後方の変数 aaa を前方の bbb の初期化で参照できています。
これができるなら作成でも、そう考えるのは当然の結果です。

まあ、この変数の場合もダメなのですけれども。

実行

実行してみます。

エラーになってしまいました。無念。

■ 難しいですね

難しいですね。

Power Automate で JSON 文字列と認識されるパターン

Power Automate の文字列の値には特別な扱いがされるパターンがあります。それはなんでしょう?

そう JSON 文字列です。

今回はそこをちゃんと理解してみたいと思います。

■ JSON になるパターン

試してみて文字列が JSON として扱われるパターンは次の二つです。

  • { で始まり、ホワイトスペースでない文字 1 文字以上が挟まり } で終わる。ホワイトスペースでない文字が入っていればホワイトスペースも入っていても JSON。

  • { で始まり、前方の処理の出力が続く。

類似のいくつかのパターンもあるでしょうが、概ねこれらのパターンを覚えておけば突然のエラーでびっくりすることはないでしょう。

逆に JSON にならないパターン

  • { で始まり、ホワイトスペースでない文字が挟まらずに } で終わる。

  • 前方の処理の出力に続けて } で終わる。

■ JSON になるかどうかがなぜそんなに気になるの?

JSON とは JavaScript Object Notation (通称 ジェイソン) で、JavaScript のオブジェクトを文字列で表記するものです。そう、文字列なのです。
ということは、文字列を値として使いたいときは一部の文字をエスケープしなければなりません。そこらへんがどうなるのか気になるのは当然の結果です。

■ " は JSON ではエスケープされます

" という文字は JSON で値にする場合エスケープしなければなりません。そのあたりどうなるのでしょう?

まずは普通に文字列として使ってみます。" が含まれる出力を 作成 で作り 作成 2 で使ってみます。

はい。" がエスケープされずに普通に出てきました。そうですよね。こうでなければ困ります。

コード

この時のコードを確認してみましょう。Power Automate ではアクションがどんなコードになっているのか把握するのは必須です。これを把握しておかないと全く使いこなせません。
入力に文字列のが設定されその中に 作成 の出力の式が入っています。まあこうなりますよね。

{
    "inputs": "_\"@{outputs('作成')}\"_"
}

■ JSON だとどうなるでしょう?

では JSON だとどうなるでしょう?

こんな感じに組んで

エスケープされました。うれしい!

{
  "a": "a\"b"
}

コード

コードを確認してみます。
値が文字列でなく JSON になっています! なるほどフローの編集で JSON として認識されているとこういうコードになるんですね。納得。

{
    "inputs": {
        "a": "@{outputs('作成')}"
    }
}

■ 簡単ですね

Power Automate の JSON、完全に理解しました。

Power Automate でコレクション (配列) の一つ目だけ取得する

Power Automate で配列の 1 番最初の要素だけ使いたいこと、あると思います。
一回しか実行されない Apply to each アクションもいいですが、first 関数もなかなか良いものです。

■ 実例

例えば次のような配列データを JSON 文字列で作るとします。

[
  { "a": "12" },
  { "a": "13" }
]

この一つ目の要素の値だけ使いたい場合こんな式を書きます。

first(outputs('作成'))?['a']

ステップの枠に直接書く場合はこんな感じ。

@{first(outputs('作成'))?['a']}

画像で見るとこんな感じです。

実行結果

こんな感じで一つ目の要素の値だけとれます。

■ 簡単ですね

簡単ですね。

Power Automate で実行時エラーの内容を取得する

Power Automate の実行時エラーを記録したいこと、あると思います。
これを使えば、実行時エラー発生時にエラーの内容を含めたメールを管理者に送信するといったこともできそうです。

■ result 関数

result 関数のドキュメントは次にありました。
docs.microsoft.com
使い方

result('失敗するかもしれないスコープの名前')

■ 実例

こんな感じに設定します。


「作成 2」に失敗する式を書いて、エラー時に result 関数を実行するステップが動くように設定しています。

■ 実例の実行結果

実行するとこんな感じ。

■ メッセージだけ取り出すなら

こんな感じで書きます

result('スコープ')?[0]?['error/message']

ステップの枠の中に直接書くならこんな感じ。

@{result('スコープ')?[0]?['error/message']}

画像で見るとこんな感じ。

■ 余談ですが

実行時エラーが発生したときの確認、面倒ですよね。敢えて意図して実行時エラーを起こすのはなかなか手間です。きっといろいろな方法があるのだと覆いますが今回やったのは次の式を設定する方法です。

mod(1, 0)

ゼロ除算のエラーになってくれます。書くのも簡単だし短いし手っ取り早そうな気がします。
※もしもっと短くて覚えやすい方法あったら教えてください!

■ 簡単ですね

簡単ですね。

■ 関連記事

rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com

Power Automate のワークフロー関数の Workflow 関数を確認する (2)

この記事は次の記事の続きです。
rksoftware.hatenablog.com

■ フロー自体の情報を取得したい

Power Automate のフローの実行 ID や名前を記録したいこと、あると思います。そんな時は次の記事が役に立つかもしれません。
rksoftware.hatenablog.com rksoftware.hatenablog.com

これらの記事で使っている関数の Workflow 関数の公式説明は次にありました。しかし実際に何が取得できるのかあまりドキュメントに記載がありません。そこで実際に動かして確認して行こうと思います。
docs.microsoft.com

■ 取得できる情報

動的なコンテンツの追加の式 ステップに直接書くとき 何が取得できるか
workflow()?['id'] @{workflow()?['id']} おそらくフローの物理的な ID。フローにかかわる URL などは name が使われているので今のことろ使う機会がなさそう
workflow()?['name'] @{workflow()?['name']} おそらくフローの物理的な ID。フローの詳細/編集/実行履歴の URL で使われている。これらの URL を算出するのに使える
workflow()?['type'] @{workflow()?['type']} おそらくフローがどのサービス内に作られているかで変わるのだと思うが、今のところは使う機会がなさそう
workflow()?['location'] @{workflow()?['location']} フローがどのリージョンで作られているかだと思う。今のところ使う機会はなさそう
workflow()?['tags/flowDisplayName'] @{workflow()?['tags/flowDisplayName']} フローの表示名。フローの一覧で見えている名前
workflow()?['tags/environmentName'] @{workflow()?['tags/environmentName']} フローが作られている環境の環境の ID。フローの詳細/編集/実行履歴の URL で使われている。これらの URL を算出するのに使える
workflow()?['tags/logicAppName'] @{workflow()?['tags/logicAppName']} name と同じ値が入っている
workflow()?['tags/environmentFlowSuspensionReason'] @{workflow()?['tags/environmentFlowSuspensionReason']} DLP の制限などに引っかかってフローが停止した理由が入りそう。単純なエラーでも入るのかな? でもこの関数が動いているということはまだ停止していないわけで。フローの中でフローの実行履歴を取得する方法があれば使えそうですが......
workflow()?['run/id'] @{workflow()?['run/id']} フローの物理的な ID と実行 ID を組み合わせたもの。フローにかかわる URL などは name が使われているので今のことろ使う機会がなさそう
workflow()?['run/name'] @{workflow()?['run/name']} フローの実行 ID。実行履歴のどの実行かがわかる。実行履歴詳細の URL で使われている。履歴表示の URL を算出するのに使える
workflow()?['run/type'] @{workflow()?['run/type']} typerun を足したもの? 今のことろは使う機会がなさそう

■ 活用実例

この関数で取得できる情報を組み合わせて Power Automate のフローの詳細/編集/実行履歴の各種ページの URL を作ることができます。

フローの詳細ページを開く 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']}

フローの実行履歴一覧ページを開く URL

https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs

フローの実行履歴詳細ページを開く URL

https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run/name']}

■ 難しいですね

難しいですね。

■ 関連記事

rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com

Power Automate のワークフロー関数の Workflow 関数を確認する (1)

この記事には後続の記事もあります。
rksoftware.hatenablog.com

■ この記事で扱うこと

Power Automate のフローの実行 ID や名前を記録したいこと、あると思います。そんな時は次の記事が役に立つかもしれません。
rksoftware.hatenablog.com rksoftware.hatenablog.com

これらの記事で使っている関数の Workflow 関数の公式説明は次にありました。
docs.microsoft.com

■ 関数で取得

で、具体的にこの関数で何が取得できるのかという話ですが、ドキュメントにあまり記載がありません。プログラマー的にちょっと困るので、実際に動かして確認してみました。
まずはドキュメントからでも十分に読み取れますが、実際に取得できる JSON を取得してきました。

{
  "id": "/workflows/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "name": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "type": "Microsoft.Logic/workflows",
  "location": "japaneast",
  "tags": {
    "flowDisplayName": "ああああああああああああああああああ",
    "environmentName": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "logicAppName": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "environmentFlowSuspensionReason": "XXXXXXXX:XXXXXX:XXXXXX:XXXXXX:XXXXXXXXXXXXXX-None"
  },
  "run": {
    "id": "/workflows/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/runs/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "name": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "type": "Microsoft.Logic/workflows/runs"
  }
}

それぞれ単独で取得するときはこんな感じですね。

動的なコンテンツの追加の式 ステップに直接書くとき
workflow()?['id'] @{workflow()?['id']}
workflow()?['name'] @{workflow()?['name']}
workflow()?['type'] @{workflow()?['type']}
workflow()?['location'] @{workflow()?['location']}
workflow()?['tags/flowDisplayName'] @{workflow()?['tags/flowDisplayName']}
workflow()?['tags/environmentName'] @{workflow()?['tags/environmentName']}
workflow()?['tags/logicAppName'] @{workflow()?['tags/logicAppName']}
workflow()?['tags/environmentFlowSuspensionReason'] @{workflow()?['tags/environmentFlowSuspensionReason']}
workflow()?['run/id'] @{workflow()?['run/id']}
workflow()?['run/name'] @{workflow()?['run/name']}
workflow()?['run/type'] @{workflow()?['run/type']}

■ 同じ要素が複数出てくる

この取得できる内容ですが、一つの要素が複数の項目に出てくるものがありました。一部のものは環境や作り方によって変わってくるのかもしれませんので利用するときにはしっかりとテスト実行してご自身のフローでどうなるか確認してください。
同じ色の四角の部分が同じ値になっている部分です。

■ 今回はここまで

長くなってきたので今回はここまで、実際の値の中身の確認は後日書きます。

書きました。
rksoftware.hatenablog.com

■ 関連記事

rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com

Power Automate のフローの名前を取得する

Power Automate のフローの名前を記録したいこと、あると思います。
実行されるフローが多く、どのフローの実行結果か見分けづらいフローなどではきっとフローの名前を取得する技術が役に立つと思います。

■ 関数で取得

こんな関数で取得できました。

workflow()?['tags/flowDisplayName']

ステップの枠に直接書くならこんな感じ。

@{workflow()?['tags/flowDisplayName']}

画像で見るとこうです。

■ 簡単ですね

簡単ですね。

■ 関連記事

rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com rksoftware.hatenablog.com