接收端與試算表表頭的欄位同步:payload 新增欄位的對照、doPost 的改法與重新部署
接收端與試算表表頭的欄位同步:payload 新增欄位的對照、doPost 的改法與重新部署
本模組的訪客識別、事件模型與自動化流量辨識三篇實作,都在前端的 payload 上加欄位,而接收端與試算表表頭不會自己跟著長。模組二的 doPost 是一個寫死的五欄陣列,新欄位送到之後會被靜默丟棄——沒有錯誤、沒有警告,只是那幾欄永遠是空的。這正是假故障與靜默失效的診斷講的欄位錯位,而它最容易發生在「跟著教學一路改前端」的過程裡。
三篇的欄位都加上之後,payload 會長成下面這十一個欄位:
| 欄位 | 來自哪一篇 |
|---|---|
path / ref / lang / dev | 模組二既有 |
vid / sid | 訪客識別與 opt-out |
t / dur / act | 事件模型與停留時間 |
bot | 辨識自動化流量 |
對應的接收端要把 appendRow 的陣列改成同樣長度,並讓表頭在工作表被清空時自動重建:
1var HEADERS = ['時間', '路徑', '來源', '語言', '裝置',
2 '事件', '訪客ID', 'SessionID', '自動化訊號', '停留秒數', '有互動'];
3
4function getLogSheet() {
5 var ss = SpreadsheetApp.getActive();
6 var sheet = ss.getSheetByName('工作表1') || ss.insertSheet('工作表1');
7 if (sheet.getLastRow() === 0) {
8 sheet.getRange(1, 1, 1, HEADERS.length).setValues([HEADERS]);
9 sheet.setFrozenRows(1);
10 }
11 return sheet;
12}
13
14// doPost 內:陣列順序必須與 HEADERS 一致
15getLogSheet().appendRow([
16 new Date(), data.path || '', data.ref || '', data.lang || '', data.dev || '',
17 data.t || 'view', data.vid || '', data.sid || '', data.bot || '',
18 data.dur === undefined ? '' : data.dur,
19 data.act === undefined ? '' : data.act
20]);把表頭建立放進讀取路徑而非一次性腳本,是因為一次性腳本有個隱性假設:「執行過了」這個狀態存在執行者的記憶裡、不在系統裡。固定位置的 setValues 重複執行結果相同,工作表被清空後也會自動重建。
改完之後記得走「管理部署作業 → 編輯 → 版本選新版本」讓端點跑新程式碼——改了程式碼卻沒更新部署是這裡最常見的假故障。
新欄位只對之後進來的資料生效。 既有的記錄不會回填,所以本模組教的判讀方法要等新資料累積一段時間才用得上;拿舊資料套新判斷標準會得到「所有記錄都不可識別」這個沒有意義的結論。