Dynamic は、複雑または単純な任意のデータ構造を保持できる Power Fx のデータ型です。 明示的または暗黙的に、実行時に直接使用して別のデータ型に変換することはできません。 動的値のレコードのフィールドにはドット表記を使用してアクセスでき、フィールドの存在は実行時にのみ検証されます。
動的値を作成するには、次の 2 つの方法があります。
- ParseJSON 関数の使用。
- "動的" 型を返すコネクタの使用。
注
Dynamic は、以前は UntypedObject と呼れていました。 名前のみが変更され、セマンティクスに変更はありません。 数式に名前が表示されるのは、実験版のユーザー定義関数とユーザー定義型だけです。
簡単な種類
Dynamic 値を含む変数の値を直接使用することはできません。 常に、対応する型コンストラクターを使用するか、 AsType 関数と ParseJSON 関数を使用して特定の型に変換して、正しく型指定する必要があります。
次の例では、 という名前のDynValue変数の値を変換します。
Text(DynValue)
Value(DynValue)
次の表に、 Dynamic をそのデータ型に変換するデータ型と対応する関数を示します。
| データ型 | Function | 説明設定 |
|---|---|---|
| ブール値 | Boolean() | Dynamic から Boolean に変換する場合、基になる値は、自動的に変換できるブール値または型 (文字列 "true" など) を表す必要があります。 |
| カラー | ColorValue() または RGBA() | カラーは Cascading Style Sheet (CSS) 文字列または個々の RGBA コンポーネントとしての色定義表記として表すことができます。 Dynamic は、ColorValue() 関数を使用してカスケード スタイル シート (CSS) の色定義文字列から直接変換することも、RGBA() 関数を使用して個々の RGBA 番号から色に変換することもできます。 |
| 数字、通貨 | Value() | Dynamic から Number に変換する場合、基になる値は、自動的に変換できる数値または型 (文字列 "123.456" など) を表す必要があります。 |
| 日付、日時、時間 | DateValue()、TimeValue() または DateTimeValue() | 日付、時刻、および datetime は、ISO 8601 形式で表される場合、 動的 からそれぞれの型に直接変換できます。 その他の形式は、まず Text() 関数を使用してテキストに変換し、その後、デフォルトでは現在のユーザー設定の言語を使用して日時を解釈する DateValue(), TimeValue() or DateTimeValue() 関数へとパスされます。 |
| GUID | GUID() | 基になるオブジェクトが GUID を表す場合、または文字列を表す場合は、 動的 値を GUID に直接変換できます。 |
| HyperLink、イメージ、メディア | Text() | これらのデータ型はテキスト データ型であり、テキストに変換してから Power Fx で使用できます。 |
| 選択、2 つのオプション | Switch() または If() | 選択肢 と 2 つのオプション は Power Fx にローカライズされた文字列として表示されます。 選択肢 は、ブール値として数値と 2 つのオプション に裏付けられています。 ブール値、数値、または文字列から 選択肢 または 2 つのオプション からの直接変換はありませんが、Switch() または If() の関数をブール値、テキスト、または数値で使用して、正しく割り当てて、選択肢 または 2 つのオプション の値を正しく割り当てられます。 |
| Record | なし | Dynamic からレコード構造への直接変換はありませんが、動的から個々のフィールドを取得して新しいレコードを作成できます。 |
| レコード参照 | なし | レコード参照はデータソースに固有であり、 Dynamic では意味のある表現はありません。 |
| テーブル | Table() と ForAll() | Dynamic は、テーブルに変換できる配列を表すことができます。 これらのオブジェクトは、レコードの配列、または実質的に単一列テーブルである値の配列にすることができます。 ForAll() は、完全に型指定されたレコードを含むテーブルを作成するために使用できます。 詳細については、この記事の後半にある例を参照してください。 |
| テキスト | Text() | テキストは直接変換できます。 Dynamic 値が数値を表す場合は、テキストに変換する前に、Value() を使用して最初に Dynamic を数値に変換する必要があります。 |
レコードの種類
動的レコードを表す変数のフィールドには、レコードに使用される通常のドット表記を使用してアクセスできます。 ただし、フィールドの存在は実行時まで検証されません。 その結果、intellisense も利用できません。 フィールドが存在しないか、基になるフィールドがある場合 null 値にアクセスすると、Blank() 値になります。
レコードの各フィールドも Dynamic 型であり、適切に型指定する必要があります。 フィールドには、単純型の動的レコードを指定できます。 レコードの場合は、ドット表記を連鎖できます。 チェーン内のフィールドが存在しない場合、Blank() が返されます。
次の例では、という名前のDynRecord変数のフィールドを使用します。
Text(DynRecord.StringField)
Value(DynRecord.Field.ChildField)
フィールド名が無効な識別子名で構成されている場合 (たとえば、フィールド名が数字で始まっている場合や、ハイフンなどの無効な文字が含まれている場合)、フィールド名を一重引用符で囲むことができます。
dynamic.'01'
dynamic.'my-field'
動的な列アクセス
レコード内の列の名前が動的になる場合があります。 ColumnNames 関数を使用してレコードで使用可能な列名を決定し、Column 関数を使用して指定された列の値を取得します。
例:
LettersUsed = ParseJSON( "{ ""d"": 2, ""p"": 3 }" );
Concat( ColumnNames( LettersUsed ) As Names, Names.Value, ", " )
// returns "d, p"
Sum( ForAll( ColumnNames( LettersUsed ) As Names, Column( LettersUsed, Names.Value ) ), Value )
// returns 5
Array
動的変数には配列を含めることができます。 配列はレコードの配列でも単純型の配列でもかまいませんが、Table() 関数を使用して動的配列をテーブルに変換すると、常に Dynamic の単一列テーブルになります。
ForAll() と Index() のような関数は最初に Table() を作成する必要はありません。結果は単一列 Value フィールドを使用する必要がないからです。
たとえば、数値 () を含む [1, 2, 3] の配列の 2 番目の数値を取得するには、次の数式を使用して、テーブル内の 2 番目の行を取得し、列を数値に変換できます。
Value( Index( UOArray, 2 ) )
Dynamic が最初に Table() に変換された場合、結果の単一列テーブルの 2 番目の行はValue を含む列になります。
Value( Index( Table( UOArray ), 2 ).Value )
Field というテキスト列を持つレコードの配列の場合、同じロジックが適用されます。
Dynamic には直接アクセスできます。または、Table() 関数を使用すると、Dynamic の単一列テーブルになります。
Field列は、Index() 関数によって返される Dynamic から直接アクセスできます。
Text( Index( UORecordArray, 2 ).Field )
Table() 関数を使用する場合は、最初に単一列Value列を取得して動的を取得してから、Field列にアクセスします。
Text( Index( Table( UORecordArray ), 2 ).Value.Field )
レコードの配列を型付きテーブルに変換するには、ForAll() 関数を使用して、個々のフィールドを変換します。
ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )
Dynamic が最初にテーブルに変換される場合は、もう一度、結果として得られる Dynamic の単一列テーブルで、Value列を使用してフィールドを取得する必要があります。
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
型指定されたレコードとテーブルへの変換
Important
- AsType と IsType を動的な値と共に使用することは、試験段階の機能です。
- 試験的な機能は運用環境での使用を目的としていないため、完全ではない可能性があります。 これらの機能は公式リリースの前に利用できるため、早期にアクセスしてフィードバックを提供できます。 詳細: キャンバス アプリで実験的、プレビューおよび廃止された機能を理解する
- この記事で説明する動作は、[>段階] のユーザー定義型の実験用機能オンになっている場合にのみ使用できます (既定ではオフになっています)。
- お客様のフィードバックは弊社にとって重要です。 Power Apps の試験的機能コミュニティ フォーラムで、ご自分の考えをお聞かせください。
各単純な値を個別に変換する代わりに、 ParseJSON、 IsType、 および AsType 関数を使用して、 Dynamic を型指定されたオブジェクトに一括変換できます。 Type 関数を使用して、動的構造体を型指定された構造体にマップする型を作成します。
たとえば、ここでは DateTimeValue関数を呼び出すことなく、JSON 文字列を日付時刻の値として解釈しています:
Eclipse = ParseJSON( "{ ""Start"": ""2026-08-12T18:26:00.000Z"", ""End"": ""2026-08-12T18:33:00.000Z"" }",
Type( { Start: DateTime, End: DateTime } ) );
DateDiff( Eclipse.Start, Eclipse.End, TimeUnit.Minutes )
// 7