Copilot Studio Collect関数のように変数にアイテムを動的に追加する|コレクションの代わり

Copilot StudioにはClearCollectやCollectのような関数が用意されていないが、動的にアイテムを追加したいことが多いので方法を調査。

スポンサーリンク

今回やりたいこと

今回はPower Appsでいうところの、こういう処理がしたいときのお話。

Copilot Studioにはコレクション(ClearCollectやCollect)が存在しないので、Table型の変数を更新していくことで実現することになる。

実現方法1:Table関数での更新

まずはテーブル型の変数を初期化する。このとき、必ずオブジェクトを一つ以上追加する
※変数の初期化で「空のテーブル」入れるとうまく動作しない(詳しくは章「おまけ」参照)。
※オブジェクトは最後に除去するので任意の値でOK。ただしプロパティはループの中で追加するアイテムのプロパティと揃える。
そしたら、ループの中でこの変数をTable関数で更新(アイテムを追加)していく。
※ループの構築はこちらの記事を参照。
ループが完了した後、LastN関数を使用し、最初に追加したオブジェクトを削除する。
これで必要なテーブル(オブジェクト配列)を取得できる

実現方法2:JSONを使う

JSONを使用しても実現可能。初期値として空文字を定義し、
ループの中でJSON関数を使用して作成したオブジェクト文字列を、カンマを間に挟んで結合していく。
Topic.json_Collection & 
If(!IsBlank(Topic.json_Collection), ",") & 
JSON({num:Topic.i})
最後に文字列「[」「]」と、ParseJSONとForAllを使ってテーブルに変換。
ForAll(
    ParseJSON("["&Topic.json_Collection&"]"),
    {num:Int(ThisRecord.num)} // オブジェクトの定義
)
こんな感じでテーブル(オブジェクト配列)を取得できる。

外部サービスなどとJSONでやり取りした値を動的に追加する場合は、こちらの方が楽かも。

おまけ:変数の初期値が空のテーブルだとうまく動作しない

テーブル型の変数を空で定義し、
先ほど同様にアイテムを追加していく。
結果はなぜかnullが入ってしまう。
Table関数の第一引数をForAllに変更しても結果は一緒。
ちなみにPower Appsだと問題なく動作するので、Copilot StudioのPower Fxの仕様らしい。

関連記事

コメント

タイトルとURLをコピーしました