次の方法で共有


動的な値

Dynamic は、複雑または単純な任意のデータ構造を保持できる Power Fx のデータ型です。 明示的または暗黙的に、実行時に直接使用して別のデータ型に変換することはできません。 動的値のレコードのフィールドにはドット表記を使用してアクセスでき、フィールドの存在は実行時にのみ検証されます。

動的値を作成するには、次の 2 つの方法があります。

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

  • AsTypeIsType動的な値と共に使用することは、試験段階の機能です。
  • 試験的な機能は運用環境での使用を目的としていないため、完全ではない可能性があります。 これらの機能は公式リリースの前に利用できるため、早期にアクセスしてフィードバックを提供できます。 詳細: キャンバス アプリで実験的、プレビューおよび廃止された機能を理解する
  • この記事で説明する動作は、[>段階] のユーザー定義型の実験用機能オンになっている場合にのみ使用できます (既定ではオフになっています)。
  • お客様のフィードバックは弊社にとって重要です。 Power Apps の試験的機能コミュニティ フォーラムで、ご自分の考えをお聞かせください。

各単純な値を個別に変換する代わりに、 ParseJSONIsTypeおよび 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