2025年12月13日 星期六

【Google教學】如何讓表單送出時,自動產生「民國日期+流水號」的編號?(使用 AI Studio 寫程式)

今天這篇教學要來解決一個很多人的痛點:當我們製作 Google 表單時,希望在表單送出後,Google 試算表(Sheets)能自動幫我們產生一組「民國日期 + 流水號」的編號。

例如:今天是民國 114 年 12 月 13 日,第一筆資料要是 1141213-0001,第二筆是 1141213-0002,以此類推。

以前要寫這種程式很頭痛,但現在有了 Google AI Studio,我們可以請 AI 幫我們寫 Google Apps Script (GAS),完全不用自己動腦!這篇文章也會順便分析為什麼推薦用 GAS 而不是 Excel 公式。


為什麼不用公式 (Formula) 就好?

很多人第一直覺是:「用 Excel 或 Google Sheets 的公式(如 COUNTIF 或 ArrayFormula)做流水號不就好了嗎?」

這裡有一個很嚴重的隱藏風險

  1. 刪除資料會導致編號亂掉: 如果你使用公式(例如 ROW() 或 COUNTIF),一旦你刪除中間某一行資料,下面的編號全部會重新計算。原本的 0005 號可能會變成 0004 號,這對於訂單或報名序號來說是災難。

  2. 新版表格的限制: Google Sheets 最近更新了「表格」功能,對於自動擴展的陣列公式支援度有些改變,可能會導致公式無法自動帶入新的一列。

結論: 想要產生「固定不變」的流水號(刪除資料也不會跑掉),唯一推薦使用 Google Apps Script (GAS)


實作步驟教學

第一步:準備 Google 表單與試算表

  1. 建立一個 Google 表單(例如包含姓名、備註)。

  2. 點擊「回應」並連結至 Google 試算表

  3. 打開連動的 Google 試算表,在原本的欄位中間(或最後面),插入一個新欄位,命名為「自動編號」。

    • 注意:請記住這個欄位是第幾欄(A=1, B=2, C=3...)。在本範例中,自動編號是在 C 欄(第 3 欄)。

第二步:利用 AI Studio 產生程式碼

我們不需要自己寫程式,直接去問 Google AI Studio。

  1. 前往 Google AI Studio

  2. 輸入以下提示詞(Prompt):

    我想要表單送出時,會自動在「自動編號」這一欄(C欄),依據時間戳記自動產生 1141213-0001 格式的編號。
    前面是民國日期,後面四碼是當日產生的流水號。請給我 Google Apps Script 的程式碼。

  3. AI 會告訴你邏輯,並給你一段完整的程式碼。它通常會建議使用 LOCK 機制來避免多人同時送出時編號重複的問題。

第三步:貼上 Google Apps Script

  1. 回到你的 Google 試算表。

  2. 點選上方選單的 「擴充功能」 -> 「Apps Script」

  3. 會跳出一個程式碼編輯器,將裡面原本的 myFunction 清空。

  4. 將剛剛 AI 給你的程式碼全部複製貼上

  5. 關鍵修改: 檢查程式碼中關於「欄位」的設定。如果 AI 寫的是第 1 欄,但你的自動編號在 C 欄,請將該數字改成 3

  6. 點擊上方的磁片圖示「儲存」,專案名稱可以取跟試算表一樣。

第四步:設定「觸發條件」 (最重要的一步!)

程式碼貼上去並不會自己動,我們必須告訴 Google:「當有人填寫表單時,要執行這段程式」。

  1. 在 Apps Script 左側選單,點擊一個像鬧鐘的圖示 「觸發條件」 (Triggers)

  2. 點擊右下角的 「新增觸發條件」

  3. 設定如下:

    • 執行功能: 選擇剛剛貼上的函數名稱(通常是 generateAutoID 之類的)。

    • 部署作業: 上端 (Head)。

    • 活動來源: 試算表 (From spreadsheet)。

    • 活動類型: 提交表單時 (On form submit) <--- 這一定要選對!

  4. 按「儲存」。

