Google表單報名序號設定教學:自動編號功能與流水號產生方法

Published on: | Last updated:

重點一句話

嗯⋯⋯Google 表單本身,沒辦法直接生出報名序號。 一定要搭配試算表,然後寫一點點 Google Apps Script 才能做到。 或是用外掛,但腳本彈性比較大。

為什麼需要報名序號?

一開始用表單,只是收個資料,覺得很方便。但人一多,事情就亂了。沒有編號,名單對不起來,回覆問題也很麻煩。「你是哪一位?」要問半天。有編號,一切就清楚多了。就像是每個報名者都有自己的身分證字號,好管理,也好溝通。

特別是辦活動,現場報到,有編號速度快很多。不然一個個核對名字,人多就塞住了。所以,多這一步,後面省很多事。這是我踩過坑之後的感想。

報名資料處理流程示意圖
報名資料處理流程示意圖

實作指引:用 Apps Script 自動產生流水號

好了,來做正事。整個流程不難,就是有點繁瑣。一步一步來。

第一步:建立表單和試算表

這個很基本。建立一個 Google 表單,設計好你要的問題,像是姓名、Email。然後到「回覆」分頁,點綠色的試算表圖示,「建立新試算表」。這樣,所有回覆就會自動存到那張試算表裡。

第二步:在試算表中新增「報名序號」欄位

打開剛剛連結的試算表。你會看到第一欄是「時間戳記」。在「時間戳記」欄(A欄)的前面,按右鍵插入一個新欄位。把這個新欄位的標題,也就是 A1 儲存格,命名為「報名序號」。 這是我們要用程式填入編號的地方。

第三步:打開 Apps Script 編輯器

在試算表的上方選單,找到「擴充功能」 > 「Apps Script」。 點下去,會開一個新的分頁,就是程式碼編輯器了。把裡面預設的程式碼都刪掉。

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 編輯器的左邊,點那個鬧鐘圖示的「觸發條件」。

  1. 點右下角的「+ 新增觸發條件」。
  2. 「要執行的功能」選擇我們剛剛寫的 `generateSerialNumber`。
  3. 「選取活動的來源」維持「來自試算表」。
  4. 「選取活動類型」要改成「提交表單時」。
  5. 點「儲存」。

這時候 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 表單的特殊需求?或是有更聰明的編號方法嗎?留言分享一下吧。

Related to this topic:

Comments

  1. Guest 2025-10-15 Reply
    我上學期剛好被抓去弄一個活動報名,主要就是那種Google表單丟出去收回來、還有要發序號給大家。剛開始覺得超順手,用免費工具真的是一大救星,完全不需要自己搞什麼後台、不用管資料庫,要填什麼內容就拉進表單裡,很快很爽。結果 - 等到300多份報名通通炸過來的時候才知道慘了,原來Google表單沒有順序碼這件事大家都沒想到啊。加上有人重複填報,有人亂刪資料(對,就是我隊友手抖),整堆東西突然失控,我腦袋也跟著爆掉。 講真的,我中途有想靠App Script來自動生成流水編號,那技術門檻真的不低耶!找老師幫忙結果他聽我們講哪裡卡死也是滿臉問號;團隊還有同學連腳本在哪打都找不到……那陣子我們只好乖乖人工對表、自己排號碼,盯螢幕看到晚上十點多眼睛都脫窗。外掛?當然考慮過,但又怕萬一個資跑掉或外掛掛點要負責超麻煩,所以猶豫了半天最後沒裝。 還遇到一件超傻眼的事 - 有人假冒別人拿了好多份序號,我們只好又寄信給他們驗證身分、確認誰才是真的,很煩。其實你說Google如果乾脆直接內建簡易流水碼或核銷功能,我覺得很多像我們這種小組織應該就不會這麼頭大吧?雖然整件事不是最完美結尾,可是起碼危機處理的經驗直接練到了。總之真的很印象深刻,還滿想知道大家都是怎麼撐過去的啦……
撥打專線 LINE免費通話