重點一句話
嗯⋯⋯Google 表單本身,沒辦法直接生出報名序號。 一定要搭配試算表,然後寫一點點 Google Apps Script 才能做到。 或是用外掛,但腳本彈性比較大。
為什麼需要報名序號?
一開始用表單,只是收個資料,覺得很方便。但人一多,事情就亂了。沒有編號,名單對不起來,回覆問題也很麻煩。「你是哪一位?」要問半天。有編號,一切就清楚多了。就像是每個報名者都有自己的身分證字號,好管理,也好溝通。
特別是辦活動,現場報到,有編號速度快很多。不然一個個核對名字,人多就塞住了。所以,多這一步,後面省很多事。這是我踩過坑之後的感想。
實作指引:用 Apps Script 自動產生流水號
好了,來做正事。整個流程不難,就是有點繁瑣。一步一步來。
第一步:建立表單和試算表
這個很基本。建立一個 Google 表單,設計好你要的問題,像是姓名、Email。然後到「回覆」分頁,點綠色的試算表圖示,「建立新試算表」。這樣,所有回覆就會自動存到那張試算表裡。
第二步:在試算表中新增「報名序號」欄位
打開剛剛連結的試算表。你會看到第一欄是「時間戳記」。在「時間戳記」欄(A欄)的前面,按右鍵插入一個新欄位。把這個新欄位的標題,也就是 A1 儲存格,命名為「報名序號」。 這是我們要用程式填入編號的地方。
第三步:打開 Apps Script 編輯器
在試算表的上方選單,找到「擴充功能」 > 「Apps Script」。 點下去,會開一個新的分頁,就是程式碼編輯器了。把裡面預設的程式碼都刪掉。
第四步:貼上程式碼
把下面這段程式碼,完整複製貼到編輯器裡。這段程式碼的作用是,每次有新回覆進來,它會去看現在是第幾筆資料,然後把「行數減一」當作編號填進去。
function generateSerialNumber(e) {
// 使用 <a href="https://developers.google.com/apps-script/reference/lock/lock-service" target="_blank" class="blogHightLight_css nobox">LockService</a> 避免多人同時提交時出錯
var lock = LockService.getScriptLock();
// 等待最多 30 秒
lock.waitLock(30000);
try {
// 取得正在使用的試算表和工作表
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('表單回應 1'); // 注意:這裡的 '表單回應 1' 要換成你自己的工作表名稱
// 取得最後一筆資料的列數
var lastRow = sheet.getLastRow();
// 檢查該列的編號欄是否已經有值
var serialNumber = sheet.getRange(lastRow, 1).getValue();
if (serialNumber === "") {
// 產生編號,格式為 "EVT2025-" + 三位數流水號
var newSerialNumber = "EVT2025-" + Utilities.formatString("%03d", lastRow - 1);
// 將新編號寫入第一欄
sheet.getRange(lastRow, 1).setValue(newSerialNumber);
}
} finally {
// 釋放鎖定,讓下一個提交可以執行
lock.releaseLock();
}
}
程式碼說明: 這段程式碼比最陽春的版本多了一個 `LockService`。 這是為了防止短時間內有多人同時提交表單,造成程式搶著寫入,結果編號重複或遺失的問題。 它會先「鎖住」執行權,處理完一筆再換下一筆。
第五步:設定觸發條件
程式碼寫好了,還要告訴 Google 什麼時候要執行它。在 Apps Script 編輯器的左邊,點那個鬧鐘圖示的「觸發條件」。
- 點右下角的「+ 新增觸發條件」。
- 「要執行的功能」選擇我們剛剛寫的 `generateSerialNumber`。
- 「選取活動的來源」維持「來自試算表」。
- 「選取活動類型」要改成「提交表單時」。
- 點「儲存」。
這時候 Google 會要求你授權,問你同不同意這個程式讀寫你的試算表。 就一直按「允許」就對了。設定好之後,就大功告成了。你可以自己去填一次表單,看看試算表的第一欄是不是自動出現了編號。
情境變體:自訂你的編號格式
很多人不滿足於單純的 1, 2, 3。可能想要像 `EVENT2025-001` 這種格式。 這也很簡單,只要修改程式碼的一行就好。
找到這一行:
`var newSerialNumber = "EVT2025-" + Utilities.formatString("%03d", lastRow - 1);`
這裡的 `"EVT2025-"` 就是你的前綴文字,可以隨意改。`%03d` 的意思是,把數字格式化成三位數,不足的前面補 0。 例如,第 5 筆資料會是 `005`,第 12 筆是 `012`,第 100 筆是 `100`。你可以改成 `%04d` 變成四位數,以此類推。這樣編號看起來就專業多了。
限制與替代方案
用 Apps Script 雖然強大,但也不是萬能。有幾個限制和替代方案要想一下。
執行限制:Google Apps Script 有每日的執行配額。如果你是辦超大型活動,一天有幾萬人報名,可能會撞到天花板。但對絕大多數中小活動來說,這都不是問題。
程式碼維護:如果完全不懂程式,未來 Google Apps Script 有改版,或是你需要更複雜的功能,可能會不知道怎麼辦。這是它的門檻。
替代方案:
- 外掛程式 (Add-ons): 試算表有很多現成的外掛,例如 CopyDown 或其他類似工具,可以做到自動編號,不用寫程式。 優點是簡單,缺點是彈性低,而且有些進階功能要付費。
- 試算表公式: 對於最簡單的需求,也可以用 `SEQUENCE()` 或 `ROW()` 這類公式來產生流水號。 但它的問題是,如果手動去刪除或排序某些列,編號就會亂掉,不像 Apps Script 是在提交當下就寫死,比較可靠。
| 方法 | 優點 | 缺點 | 適合情境 |
|---|---|---|---|
| 手動編號 | 最直覺,不用學任何東西。 | 累。人一多就容易出錯、重複、漏掉。 | 報名人數大概...20 人以下吧。 |
| 試算表公式 | 設定一次就好,比手動快。 | 只要動到排序或刪除列,編號就亂了。 很不可靠。 | 只需要「暫時」看到順序,不在乎編號固定的場合。 |
| Apps Script | 最可靠,一勞永逸。格式彈性超高,還能加鎖定機制。 | 要碰一點程式碼。設定要花幾分鐘。 | 所有正規的報名活動。辦活動不想出包,就用這個。 |
常見錯誤與修正
設定過程中,可能會遇到一些問題。這裡列幾個常見的。
- 權限問題:執行或儲存觸發器時,跳出一堆「需要授權」的視窗。不要怕,這是正常的。因為你的程式碼需要權限去讀寫你的試算表,一定要按「進階」,然後「允許」。
- 工作表名稱錯誤:程式碼裡的 `getSheetByName('表單回應 1')`,那個 `'表單回應 1'` 必須跟你試算表底下分頁的名稱「完全一樣」。 很多人預設是英文的 `Form Responses 1`,或是自己改了名字,結果程式就找不到地方寫入。
- 觸發器沒設定好:忘了設定觸發器,或是活動類型選錯(例如選成「編輯時」),都會讓程式不動。 一定要確定是「提交表單時」。
- 編號沒出現:可以到 Apps Script 的「執行作業」看一下紀錄。如果顯示錯誤,通常會提示哪一行出問題。最大的可能還是工作表名稱錯了,或是你把程式碼貼錯位置。
嗯⋯⋯大致上就是這樣。看起來步驟多,但其實照著做一次,大概十分鐘就搞定了。以後所有表單都能用這個方法,很值得投資這點時間。
你還遇過什麼 Google 表單的特殊需求?或是有更聰明的編號方法嗎?留言分享一下吧。
