Microsoft Power Fx 表格

Note

Microsoft Power Fx 是畫布應用程式語言的新名稱。 這些文章仍在進行中,Microsoft 正在從 canvas 應用程式中擷取該語言,並將其整合至其他 Microsoft Power Platform 產品,並以開放原始碼形式提供。 從 Microsoft Power Fx 概覽開始以取得對該語言的介紹。

Microsoft Power Fx 表格將資料組織成記錄、欄位和欄位,來源包括 Microsoft Excel、SharePoint 和 SQL Server。 學習這些結構,撰寫公式,有效存取、塑造並操作表格資料。

  • 記錄包含一或多種個人、場所或事物的相關資訊。 例如,記錄可能包含單一客戶的名稱、電子郵件地址和電話號碼。 其他工具將記錄稱為「資料列」或「項目」。
  • 表格會保存一或多筆記錄,其中包含相同類別的資訊。 例如,資料表可能包含 50 個客戶的名稱、電子郵件地址和電話號碼。

您可以建置各種公式,採用資料表的名稱做為引數,就像 Excel 中的公式採用一或多個儲存格參考做為引數一樣。 Power Fx 中的某些公式會傳回資料表,反映您指定的其他引數。 例如,您可能建立一個公式︰

  • 來更新資料表中的記錄,方法為指定該資料表做為 Patch 函式中多個引數中的其中一個
  • 新增、移除和重新命名資料表中的資料行,方法為指定該資料表做為 AddColumns、DropColumns 或 RenameColumns 函式的引數。 那些函式都不會修改原始的表格。 函式反而會根據您指定的其他引數傳回另一個資料表。

資料表的元素

記錄、欄位和欄位組成表格的截圖。

記錄​​

每一筆記錄都包含至少一種關於個人、場所或事物的資訊。 前述範例顯示每種產品(巧克力、 麵包和 水)的記錄,以及每個資訊類別(價格、 手頭數量、 訂單數量)的欄位。

在公式中,您可以使用大括號參照表格內容外的記錄本身。 例如,此紀錄 { Name: "Strawberries", Price: 7.99 } 與資料表沒有關聯。 請注意,該範例中的欄位名稱(例如名稱和價格) 並未含括在雙引號中。

欄位​​

欄位是記錄中的個別資訊片段。 您可以視覺化這類欄位,做為特定記錄資料行中的值。

跟使用控制項一樣,您可以使用記錄上的 .運算子來引用記錄的欄位。 例如,First(Products).Name 會傳回產品資料表中第一筆記錄的名稱欄位。

欄位可以包含另一筆記錄或資料表,如 GroupBy 函式的範例所示。 您可以依照需求巢狀建立多層記錄和表格。

行

資料行指的是表格中一或多筆記錄的相同欄位。 在前述範例中,每個產品都有一個價格欄位,且該價格欄位包含所有產品。 前表有四欄,橫向顯示於頂部:

  • 名稱
  • 價格
  • 現有庫存數量
  • 訂單數量

資料行的名稱反映該資料行中的欄位。

資料行內的所有值都屬於相同的資料類型。 在前述範例中,「手頭數量」欄位總是包含數字,且不能包含字串,例如「12 單位」,代表單一紀錄。 任何欄位的值也可能是空白。

你可能在其他工具中稱欄位為「欄位」。

資料表

資料表包含一或多筆記錄,每筆記錄都有多個欄位,它們在各個記錄中都具有一致的名稱。

任何儲存在資料來源或集合中的表格都有名稱 (用來稱呼表格),並將它傳遞至採用表格做為引數的函式。 表格也可以是函式或公式的結果。

如下列範例所示,您可以使用在公式表示資料表,方法為搭配使用 Table 函式與一組您用大括號表示的記錄︰

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

您也可以定義單一資料行的表格,以方括弧括住。 另一種撰寫上述公式的方式︰

[ "Strawberry", "Vanilla" ]

表格公式

在 Excel 和 Power Fx 中,您可以使用公式,以類似方式操作數字和字串︰

  • 在 Excel 中,於儲存格 A1 中輸入一值(例如 42),然後在另一個儲存格中輸入公式 (例如 A1 + 2),以顯示 44 的值。
  • 在 Power Apps 中,將 Slider1 的 Default 屬性設為 42,並將標籤的 Text 屬性設為 Slider1.Value + 2 已顯示 44 的值。

