型指定されていないオブジェクトのデータ型
型指定されていないオブジェクト は、複雑なものでも単純なものでも、あらゆるデータ構造を保持できる Power Fx のデータ型です。 直接使用することはできず、データ型への明示的な変換が必要です。 型指定されていないオブジェクト のレコードのフィールドは、ドット表記を使用してアクセスでき、フィールドの存在は実行時にのみ検証されます。
型指定されていないオブジェクト は、特定の型指定されていないプロバイダーの戻り値の型です。 現在、ParseJSON() 関数のみが 型指定されていないオブジェクト を返します。
簡単な種類
タイプの変数の値 型指定されていないオブジェクト は、直接使用することはできません。 対応する型コンストラクターを使用して、常に正しく型を指定する必要があります。
次の例では、型指定されていないオブジェクト の UOValue
と言う名前を変換します。
Text(UOValue)
Value(UOValue)
次の表に、型指定されていないオブジェクト をそのデータ型に変換するデータ型と対応する関数を示します。
データ型 | Function | 説明設定 |
---|---|---|
ブール型 | Boolean() | 型指定されていないオブジェクト を ブール値 に変換する際、基になる値は、ブール値または自動的に変換できる型 (文字列 "true" など) を表す必要があります。 |
カラー | ColorValue() or RGBA() | カラーは Cascading Style Sheet (CSS) 文字列または個々の RGBA コンポーネントとしての色定義表記として表すことができます。 型指定されていないオブジェクト は、ColorValue() 関数を使用して、Cascading Style Sheet (CSS) から直接、または個々の RGBA 番号 から、RGBA() 関数を使用して色に変換できます。 |
数字、通貨 | Value() | 型指定されていないオブジェクト を 数値 に変換する際、基になる値は、数値または自動的に変換できる型 (文字列 "123.456" など) を表す必要があります。 |
日付、日時、時間 | DateValue(), TimeValue() or DateTimeValue() | 日付、時刻、および日時は、型指定されていないオブジェクト から、ISO 8601 形式で表される場合、それぞれのタイプに直接変換されます。 その他の形式は、まず Text() 関数を使用してテキストに変換し、その後、デフォルトでは現在のユーザー設定の言語を使用して日時を解釈する DateValue(), TimeValue() or DateTimeValue() 関数へとパスされます。 |
GUID | GUID() | 型指定されていないオブジェクト 基になるオブジェクトが GUID を表している場合、または文字列を表している場合は、GUID に直接変換できます。 |
HyperLink、イメージ、メディア | Text() | これらのデータ型はテキスト データ型であり、テキストに変換してから Power Fx で使用できます。 |
選択、2 つのオプション | Switch() or If() | 選択肢 と 2 つのオプション は Power Fx にローカライズされた文字列として表示されます。 選択肢 は、ブール値として数値と 2 つのオプション に裏付けられています。 ブール値、数値、または文字列から 選択肢 または 2 つのオプション からの直接変換はありませんが、Switch() または If() の関数をブール値、テキスト、または数値で使用して、正しく割り当てて、選択肢 または 2 つのオプション の値を正しく割り当てられます。 |
Record | なし | 型指定されていないオブジェクト からレコード構造への直接変換はありませんが、個々のフィールドは 型指定されていないオブジェクト から取得して新しいレコードを作成できます。 |
レコード参照 | なし | レコード参照はデータソースに固有であり、型指定されていないオブジェクト で意味のある表現はありません。 |
テーブル | Table() and ForAll() | 型指定されていないオブジェクト はテーブルに変換できる配列を表すことができます。 これらのオブジェクトは、レコードの配列、または実質的に単一列テーブルである値の配列にすることができます。 ForAll() は、完全に型指定されたレコードを含むテーブルを作成するために使用できます。 詳細については、この記事の後半にある例を参照してください。 |
Text | Text() | テキストは直接変換できます。 もし 型指定されていないオブジェクト が数値を表す場合、テキストに変換する前に Value() を使って 型指定されていないオブジェクト を最初に数値に変換する必要があります。 |
レコードの種類
レコードのために使用される通常のドット表記を使用して、型指定されていないオブジェクト レコードを表す変数のフィールドにアクセスできます。 ただし、フィールドの存在は実行時まで検証されません。 その結果、intellisense も利用できません。 フィールドが存在しないか、基になるフィールドがある場合 null 値にアクセスすると、Blank() 値になります。
レコードの各フィールドもタイプ 型指定されていないオブジェクト で、適切に入力する必要があります。 フィールドは、単純型の型なしレコードにすることができます。 レコードの場合は、ドット表記を連鎖できます。 チェーン内のフィールドが存在しない場合、Blank() が返されます。
次の例では、UORecord
と言う名前の 型指定されていないオブジェクト からのフィールドを使用します。
Text(UORecord.StringField)
Value(UORecord.Field.ChildField)
フィールド名が無効な識別子名で構成されている場合 (たとえば、フィールド名が数字で始まっている場合や、ハイフンなどの無効な文字が含まれている場合)、フィールド名を一重引用符で囲むことができます。
untyped.'01'
untyped.'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() 関数を使用してテーブルに変換することは、常に 型指定されていないオブジェクト の単一列のテーブルになります。
ForAll() と Index() のような関数は最初に Table() を作成する必要はありません。結果は単一列 Value
フィールドを使用する必要がないからです。
例えば、数値 ( [1, 2, 3]
) を含む 型指定されていないオブジェクト のアレイの2番目の数字を取得するには、次の式はテーブルの 2 番目の長を取得して、列を数字に変換するために使用できます。
Value( Index( UOArray, 2 ) )
もし 型指定されていないオブジェクト が Table() にまず変換され、結果の単一列テーブルの 2 番目の行は、型指定されていないオブジェクト を含む Value
列です。
Value( Index( Table( UOArray ), 2 ).Value )
Field
というテキスト列を持つレコードの配列の場合、同じロジックが適用されます。
型指定されていないオブジェクト は直接アクセスできます、または Table() 関数は、型指定されていないオブジェクト 単一列のテーブルになります。
Field
列は、Index() 関数によって返された 型指定されていないオブジェクト から直接アクセスできます。
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) } )
もし 型指定されていないオブジェクト が最初にテーブルに変換され、再び、結果の単一列テーブルの 型指定されていないオブジェクト はフィールドを取得するために Value
列を使用する必要があります。
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
型指定されたレコードとテーブルへの変換
単純な値を個別に変換する代わりに、ParseJSON、IsType、AsType 関数を使用して、型指定されていないオブジェクトを型付けされたオブジェクトに一括変換できます。 型付けされていない構造体を型付けされた構造体にマッピングする型を作成するには、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