如果您使用其他的程式設計工具,例如 Visual Basic 或 JavaScript,您可能會問︰變數在哪裡? PowerApps 有點不同,而且需要不同的方法。 並非觸達變數,而是問自己︰我會在 Excel 中做什麼?

在其他工具中,您可能會明確執行計算,並在變數中儲存結果。 不過,PowerApps 和 Excel 都會隨著輸入資料變更而自動重新計算公式,因此您通常不需要建立和更新變數。 透過這種方式,可能的話,您可以更輕鬆地建立、了解和維護您的應用程式。

在某些情況下,您必須在 PowerApps 中使用變數,這會新增行為公式來擴充 Excel 的模型。 例如,當使用者選取一個按鈕時,就會執行這些公式。 在行為公式內,設定要在其他公式中使用的變數通常很有用。

一般而言,避免使用變數。 但有時候,只有一個變數可以啟用您想要的體驗。

將 Excel 轉譯至 PowerApps

Excel

讓我們來檢視 Excel 的運作方式。 資料格可以包含值,例如數字或字串,或根據其他資料格的值之公式。 使用者在儲存格中輸入不同的值之後,Excel 會依新值的任何公式自動重新計算。 您不必進行任何程式設計以啟用這項行為。

Excel 沒有變數。 包含公式的資料格值會依據其輸入而變更,但沒有任何方法可記住公式的結果,並將它儲存在儲存格中或任何地方。 如果您變更儲存格的值,可能會變更整個試算表,且會遺失任何先前計算的值。 Excel 使用者可以複製並貼上資料格,但會在使用者的手動控制之下進行,而且不可能有公式。

PowerApps

您在 PowerApps 中建立的應用程式行為非常類似 Excel。 並非更新資料格,您可以在螢幕上想要的任何位置新增控制項,並將它們命名以在公式中使用。

例如,您可以藉由新增名為 TextBox1標籤控制項,以及兩個名為 TextInput1TextInput2文字輸入控制項來複寫應用程式中的 Excel 行為。 如果您接著將 TextBox1Text 屬性設定為 TextInput1 + TextInput2,一律會自動顯示 TextInput1TextInput2 中的數字總和 (無論數字為何)。

請注意,已選取 TextBox1 控制項,在螢幕頂端的公式列中顯示其文字公式。 我們在這裡找到公式 TextInput1 + TextInput2。 就像在 Excel 活頁簿中的儲存格之間建立相依性,這個公式會建立這些控制項之間的相依性。 讓我們變更 TextInput1 的值:

TextBox1 的公式已自動重新計算,顯示新的值。

在 PowerApps 中,您使用公式不只可以判斷控制項的主要值,還有格式化等屬性。 在下一個範例中,標籤之 Color 屬性的公式會自動以紅色顯示負數的值。 If 函式從 Excel 看起來應該很熟悉:
If( Value(TextBox1.Text) < 0, Red, Black )

現在,如果在 TextBox1.Text 中我們的計算結果是負數,數字會以紅色顯示︰

您可以在多種情況下使用公式:

  • 藉由使用裝置的 GPS,地圖控制項可以透過使用 Location.LatitudeLocation.Longitude 的公式來顯示您目前的位置。 當您移動時,地圖會自動追蹤您的位置。
  • 其他使用者可以更新資料來源。 例如,小組的其他人可能會更新 SharePoint 清單中的項目。 當您重新整理資料來源時,會自動重新計算任何相依的公式以反映更新的資料。 進一步的範例,您可以將資源庫的 Items 屬性設定為公式 Filter( SharePointList ),它會自動顯示新篩選的記錄集

權益

使用公式來建置應用程式有許多優點︰

  • 如果您會使用 Excel,便會使用 PowerApps。 模型和公式語言都相同。
  • 如果您使用過其他的程式設計工具,想一想需要多少程式碼才能完成這些範例。 在 Visual Basic 中,您必須在每個文字輸入控制項上撰寫變更事件的事件處理常式。 要在這之中每一個執行計算的程式碼是多餘的,且可能會不同步,或是您必須撰寫一個常見的副程式。 在 PowerApps 中,您可以使用單一行的公式來您完成所有的工作。
  • 若要了解 TextBox1 的文字來自何處,您完全清楚要從哪些地方查詢︰Text 屬性的公式。 沒有其他方法可影響此控制項的文字。 在傳統程式設計工具中,任何事件處理常式或副程式皆可能從程式中任何地方變更標籤的值。 這會使變數的變更時機和位置難以追蹤。
  • 如果使用者變更滑桿控制項,然後改變心意,他們可以將滑桿變更移回其原始值。 且如同沒有任何變更︰應用程式會和以前一樣顯示相同的控制項值。 實驗沒有後續發展,並詢問「假設」,如同在 Excel 中沒有一樣。

一般而言,如果您可以使用公式來達成效果,您會比較理想。 讓 PowerApps 中的公式引擎為您工作。

知道何時要使用變數

讓我們變更我們簡單的新增項目以便如同舊式加法器般運作,具有計算加總。 如果您選取 [新增] 按鈕,您會將數字加入計算加總。 如果您選取 [清除] 按鈕,您會將計算加總重設為零。

我們的加法器會使用 Excel 中不存在的項目︰按鈕。 在此應用程式中,您無法僅使用公式來計算加總,因為它的值取決於一系列使用者採取的動作。 相反地,我們必須以手動方式記錄並更新計算加總。 大部分的程式設計工具會將此資訊儲存於變數。

