使用非類型化物件和動態物件
在 Power Apps 中處理動作時,可能會遇到某些動作的非類型化傳回值或輸入值。 以前,Power Apps 會忽略非類型或動態輸入欄位,而且在 PowerFX 運算式中看不到這些欄位,但是現在您可以直接使用這些欄位。 當傳回類型是非類型時,Power Apps 將會傳回布林值。 現在,它會傳回非類型化物件。
注意
假設您的 Power Fx 運算式相依於這些函數的布林傳回值。 這樣的話,您必須重寫公式,並將非類型化物件明確轉換為布林值。 某些功能 (例如 'IfError') 尚未完全支援非類型化物件。 如果您的運算式包含此類函數,請參考本文末尾的注釋,以瞭解是否有變通辦法。
將非類型化物件做為參數傳入
某些動作需要非類型化物件做為參數值。 如果您有 Power Fx 記錄,則可以將它轉換為非類型化物件,使其適合傳遞給動作。
在下例中,Dataverse 帳戶 資料表上可用的合併動作需要數個非類型化參數。 為了做好準備,我們將定義三個變數來儲存 TargetObject、SubordinateObject 和 UpdateContextObject。 我們先將文字字串 Microsoft.Dynamics.CRM.account 指派給變數,其將會在整個範例中重複使用。
Set (OdataType, “Microsoft.Dynamics.CRM.account”);
然後將 TargetObject 指派給具有 [名稱]、[accountid] 和 @odata.type 屬性的 Power Fx 記錄。 同樣地,將 Power Fx 記錄指派給 Subordinate 和 UpdateContext 物件。
Set (TargetObject, {name: "Test 2", accountid: "145dc2ba-85a2-ed11-aado-0022482d76a5", '@odata.type': OdataType});
Set (SubordinateObject, {name: FirstRecord.’Account name’, accountid: FirstRecord.Account, ‘@odata.type’ : OdataType });
Set (UpdateContextObject, {telephone1: FirstRecord.’Main Phone’, address1_city: FirstRecord.’Address 1 : City’, ‘@odata.type’ : OdataType });
接下來,我們再建立三個變數來儲存轉換後的非類型化記錄:TargetUntypedObject、SubordinateUntypedObject 和 UpdateContextUntypedObject。 若要執行轉換,我們將對原始變數使用 ParseJSON(JSON()) 函數。 此動作會將 Power Fx 記錄轉換成非類型化物件。
Set (TargetUntypedObject, ParseJSON(JSON(TargetObject)));
Set (SubordinateUntypedObject, ParseJSON(JSON(SubordinateObject)));
Set (UpdateContextUntypedObject, ParseJSON(JSON(UpdateContextObject)));
最後,我們會傳遞必要的參數 (包括非類型化與類型化),來呼叫合併動作:
Environment.Merge({Target: TargetUntypedObject, Subordinate: SubordinateUntypedObject, UpdateContent: UpdateContextUntypedObject, PerformParentingChecks: false });
使用透過動作傳回的非類型化物件
如果動作型連接器傳回物件,則不論是否已指派類型,都可以直接存取其屬性。 但是,如果您想在 Power Apps 中將某個屬性用於特定用途 (例如加上標籤),則必須先進行轉換。
在下方範例中,httpRequest 函數會傳回先前轉換為布林值的非類型化物件。
Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));
回覆中的其中一個屬性是 displayName。 可以使用 Power Fx 運算式存取和轉換,如下所示:
Text(response.displayName)
轉換成物件文字,以在 Power Apps 標籤控制項中使用它。
使用動態欄位
動作回覆現在會擷取動態輸出,您可以利用上述的方法來存取這些屬性。 此外,您也可以使用動態輸入欄位。
請考慮 Microsoft Teams 中具有動態輸入主體參數的 'GetMessageDetails' 動作。 先前無法查看或指定此參數。 使用最新的更新,您可以使用適當的 Power Fx 記錄結構來設定名為「body」的變數。
Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}}));
然後,我們可以呼叫 GetMessageDetails 動作,並將回覆指派給 teamsResponse 變數。
Set (teamsResponse, MicrosoftTeams.GetMessageDetails ( 1661365068558, “channel”, body ));
轉換傳回先前傳回布林值的非類型化物件的公式。
Power Fx 採用有限數目的非類型化物件,因此您的公式可能需要進行明確轉換。 特別是,如果您的公式相依於布林值回覆,就需要進行轉換。 如果您只需要知道是否存在錯誤,則可以使用 IsError 函數:
If(
IsError(Office365Outlook.CalendarDeleteItemV2("Calendar", 1)),
Notify("An Outlook appointment could not be found or could not be deleted")
)
若要存取僅可透過 IfError 使用的錯誤資訊,您必須使用轉換函數 (例如布林值、文字或值) 將非類型化物件轉換為有效的類型。 這些函數會在遇到錯誤時產生錯誤。 下列範例說明這點:
With({result: Office365Outlook.CalendarDeleteItemV2("Calendar", 1)},
If( IsError(result),
IfError(
Boolean(result), // any conversion function would do, such as Text, Value, …
Notify("An Outlook appointment could not be found or could not be deleted: " & FirstError.Message)
) ) )