本記事は、 Microsoft Power Automate - Qiita Advent Calendar 2024 - Qiita シリーズ3 の 21日目 の記事だ。
…本当は、 シリーズ1 の 19日目 に投稿しようとしてたのだけれど、諸事情で記事更新ができず、代理投稿されてしまったので、改めて投稿し直している。
今回は、 Power Automate に於いて、連想配列の形で情報を持たせた Object と、 key-value Array の間を相互変換する方法を解説する。
Premium コネクタやループ処理などは使用せず、 O(1) オーダーのなるべく少ないステップ数で Object ⇔ Array 配列の相互変換させよう。
昨年の Power Automate Advent Calendar 2023 と同様、ステップ数を節約するテクニックの話題だ。
key-value Array ⇔ Object の変換目的
Array から Object に変換すると、 Power Automate の数式で variables('val-name')['property-name']
とアクセスできる。
このため、ループ処理で一旦統計したデータを後から参照させる場合などで都合が良い。
一方で Object から Array にしておくと、 選択アクション を使って 1ステップ で反復処理が行えるため、処理ステップ数を節約できる。
ほか活躍できる具体例として、Array にすることで Office Script との間での辞書型の情報の受け渡しが可能になることが挙げられる。
Office Script との引数・戻り値の受け渡しには key-value Array がよい
スクリプトのユーザー入力を取得する - Office Scripts#入力の制限 にあるように、 Office Script の入出力に設定する『型』は、リテラル型とそれらによる配列・オブジェクト型に限られる。
TypeScript で言う Indexシグネチャで表現できるディクショナリパターン の型を、 Office Script の main 関数のパラメータに使おうとすると、 Type literal contains invalid type 'Unrecognized'
エラーになってしまうのだ。
function main(
workbook: ExcelScript.Workbook,
arg1: { [key: string]: { prop1: string, prop2: string } }
) { // <- Parameter type error for parameter 'arg1: TypeLiteral': Type literal contains invalid type 'Unrecognized'.
const val: { [key: string]: { prop1: string, prop2: string } } = {}; // <- ok
}
幸い引数に object
型を設定することはできるが、型情報が綺麗サッパリ消えてしまうので、型アサーションに頼る必要が出てくる。
加えて、それでも返り値には object
型を設定できない。
function main(
workbook: ExcelScript.Workbook,
arg1: object
) {
for (const key of Object.keys(arg1)) {
const t = arg1[key] as { prop1: string, prop2: string };
}
return arg1; // <- Return type error: 'Object' is not supported. Try using an interface or type literal instead
}
つまり、 HTTP 要求トリガー の body('HTTP_要求').inputs.headers
のような、任意のプロパティ名のオブジェクトで渡されるような情報を、 Office Script で処理して返しづらい。
このため代わりに、 { key: string, value: TYPE }[]
な key-value 配列に変換して受け渡すことで、型情報を維持したまま Office Script との間で辞書型の情報を受け渡せるわけだ。
function main(
workbook: ExcelScript.Workbook,
arg1: { key: string, value: { prop1: string, prop2: string } }[]
): { key: string, value: { prop1: string, prop2: string } }[] { // <- ok
return arg1; // <- ok
}
Power Automate からの Office Script の呼び出しには 3回/10秒 という制限があるので、 Power Automate の同一フロー中に何度も呼び出したり、ましてのフロー内のループ中に呼び出す事はできない。
このため、 key-value Array を引数に Office Script を 1回 呼び出してその中でまとめて処理をし、 Power Automate 側で key-value Array から辞書型のオブジェクトに戻すのが良いだろう。
相互変換の実装
続きを読む →