在這兩種案例中,如果您變更引數的值(例如,資料格 A1 中的數字或 Slider1 的值),則算出的值會自動變更。

同樣地,您可以使用公式存取和操作表格和記錄中的資料。 您可以使用資料表的名稱做為某些公式(例如 Min(Catalog, Price))中的引數,以顯示目錄資料表中價格資料行的最低值。 其他公式提供整個資料表為傳回值,例如 RenameColumns(Catalog, "Price", "Cost"),會傳回目錄資料表中的所有記錄,但會將價格資料行的名稱變更為成本。

和數字一樣,當基礎表格或記錄變更時,涉及表格和記錄的公式會自動重新計算。 如果目錄資料表中的產品成本降低而低於前一個最小值,則 Min 公式傳回的值將自動變更以符合它。

資料表函式和控制項屬性

想想 Lower 函式。 如果變數 welcome 包含文字字串 "Hello,world",則公式 Lower( welcome ) 會傳回 "hello, world"。 這個函數不會改變該變數的值。 Lower 是純函式,因為它只會處理輸入並產生輸出。 這就是全部;它不會有任何副作用。 Excel 中的所有函式以及 Power Fx 中大部分的函式都是純函式,允許自動重新計算活頁簿或應用程式。

Power Fx 提供一組函式,這些函式會以相同的方式在資料表上執行。 這些函式會將採用表格做為輸入並篩選、排序、轉換、減少和摘要整個表格格。 事實上,通常採用單一值的 Lower 和許多其他函式,也可以採用單一資料行資料表做為輸入。

許多函數會以單一資料行資料表做為輸入。 如果整個資料表只有一個資料行,您可以依名稱指定它。 如果資料表有多個資料行,您可以使用 Table.Column 語法來指定其中一個資料行。 例如,產品.名稱會傳回只有產品資料表中名稱值的單一資料行資料表 。

您可以使用 AddColumns、RenameColumns、ShowColumns 或 DropColumns 函數來隨心所欲地徹底改變資料表的形狀。 同樣地,這些函式只會變更其輸出,而不會變更其來源。

行為公式

其他函式是專門用來修改資料且有副作用。 因為這些函式並不純,所以您必須小心地建立它們,而且它們在應用程式中不能參與自動重新計算值。 您可以只在行為公式 內使用這些函式。

記錄範圍

有些函式是透過逐一評估表格中所有紀錄的公式來運作。 該公式的結果有多種使用方式:

  • AddColumns - Formula 提供新欄位的值。
  • Average、Max、Min、Sum、StdevP 和 VarP - 公式會提供要加總的值。
  • Filter 和 Lookup - 公式會判定輸出中是否應該包括記錄。
  • Concat - 公式會決定要一起串連的字串。
  • Distinct - 公式會傳回一值,用來識別重複記錄。
  • ForAll - 公式可以傳回任何值,可能會有副作用。
  • Sort - 公式會提供排序記錄時要依據的值。
  • With - 公式可以傳回任何值,可能會有副作用。

在這些公式內,您可以參考正在處理之記錄的欄位。 其中每一個函式都會建立一個用以評估公式的「記錄範圍」,其中記錄的欄位可以做為最上層識別碼。 您也可以由整個應用程式中參照控制項屬性及其他值。

例如,取得置於全域變數中的產品資料表:

產品表截圖,顯示請求數量與可用數量。

Set( Products,
    Table(
        { Product: "Widget",    'Quantity Requested': 6,  'Quantity Available': 3 },
        { Product: "Gadget",    'Quantity Requested': 10, 'Quantity Available': 20 },
        { Product: "Gizmo",     'Quantity Requested': 4,  'Quantity Available': 11 },
        { Product: "Apparatus", 'Quantity Requested': 7,  'Quantity Available': 6 }
    )
)

為了判斷這些產品中是否有需求量超過現有需求:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Filter 的第一個引數為操作所在之記錄資料表,而第二個引數為公式。 Filter 會建立一個記錄範圍,用於評估此公式,其中每筆記錄的欄位均可用,在此情況下,指的是 產品、要求量和可用數量。 比較的結果會判定函式結果中是否應該包含每一筆記錄︰

篩選產品表格截圖,請求數量超過可用數量。

補充這個例子,你可以計算每種產品要訂購多少:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

這裡你要在結果中加入一個計算過的欄位。 AddColumns 有自己的記錄範圍,用來計算請求內容與可用資料之間的差異。

新增「訂單數量」計算欄位後,產品表的截圖。

