如果您使用其他的程式設計工具,例如 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 中最簡單好用的變數是全域變數。

全域變數如何運作:

  • Set 函式設定全域變數值。 Set( MyVar, 1 ) 將全域變數 MyVar 的值設為 1
  • 您可以參照與 Set 函式搭配使用的名稱來使用全域變數。 在此情況下,MyVar 會回到 1
  • 全域變數可以保留任何值,包括字串、數字、記錄和資料表

讓我們使用全域變數來重建加法器︰

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

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

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

    Set( RunningTotal, RunningTotal + Text1 )

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

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

    Set( RunningTotal, 0 )

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

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

  6. 預覽應用程式,我們會有如上所述的加法器。 在文字方塊中輸入數字,然後按 [新增] 按鈕幾次。 準備就緒時,使用 Esc 鍵返回撰寫體驗。

  7. 若要查看全域變數的值,選取 [檔案] 功能表,然後在左側窗格中選取 [變數]。

  8. 若要查看變數定義及使用的所有位置,請選取變數。

變數類型

PowerApps 中有三種變數類型:

變數類型 範圍 說明 Functions
全域變數 應用程式 最簡單好用。 保留數字、文字字串、布林值、記錄、資料表等,可以在應用程式中的任何位置參考。 Set
內容變數 畫面 很適合用於將值傳遞至畫面,如同其他語言中的參數至程序。 只能從一個畫面參考。 UpdateContext
Navigate
集合 應用程式 保留資料表,可以在應用程式中的任何位置參考。 允許修改資料表的內容,而不是設定為一個整體。 可以儲存至本機裝置,以供稍後使用。 Collect
ClearCollect
Patch
Update
Remove
SaveData
LoadData
等等。

所有變數會在用於 SetUpdateContextNavigateCollect 函式中時隱含建立。 變數沒有明確宣告,與其他程式設計工具不同。 變數的類型也會隱含衍生自置於其中的值。

應用程式執行時,所有變數會保留在記憶體中。 應用程式關閉後,保留在變數中的值將會遺失。 您可以使用 PatchCollect 函式將變數內容儲存在資料來源中,或者如果是集合,您可以使用 SaveData 函式儲存至本機裝置。 第一次載入應用程式時,所有變數都具有空白值。

使用變數名稱讀取其值。 例如,一旦以 Set( MyColor, Red ) 定義,您可以直接在任何可使用色彩值的位置使用 MyVar,它將會被取代為紅色。 有可能全域變數或集合會與內容變數具有相同的名稱。 在此情況下,內容變數優先。 您仍然可以使用去除混淆運算子 @[MyColor] 來參考全域變數或集合。

建立內容變數

讓我們看看如何使用內容變數 (而非全域變數) 來建立加法器。

內容變數的運作方式︰

  • 您使用 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. 預覽應用程式,我們會有如上所述的加法器。 在文字方塊中輸入數字,然後按 [新增] 按鈕幾次。 準備就緒時,使用 Esc 鍵返回撰寫體驗。

  7. 巡覽至畫面時,可以設定內容變數的值。 這適用於將「內容」或「參數」從一個畫面傳遞至另一畫面。 若要查看,請插入新畫面,然後插入按鈕,其 OnSelect 屬性設定為:

    Navigate( Screen1, None, { RunningTotal: -1000 } )

    Screen2 上選取此按鈕 (可在撰寫時執行,只要朝末端選取按鈕即可) 會顯示 Screen1,並將內容變數 RunningTotal 設定為 -1000。

  8. 若要查看內容變數的值,選取 [檔案] 功能表,然後在左側窗格中選取 [變數]。

  9. 若要查看內容變數定義及使用的位置,請選取它。

建立集合

最後,讓我們看看以集合建立加法器的方式。 由於集合會保存可以輕鬆修改的資料表,我們會讓加法器在輸入值時保留每個值的「紙帶」。

集合的運作方式︰

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

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

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

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

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

    Collect( PaperTape, TextInput1.Text )

    此公式會將新值新增至集合結尾。 由於我們要新增單一值,Collect 會自動將它放在單一資料行資料表中,該資料行名稱為 Value,稍後會使用到。

  4. 若要在使用者選取 [清除] 按鈕時清除紙帶,將其 OnSelect 屬性設為以下公式︰

    Clear( PaperTape )

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

    Sum( PaperTape, Value )

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

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

  8. 若要顯示紙帶,請插入資料表控制項,並將其 Items 屬性設為以下公式:

    PaperTape

    您也必須選取要顯示在右側窗格的資料行,在案例中請顯示 Value 資料行:

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

  10. 若要儲存和擷取集合,請新增兩個額外的按鈕控制項,並將其文字設為 LoadSave。 針對 Load,將 OnSelect 屬性設為︰

    Clear( PaperTape ); LoadData( PaperTape, "StoredPaperTape", true )

    我們需先清除集合,因 LoadData 會將儲存值附加至集合結尾。

  11. 針對 Save,將 OnSelect 屬性設為︰

    SaveData( PaperTape, "StoredPaperTape" )

  12. 按 F5 鍵再次預覽,在文字輸入控制項中輸入數字,並選取按鈕。 選取 [儲存] 按鈕。 關閉並重新載入應用程式,然後選取 [載入] 按鈕以重新載入集合。

    注意:SaveDataLoadData 在網頁瀏覽器中執行時不會作用,您必須使用安裝在 Windows 上的 studio 或行動裝置的其中一個播放程式。