動態是 Power Fx 中的一種資料類型,可以保存任何資料結構,無論是複雜或簡單。 它不能直接使用,也無法在運行時明確或隱含地轉換為另一種資料類型。 可以使用點表示法來存取 動態值 中的記錄欄位,且欄位的存在只會在執行階段進行驗證。
有兩種方式可以建立 動態 值:
- 使用 ParseJSON 函數。
- 使用傳回「動態」類型的連接器。
備註
動態以前 稱為 UntypedObject。 只是名稱發生了變化,語義沒有變化。 名稱出現在公式中的唯一位置是使用者定義函數和使用者定義類型的實驗版本。
簡單類型
包含 動態 值的變數值無法直接使用。 您始終必須使用相應的類型建構函式或使用 AsType 和 ParseJSON 函數將其轉換為特定類型來正確輸入它。
下列範例會轉換名為 的DynValue變數的值。
Text(DynValue)
Value(DynValue)
下表列出將 Dynamic 轉換為 該資料類型的資料類型和對應函式。
| 資料類型 | 函數 | 描述 |
|---|---|---|
| 布林值 | Boolean() | 將 Dynamic 轉換為 布林值時,基礎值必須代表布林值或可以自動轉換的類型(例如字串 “true”)。 |
| Color | ColorValue() 或 RGBA() | 顏色可以在階層式樣式表 (CSS) 顏色定義標記法中表示為字串或單個 RGBA 元件。 可以使用ColorValue() 函數直接從層疊樣式表 (CSS) 顏色定義字串轉換動態,或使用 RGBA() 函數從單個 RGBA 數字轉換為顏色。 |
| 貨幣、數字 | Value() | 將動態轉換為數字時,基礎值必須代表可以自動轉換的數字或類型(例如字串“123.456”)。 |
| 日期、日期時間、時間 | DateValue()、TimeValue() 或 DateTimeValue() | 當以 ISO 8601 格式表示時,日期、時間和日期時間可以直接從 動態 轉換為各自的類型。 其他格式必須先使用 Text() 函數將 JSON 欄位轉換成文字,然後傳遞至 DateValue(), TimeValue() or DateTimeValue() 函數,預設會使用目前使用者設定的語言來解譯日期和時間。 |
| GUID | GUID() | 如果基礎物件代表 GUID,或代表字串,則可以直接將 Dynamic 值轉換成 GUID。 |
| 超連結、影像和媒體 | Text() | 這些資料類型是文字資料類型,可以轉換成文字,然後在 Power Fx 中使用。 |
| 選擇、兩個選項 | Switch() 或 If() | 選擇和兩個選項在 Power Fx 中顯示為當地語系化字串。 選擇由數字支援,兩個選項由布林值支援。 無法直接從布林值、數字或字串轉換成選擇或兩個選項,但可將 Switch() 或 If() 函數用於布林值、文字或數字值,以正確指派選擇或兩個選項值。 |
| 錄製 | n/a | 沒有從 動態直接 轉換為記錄結構,但可以從 動態 擷取個別欄位以建立新記錄。 |
| 記錄參考 | n/a | 記錄參照是資料來源所獨有的,在 Dynamic 中沒有有意義的表示法。 |
| 資料表 | Table() 和 ForAll() | 動態可以表示一個陣列,可以將其轉換為表格。 這些物件可以是記錄陣列,或是有效單一資料行資料表的值陣列。 ForAll() 可用來建立具有完整類型化記錄的資料表。 如需詳細資訊,請參閱此文章中的範例。 |
| 文字 | Text() | 文字可以直接轉換。 如果動態值代表數字,則需要先使用 Value() 將動態轉換為數字,然後再轉換為文字。 |
記錄類型
您可以使用用於記錄的一般點表示法來存取代表 動態 記錄的變數上的欄位。 但是,只有在執行階段時才會驗證欄位是否存在。 因此,也沒有可用的 IntelliSense。 如果欄位不存在或具有基礎 Null 值,則存取它會導致 Blank() 值。
記錄上的每個欄位也是 動態類型,而且需要正確輸入。 欄位可以是簡單類型的動態記錄。 如果它是記錄,則可以鏈結點標記法。 如果不存在鏈結中的任何欄位,將會傳回 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
陣列
動態變數可以包含陣列。 即使陣列可以是記錄陣列或簡單類型的陣列,使用 Table() 函數將動態陣列轉換為表也始終會產生動態的單列表。
ForAll() 和 Index() 等函數不需要您先建立 Table(),因此也不需要您使用單一資料行 Value 欄位。
例如,要 獲取包含數字 值( ) [1, 2, 3] 的動態數組中的第二個數字,可以使用以下公式檢索表中的第二行並將列轉換為數字:
Value( Index( UOArray, 2 ) )
如果先將 Dynamic 轉換為 Table(), 則結果單欄表格中的第二列是 Value 包含 Dynamic 的欄:
Value( Index( Table( UOArray ), 2 ).Value )
對於含有名為 Field 之文字資料行的記錄陣列,會套用相同的邏輯。 可以直接訪問 Dynamic ,或者如果使用 Table() 函數將導致 Dynamic 的單列表。
Field該列可以直接從 Index() 函數傳回的 Dynamic 存取。
Text( Index( UORecordArray, 2 ).Field )
使用 Table() 函數時,先檢索單列 Value 取得 Dynamic,然後存取該 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) } )
轉換為類型化記錄和資料表
這很重要
- 將 AsType 和 IsType 搭配 動態 值使用是一項實驗性功能。
- 實驗性功能並非供生產使用,也可能不完整。 這些功能是在正式發行前先行推出,讓您能夠搶先體驗並提供意見反應。 其他資訊:了解畫布應用程式中的實驗性、預覽及已淘汰功能
- 只有在使用者定義型別實驗性功能已於設定 > 即將推出的功能 > 實驗性中開啟 (預設為關閉狀態) 時,才能使用本文所述的行為。
- 您的意見反應對我們很有價值。 在 Power Apps 實驗性功能社群論壇中告訴我們您的想法。
ParseJSON、IsType 和 AsType 函數可用於將 Dynamic 批量轉換為類型化物件,而不是單獨轉換每個簡單值。 使用 Type 函數來建立類型,以將動態結構對應至類型化結構。
例如,這裡會將 JSON 字串解譯為日期時間值,而不需要呼叫 DateTimeValue 函式:
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