第五步:核對權限

儲存觸發條件時,Google 會跳出視窗要求授權:

  1. 選擇你的 Google 帳號。

  2. 可能會出現「Google 尚未驗證這個應用程式」的紅字警告(因為這是你自己寫的腳本)。

  3. 別擔心,點選左下角的 「進階 (Advanced)」

  4. 點選最下方的 「前往... (不安全)」

  5. 點選 「允許 (Allow)」


測試成果

  1. 回到你的 Google 表單預覽頁面。

  2. 隨便填寫一筆資料並送出。

  3. 回到 Google 試算表觀察。

  4. 你會發現,雖然表單原本沒有填寫編號,但在資料進來的瞬間,Script 會自動在 C 欄補上 1141213-0001

  5. 再送出第二筆,就會變成 1141213-0002

  6. 壓力測試: 試著刪除第一筆資料(0001號),你會發現第二筆資料依然維持 0002,不會因為前面被刪除而自動遞補變成 0001。這就是我们要的穩定流水號!


補充:如果堅持要用公式 (Formula) 怎麼做?

雖然不推薦,但如果你的資料永遠不會刪除,你可以直接在 Google 試算表的欄位中使用公式。

可以使用類似以下的邏輯(針對民國年與當日流水號):

Excel
==IF(A2="",, TEXT(YEAR(A2)-1911,"000") & TEXT(A2,"mmdd") & "-" & TEXT(COUNTIFS($A$2:A2, ">=" & INT(A2), $A$2:A2, "<" & INT(A2) + 1), "0000"))

(註:這是概念示意,實際公式需依照欄位 A 的時間戳記進行調整)

公式法的缺點再次提醒:
一旦你把中間的某一列刪除,所有的 COUNTIFS 計算都會改變,原本的編號就會全部亂跳。請務必小心使用。


總結

使用 Google AI Studio 搭配 Apps Script,我們可以輕鬆解決 Google 表單無法自動產生客製化流水號的問題。這個方法穩定、可靠,且具備真正的資料庫編號特性(不會隨意變動)。 



2025年12月12日 星期五

【AppSheet 教學】如何將 Virtual Column (虛擬欄位) 寫回 Google 試算表?以庫存管理為例

在使用 AppSheet 進行開發時,我們經常使用 Virtual Column (虛擬欄位) 來進行即時運算。例如在進銷存系統中,商品的「當前庫存」通常是由 SUM(進貨) 減去 SUM(銷貨) 動態計算出來的。

然而,Virtual Column 的值只存在於 AppSheet 的運算中,並不會實際寫入後端的 Google Sheets (或其他資料庫)。許多網友詢問:「如果要讓這個計算出來的庫存數字,實際寫回試算表該怎麼做?」

這篇文章將透過「事件驅動 (Event Action)」的方式,教你如何在進貨或銷貨時,自動將虛擬欄位的計算結果寫回實體欄位。


為什麼需要這樣做?

  1. 資料同步:希望 Google Sheet 上能直接看到最新的庫存數字,而不是只能在 App 裡看。

  2. 後續應用:試算表中的實體數據可以用於其他報表分析或與其他系統串接。

實作邏輯概覽

由於庫存的變化是發生在「進貨」或「銷貨」表單,而非直接修改「商品」資料表。因此流程如下:

  1. 在 商品表 建立一個將虛擬欄位數值複製到實體欄位的 Action

  2. 在 進貨/銷貨紀錄表 建立一個觸發器 Action,去驅動商品表的更新。

  3. 在 表單視圖 (Form View) 設定 Form Saved 事件,當資料儲存時自動執行上述動作。


步驟一:準備資料表欄位

首先,確保你的 Google Sheet 商品表中,有一個實體欄位用來存放庫存(例如命名為 實際庫存 或 Number)。

  • Virtual Column (庫存):AppSheet 內自動計算的欄位(藍色)。

  • 實體欄位 (實際庫存):Google Sheet 內真實存在的欄位,目前可能是空的或舊資料。