有時候,您的應用程式將需要變數進行您想要的行為。 但此方法需要注意的事項︰

  • 您必須手動更新的計算加總。 自動重新計算不會為您這麼做。
  • 計算加總無法再根據其他控制項的值計算。 這取決於使用者選取 [新增] 按鈕的次數,以及每次在文字輸入控制項中的值。 使用者輸入 77 並選取 [新增] 兩次,還是針對每個新增項目指定 24 以及 130? 總計達到 154 後,您便無法區分其間的差異。
  • 總計的變更可能來自不同的路徑。 在此範例中,[新增] 和 [清除] 按鈕皆可以更新總數。 如果應用程式的行為並未如您預期,哪一個按鈕會造成問題?

建立內容變數

若要建立我們的加法器,我們需要一個變數來保存計算加總。 在 PowerApps 中最簡單的變數是內容變數。

內容變數的運作方式︰

  • 您使用 UpdateContext函式建立並設定內容變數。 如果第一次更新時內容變數尚未存在,就會以空白預設值來建立。
  • 您可以使用記錄來建立和更新內容變數。 在其他的程式設計工具,您通常使用 "=" 來指派,如 "x = 1"。 針對內容變數,改為使用 {x: 1}。 當您使用內容變數時,請直接使用它的名稱。
  • 當螢幕顯示時,您也可以使用 Navigate 函式來設定內容變數。 如果您將螢幕視為一種程序或副程式,這類似於其他程式設計工具中傳遞的參數。
  • 除了 Navigate,內容變數僅限於單一畫面的內容,也就是他們取得其名稱之處。 您無法在此內容之外使用或設定它們。
  • 內容變數可以保留任何值,包括字串、數字、記錄和資料表
  • 當使用者關閉應用程式時,會遺失其所有內容變數。

讓我們使用內容變數來重建我們的加法器︰

  1. 新增名為 TextInput1 的文字輸入控制項,和名為 Button1Button2 的兩個按鈕。

  2. Button1Text 屬性設為 "Add",並將 Button2Text 屬性設為 "Clear"

  3. 每當使用者選取 [新增] 按鈕時若要更新計算加總,將其 OnSelect 屬性設為以下公式︰
    UpdateContext( { RunningTotal: RunningTotal + Text1 } ).

    使用者第一次選取 [新增] 按鈕且呼叫 UpdateContext 時,會建立RunningTotal 與空白的預設值。 此外,它將會視為零。

  4. 每當使用者選取 [清除] 按鈕時若要將計算加總設為 0,將其 OnSelect 屬性設為以下公式︰
    UpdateContext( { RunningTotal: 0 } )

    同樣地,UpdateContext 會與 UpdateContext( { RunningTotal: 0 } ) 公式搭配使用。

  5. 新增標籤控制項,並將其 Text 屬性設定為 RunningTotal

    此公式會自動重新計算,並會在其根據使用者選取的按鈕變更時,為使用者顯示 RunningTotal 的值。

  6. 預覽應用程式,我們會有如上所述的加法器。

建立集合

若要從任何畫面 (不只在其中建立的變數) 參考變數,使用集合來保存全域變數。

集合的運作方式︰

  • 使用 ClearCollect 函式來建立和設定集合。 您可以改為使用 Collect 函式,但它實際上需要另一個變數,而不是取代舊的變數。
  • 集合是資料來源,因此是資料表。 若要存取集合中的單一值,請使用 First 函式,然後從產生的記錄中擷取一個欄位。 如果您使用了單一值與 ClearCollect,這會是 Value 欄位,如此範例所示︰
    First( VariableName ).Value
  • 任何公式可以從應用程式中的任何畫面存取集合。
  • 當使用者關閉應用程式時,會清空所有其集合。

讓我們使用集合重新建立我們的加法器︰

  1. 新增名為 TextInput1文字輸入控制項,和名為 Button1Button2 的兩個按鈕。

  2. Button1Text 屬性設為 "Add",並將 Button2Text 屬性設為 "Clear"

  3. 每當使用者選取 [新增] 按鈕時若要更新計算加總,將其 OnSelect 屬性設為以下公式︰
    ClearCollect( RunningTotal, First( RunningTotal ).Value + TextInput1 )

    使用 ClearCollect 與單一值,會在集合中建立一筆記錄與單一欄位。 使用者第一次選取 [新增] 按鈕且呼叫 ClearCollect 時,RunningTotal將為空白。 此外,First會傳回空白且會視為零。

  4. 每當使用者選取 [清除] 按鈕時若要將計算加總設為 0,將其 OnSelect 屬性設為以下公式︰
    ClearCollect( RunningTotal, 0 )

    同樣地,ClearCollect 會搭配使用 ClearCollect( RunningTotal, 0 ) 公式。

  5. 若要顯示計算加總,請新增標籤,並將其 Text 屬性設定為下列公式:
    First(RunningTotal).Value

    此公式會擷取 RunningTotal 集合第一個記錄的欄位。 標籤會在其根據使用者選取的按鈕變更時自動顯示 RunningTotal 的值。

  6. 若要執行加法器,請按下 F5 鍵開啟 [預覽],並在文字輸入控制項中輸入數字,然後選取按鈕。

  7. 若要返回預設工作區,請按下 Esc 鍵。

  8. 若要查看您集合中的值,請選取 [檔案] 功能表上的 [集合]。