Copilot StudioにはClearCollectやCollectのような関数が用意されていないが、動的にアイテムを追加したいことが多いので方法を調査。
今回やりたいこと
今回はPower Appsでいうところの、こういう処理がしたいときのお話。


Copilot Studioにはコレクション(ClearCollectやCollect)が存在しないので、Table型の変数を更新していくことで実現することになる。
実現方法1:Table関数での更新
まずはテーブル型の変数を初期化する。このとき、必ずオブジェクトを一つ以上追加する。
※変数の初期化で「空のテーブル」入れるとうまく動作しない(詳しくは章「おまけ」参照)。
※オブジェクトは最後に除去するので任意の値でOK。ただしプロパティはループの中で追加するアイテムのプロパティと揃える。

※変数の初期化で「空のテーブル」入れるとうまく動作しない(詳しくは章「おまけ」参照)。
※オブジェクトは最後に除去するので任意の値でOK。ただしプロパティはループの中で追加するアイテムのプロパティと揃える。

ループが完了した後、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の仕様らしい。


コメント