步驟二:建立「計算庫存」動作 (針對商品表)

我們要先告訴 AppSheet 如何把虛擬欄位的值「搬」到實體欄位。

  1. 進入 Behavior > Actions

  2. 點選 New Action

  3. Action Name:命名為「計算庫存」 (或 Update Inventory)。

  4. For a record of this table:選擇 商品表 (例如:一整天代賣商品)。

  5. Do this:選擇 Data: set the values of some columns in this row

  6. Set these columns

    • 左邊選擇實體欄位:實際庫存

    • 右邊填入虛擬欄位值:[庫存] (你的 Virtual Column 名稱)

  7. Appearance (外觀設定)

    • 建議將 Prominence 設為 Do not display

    • 原因:我們希望這是系統自動執行的,不需要使用者手動去按按鈕。


步驟三:建立「觸發」動作 (針對進貨/銷貨紀錄表)

接著,我們需要在進貨或銷貨發生時,去「呼叫」步驟二的動作。這裡以進貨為例 (銷貨的設定邏輯相同)。

  1. 進入 Behavior > Actions

  2. 點選 New Action

  3. Action Name:命名為「進貨事件」 (或 Trigger Inventory Update)。

  4. For a record of this table:選擇 進貨紀錄表 (例如:進貨紀錄)。

  5. Do this:選擇 Data: execute an action on a set of rows (對另一張表的一組資料執行動作)。

  6. Referenced Table:選擇 商品表 (因為我們要更新的是商品庫存)。

  7. Referenced Rows (最關鍵的一步):

    • 我們需要用公式找出「這一筆進貨是對應哪一個商品」。

    • 輸入公式:

      Appsheet
      SELECT(一整天代賣商品[編號], [編號] = [_THISROW].[編號])

      (語意:從商品表中,選出那個「商品編號」等於「這筆進貨紀錄商品編號」的那一列)

  8. Referenced Action:選擇步驟二建立的 「計算庫存」


步驟四:設定表單儲存後自動執行

最後,我們要將這個動作綁定在使用者填寫表單的行為上。

  1. 進入 UX > Views

  2. 找到進貨紀錄的 Form View (通常是 進貨紀錄_Form)。

    • 注意:如果你是透過關聯表單 (Inline View) 新增,請找到對應的 Inline Form View。

  3. 往下捲動找到 Behavior 設定區塊。

  4. 在 Event Actions > Form Saved (表單儲存時) 的選項中。

  5. 選擇步驟三建立的 「進貨事件」

  6. 按下 Save 儲存設定。


測試與驗證

  1. 在 App 中新增一筆進貨資料(例如:進貨數量 +1)。

  2. 儲存表單。

  3. 等待 App 同步完成。

  4. 驗證 App:查看商品列表,庫存數量應已更新。

  5. 驗證 Google Sheet:打開後台試算表,你會發現對應商品的「實際庫存」欄位,已經被寫入最新的計算結果了。

注意事項

  • 銷貨紀錄 也需要重複「步驟三」與「步驟四」,建立一個「銷貨事件」並綁定在銷貨表單上,這樣賣出商品時才會扣庫存。

  • 這種寫法是利用 AppSheet 前端的 Action 觸發,如果資料量非常大,可能會有些微的效能影響,但在一般庫存管理場景中非常實用。


希望這篇教學能幫助大家解決 Virtual Column 無法存回試算表的困擾! 



【Google教學】如何讓表單送出時,自動產生「民國日期+流水號」的編號?(使用 AI Studio 寫程式)

今天這篇教學要來解決一個很多人的痛點: 當我們製作 Google 表單時,希望在表單送出後,Google 試算表(Sheets)能自動幫我們產生一組「民國日期 + 流水號」的編號。 例如:今天是民國 114 年 12 月 13 日,第一筆資料要是  1141213-0001 ,第...