Google表單回覆序號設定教學:自動編號功能與常見問題排除

Published on: | Last updated:

先說結論

嗯…Google 表單本身,沒有內建那種「自動產生流水號」的功能。對,就是沒有。所以我們得自己想辦法繞過去。 最常見、也最穩的,大概就是用 Google Apps Script,寫一小段程式碼去處理。

很多人會想找外掛,但老實說,外掛有時候更新一慢、或跟其他東西衝突,反而更麻煩。 所以…嗯,還是學一下怎麼用 Apps Script 吧,沒有想像中那麼難。

大家常遇到的坑,但教學很少提

我看過很多教學,大部分就是給你一段程式碼,然後…就沒了。 但他們很少講,如果手動刪掉試算表裡的一筆資料,會發生什麼事? 答案是,序號可能會亂掉、甚至重複。這超麻煩的。

還有就是,如果很多人在同一時間瞬間填寫表單,腳本的執行順序可能會打架,造成編號重複。 這些都是單純複製貼上程式碼解決不了的問題。

Google Apps Script 編輯器介面
Google Apps Script 編輯器介面

怎麼做:最穩的 Apps Script 方法

好,我們直接來看怎麼設定。我假設你已經有表單、也連到 Google Sheet 了。

  1. 打開試算表,新增一個欄位:在最左邊,通常是時間戳記的A欄旁邊,按右鍵插入一欄,名字就叫「報名序號」之類的。
  2. 進到指令碼編輯器:在上面選單找「擴充功能」 > 「Apps Script」。
  3. 貼上程式碼:把下面這段…嗯…算是比較保險的程式碼貼進去。它會去讀取最後一筆資料的編號,然後加一。
function onFormSubmit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('表單回應 1'); // 這邊要換成你的工作表名稱
  var lastRow = sheet.getLastRow();
  
  // 檢查是不是第一筆資料 (標題列不算)
  if (lastRow <= 2) {
    sheet.getRange(lastRow, 1).setValue(1); // 如果是第一筆,就填 1
  } else {
    // 取得前一筆的序號
    var previousSerialNumber = sheet.getRange(lastRow - 1, 1).getValue();
    if (typeof previousSerialNumber === 'number') {
      sheet.getRange(lastrow, 1).setValue(previousSerialNumber + 1);
    } else {
      // 如果前一筆不是數字,就從頭算,這是一種保險機制
      var dataRange = sheet.getRange("A2:A" + (lastRow - 1));
      var values = dataRange.getValues();
      var maxNum = 0;
      for (var i = 0; i < values.length; i++) {
        if (typeof values[i] === 'number' && values[i] > maxNum) {
          maxNum = values[i];
        }
      }
      sheet.getRange(lastRow, 1).setValue(maxNum + 1);
    }
  }
}
  1. 設定觸發條件:在 Apps Script 編輯器左邊,點那個鬧鐘圖示(觸發條件)。 新增一個觸發條件,選 `onFormSubmit` 這個函式,事件來源選「來自試算表」,事件類型選「提交表單時」。 然後儲存。

這樣…理論上就好了。每次有人填表單,這個 script 就會被叫起來跑一次。

不同方法的比較…嗯…思考一下

其實不只一種方法啦,但各有優缺點。

方法 優點 缺點 / 麻煩的點
Google Apps Script 彈性最大,可以自己加各種規則,比如「訂單-2025-001」這種格式。 要懂一點點程式邏輯。而且…如果寫得不好,遇到大量資料或刪除列時,就…嗯,會出錯。
試算表公式 最簡單,不用寫程式。用 `SEQUENCE` 或 `ROW` 函數就可以。 只要有人排序、篩選或刪除列,整個編號就亂掉了。 基本上…只適合那種資料填進來後,就不會再動的場合。
第三方外掛 (Add-on) 設定很方便,點一點就好。 要嘛要付錢,要嘛就是有廣告。而且你不知道它什麼時候會停止更新,或是跟 Google 的更新不相容。 風險比較高。
Google Sheet 中成功產生序號的樣子
Google Sheet 中成功產生序號的樣子

限制與失敗:那些你可能會遇到的鳥事

好,來說說現實面。上面那個 script 雖然算穩,但也不是無敵的。

  • 刪除資料列的災難:如果你手動刪掉中間某一列,下次新增的序號會接續「被刪除前的最後一號」,這樣你的序號就不連續了。更糟的是,有些寫法會直接讀取前一格,導致序號重複。
  • 權限問題:第一次執行 script 時,Google 會跳出來要你授權。很多人看到一堆警告就嚇到,不敢按下去。 那是正常的,你必須同意它才能動你的試算表。
  • 觸發條件沒設好:有些人 script 貼上去了,卻忘了去設定「提交表單時」觸發,結果當然不會自動跑。
  • 格式化需求:如果你不只是要 `1, 2, 3`,而是要像 `ABC-001` 這種,那 script 就要寫得更複雜一點,需要處理字串和數字的轉換。

對了,說到這個…國外有些教學會推薦用 Zapier 或 Make 這種自動化工具來串接,它們也能做到。但在台灣,老實說,大部分人還是傾向直接用免費的 Apps Script 解決。畢竟只是個序號,還要多花一筆錢…感覺不太划算。

觸發條件設定錯誤的畫面
觸發條件設定錯誤的畫面

Related to this topic:

Comments

撥打專線 LINE免費通話