最後,你可以將結果表縮減為只包含你想要的欄位:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

結果表的截圖,只有產品和訂單數量欄位。

請注意,在前面的例子中,有些地方使用雙引號(「),其他地方則使用單引號(')。 當參考物件的值時,例如欄位或資料表,且物件名稱包含空格,則必須使用單引號。 當你不是在參考物件的值,而是在談論它時,特別是在物件尚未存在的情況下,例如像 AddColumns 的情況,請使用雙引號。

消除歧義

你用記錄範圍新增的欄位名稱會覆蓋應用程式其他地方的相同名稱。 當此覆蓋發生時,你仍可透過消@歧義運算子從記錄範圍外存取值:

  • 要從巢狀記錄範圍存取值,請使用 @ 帶有你所操作資料表名稱的運算子,遵循以下模式:
    Table[@FieldName]
  • 若要存取全域值 (例如資料來源、集合和內容變數),請使用模式 [@ObjectName] (不含資料表指定)。

如果你操作的表格是一個表達式,例如 Filter(Table, ...) ,你不能使用消歧義運算子。 只有最內層的記錄範圍能透過不使用消歧義運算子,從此表表達式存取欄位。

舉例來說,假設你有一個集合 X:

X 集合包含 1 和 2 的截圖。

您可以使用 ClearCollect( X, [1, 2] ) 建立此集合。

還有另一個集合 Y:

包含 A 和 B 值的 Y 集合截圖。

您可以使用 ClearCollect(Y, [“A”, “B”] ) 來建立此集合。

此外,使用此公式:UpdateContext( {Value: "!"}),定義名為 Value 的 context 變數

總而言之, 在此內容中,下列公式︰

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

會產生此資料表︰

巢狀 ForAll 結果的截圖,結合了 X、Y 和全域值項目。

這其中發生了什麼狀況? 最外層的 ForAll 函式定義了 X 的記錄範圍,因此你可以在每筆記錄處理時存取其 Value 欄位。 您可以直接使用「 Value 」一詞或使用 X[@Value]。

最內層的 ForAll 函數為 Y 定義了另一個記錄範圍。由於此表中也定義了 Value 欄位,這裡的 Value 指的是 Y 記錄中的欄位,而非 X 的欄位。要存取 X 的 Value 欄位,必須使用帶有消歧義運算子的較長版本。

由於 Y 是最內側的記錄範圍,存取此表欄位不需要消歧義,因此你可以用這個公式得到相同的結果:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

所有的 ForAll 記錄範圍均會覆寫全域範圍。 你定義的 Value 上下文變數如果沒有消歧義運算子,名稱就無法提供。 若要存取此值,請使用 [@Value]。

Ungroup 會壓平合併結果,因為巢狀的 ForAll 函式將產生巢狀結果資料表。

單一資料行表格

若要從資料表中執行單一資料行,請使用 ShowColumns 函式,如此範例所示:

ShowColumns( Products, "Product" )

此公式會產生這個單一資料行資料表:

單欄資料表的截圖,包含產品值。

若需要較短的替代選項,請指定 Table.Column,這會只提取資料表中的資料行,形成單一資料行資料表。 例如,此公式所產生的結果與使用 ShowColumns 完全相同 。

Products.Product

內嵌記錄

您可以使用包含具名欄位值的大括號來表示記錄。 例如,您可以使用此公式,表示本主題開頭表格中的第一筆記錄︰

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

您也可以使用其他公式內嵌公式,如下列範例所示︰

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

您可以使用巢狀大括號建立巢狀記錄,如下列範例所示︰

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

以單引號括住每個包含特殊字元 (例如空格或冒號)的資料行名稱。 若要在資料行名稱內使用單引號,請按兩下。

請注意,價格資料行中的值不包括貨幣符號,例如美元符號。 該格式會在顯示值時套用。

嵌入式表格

您可以使用 Table 函式和一組記錄建立資料表。 您可以使用下列公式,表示本主題開頭的表格︰

Table( 
   { Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
   { Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
   { Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

您也可以建立巢狀表格︰

Table( 
   { Name: "Chocolate", 
     'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
                                { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
   }
)

嵌入值表格

您可以透過在方括號中指定值,來建立單一資料行表格。 產生的資料表具有單一資料行,名為值。

例如,[ 1, 2, 3, 4 ] 等同於 Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) 並傳回此資料表:

包含數字 1 到 4 的內嵌值表截圖。