MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Automateの裏側をみてみよう! (2/2)

前回

前回はPower AutomateのメニューにあるPeak codeの紹介と、トリガー・アクションの入力・出力をどうやって取り出すかを紹介しました。

今回はもうひとつの「Settings」について、トリガー・アクションでそれぞれ代表的と思われるものを紹介します。 念のため、Settingsには↓ここからアクセスします。

image.png

Split-On (トリガーのみ)

トリガーにしかない設定です。

Split-Onはトリガーしたときのアイテムsを分割してFlow実行してくれる機能です。

例えばSharePoint listのクイック編集でアイテム作成した場合、Split-On:OFFだと、トリガーは作成されたアイテムsで発生するので、配列を対象に処理することになります。

image.png

Split-Onを有効にすると、トリガーしたときの配列をバラバラにして、個別にFlowを実行してくれます。このため、トリガー以降の処理を簡単にすることができます。

もともとPower Automateの旧ライセンス形態では、Flowの実行回数に上限があったため、この設定をOffにすることで実行回数が節約できたんだろうと予想されます。

image.png

Concurrency control

Apply to eachなど並列実行できるアクションに関する、並列化の多重度の設定です。

最低は1、最大は50。1の場合には直列に実行されます。

この並列化の多重度、万能なように思えますが、並列化の多重度を上げると、処理順がバラバラになったり、ループの中で依存関係のあるようなアクション(たとえばUpdate variableやAppend to array variableなど)がある場合には十分に恩恵が得られない場合があるので、利用には注意が必要です。 ただし、単純なループ処理では劇的に実行速度が改善されるため、処理の内容に応じて設定してみてください。

※並列実行の多重度の恩恵を最大限活用するための方法として、Pieterの方法が有効です。

image.png

Secure Inputs/Outputs

アクション/トリガーのInput/Outputを実行履歴に表示しないというものです。

有効にすると、入力をセキュアにする (設定をONにする)と、ほかのアクションでその入力を参照場合でも、履歴上で非表示になります。 もちろん、セキュアな入力値を加工したとしても、履歴上では隠蔽されます。

image.png

Flowの編集権限は持っていても、履歴に表示されないので、用途としては個人の位置情報を特定できるような入力の隠蔽、あるいはAPI実行時のAPIKeyを含む入力の隠蔽かなと思います。

image.png

Tracked Properties

アクションに追加できる追加のプロパティです。 ほかのアクションから参照可能 actions('action name')?['trackedProperties'] の書式でデータを取り出します。

Tracked Propertiesはjson形式のデータとして扱われるので、指定する際にはKey : Valueのペアを設定します。

また、Valueは、""ダブルクォーテーションでくくり、関数を使う場合には@(アットマーク)から始める必要があります。

image.png

さらに自分自身の入力も、Tracked Propertiesに含めることができます。この場合には前回のブログで紹介した action()?['inputs'] を利用します。 自分自身をTracked Propertiesに含めることができるので、これで自分自身のコピーを生成し、通常エラーになるような自己参照した処理も可能になります。

image.png

その他の利用例は以下をご覧ください。1アクションで、すべてのフォーマットで時間を定義しています。

Trigger Conditions

Docsだと全然情報ないのですが、各トリガー(Flowの開始部分)に追加で設定できる発動条件です。

トリガーの[・・・]をクリックして表示されるメニューでSettingsを選ぶと表示されます。

image.png

ここには、もともとのトリガーの条件とは別に、トリガーしたときのアイテムや各種データをもとに、さらに発動条件を指定することができます。 例えば、SharePointのアイテム作成トリガーで、特定のステータス(選択肢フィールドの値)の場合だったら~とか、反復実行で1分おき に設定するのだけど、発動は日中だけにしたい とか。 そういった、もとのトリガーだけではカバーしきれないようなカスタムの発動条件が定義できます。

Trigger Conditionsを使わない場合、トリガーの次のステップでIFやSWITCH等の分岐条件を入れるかと思います。Falseなら実行終了とか。 そういった「発動はさせるけど、すぐ条件で終わらせることがある」ようなFlowに対して、Trigger Conditionsは有効に働きます。

image.png

何がうれしい?

単純にはトリガー回数を減らせるので、実行履歴が見やすくなります。あとは誤って深夜とかに発動してPush通知飛んじゃう みたいなことも避けれるかもしれません。

ただ、多少は数式を書かないといけないので、そこだけはトレードオフです。

何に使える?

すぐ思いついたのは以下のパターンです。

  1. SharePointリスト/ライブラリで、更新のみ検出する (標準では作成と更新どちらも発動する)
  2. リストの特定のステータスでのみ対象とする (これも作成・更新で後ろでIFしたりする)
  3. 反復のスケジュール実行で、実行のウィンドウを指定する (繰り返しを1日おきで、時間指定でもいいけど短いインターバルだと結構大変)

Trigger Conditionsの設定

簡単にいくつかのパターンでTrigger Conditionsの設定方法を見てみます。

1. トリガーしたときのデータに応じた条件

例として、SharePointの選択肢フィールドの値に応じた処理を考えてみます。 データに応じた処理を行う場合、基本的には triggerBody() に連なるデータを参照して、条件を書きます。

最初はどんな式を書けばいいのか、どんなデータを受信しているかわからないと思いますので、すごく短い、ただtriggerBody()をComposeするだけのFlowを作ってテストします。

image.png

これで得られる結果をもとにして、例えば"Title"のデータを使いたいなら

triggerBody()?['Title']

を利用します。

選択肢フィールドであるStatus は階層的になっているので、その値を使うときは triggerBody()?['Status']?['Value'] になります。

Trigger Conditionsで必須なのは条件式、つまり論理演算です。公式のドキュメントが一番見やすいので こちら をご覧ください。

あとはお約束事ですが、Trigger Conditionsの式を書くときは先頭に @ をつけます

これらを踏まえて、『Status列の値が"Closed"の場合』 というTrigger Conditionsは

@equals(triggerBody()?['Status']?['Value'],'Closed')

image.png

このように書けます。

2. データ以外の情報を利用する場合

あまり思いつきませんが、指定した時間(hour)で高頻度でFlowを実行させたい場合(7:00~8:00の間に5分間隔とか)には、

utcNow() : トリガーした時間 (UTC)
formatDateTime() : utcNow()から時間(hour)だけを取り出すために利用
int() : formatDateTimeの結果のStringを整数に変換 

これらの関数を組み合わせていきます。

image.png

実際に一日ONにしてみましたが、指定時間の間だけ、5分間隔で実行されていました。

image.png

裏側まとめ

普段あまり除かない、Power Automateの裏側を見てきました。基本的には、ここらへんはディープなのであまり触らなくてもよいと思いますが、パフォーマンス改善の一つの切り口だったり、個人に紐づく情報の隠蔽だったり、あるいは通常の方法だと1つ変数を増やさないといけないようなケースのワークアラウンドとして、これらを知っておくと幅が広がるかなと思います。