想要針對google試算表請教各位大大一些問題,簡單扼要地說是有一個試算表裡有兩個分頁,一個是sheet1另一個是sheet2,想要在sheet1的A1、A2、A3、A4每次變更數字的時候都在sheet2裡記錄什麼時間記錄了什麼數字,未來好拿來做成趨勢線圖現在只記錄了一次就停了,AppScript程式應該要怎麼改?
示意圖:
A1、A2、A3、A4已變更為B3、C3、D3、E3
程式碼:
function onEdit(e) {
const sheetName = 'Sheet2';
const logSheetName = 'log';
const targetCells = ['B3', 'C3', 'D3', 'E3'];
if (!e) return;
const sheet = e.range.getSheet();
const row = e.range.getRow();
const column = e.range.getColumn();
const editedCell = sheet.getRange(row, column).getA1Notation();
if (sheet.getSheetName() === sheetName && targetCells.includes(editedCell)) {
const logSheet = e.source.getSheetByName(logSheetName);
if (!logSheet) return;
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm');
const valueB = sheet.getRange(6, 2).getValue(); // B6
const valueC = sheet.getRange(6, 3).getValue(); // C6
const valueD = sheet.getRange(6, 4).getValue(); // D6
const valueE = sheet.getRange(6, 5).getValue(); // E6
logSheet.appendRow([timestamp, valueB, valueC, valueD, valueE]);
}
}
睡前剛好觸及到這篇,只稍微瀏覽、沒實際細測,提供幾個大方向:
1、換個乾淨的環境測試
乍看不覺得是程式碼的問題,驗證的方式很簡單:
你開一份新的試算表,其他邏輯、公式都不要放,只貼上onEdit()
若能正常log,則為其他函式和公式的問題
2、錯誤訊息
你的問題是:第一次觸發,但之後的編輯都不會觸發?
那你第二次「手動」編輯之後,IDE是否有跳錯誤訊息?
3、使用方式與需求通靈
或是更基本的原因
onEdit只會因為user手動編輯觸發
GAS腳本、公式產生的值等等都不會觸發
你的腳本,一格一格一格手動慢慢慢編輯,應該會正常log
但你不是直接log編輯了什麼
那log出來的快照可能因為觸發時機只抓到最後一次的結果
說到底,log編輯紀錄本身才是最穩的做法
如果沒有特殊需求或場景限制
那保留所有編輯過的前後值當歷史紀錄,比保留結果更好管理資料
要跑結果可以再加一個表,讓每個表的功能切分清楚
4、建議
猜不出監聽的欄位會用什麼形式被編輯
也猜不出log的欄位和監聽的欄位的關係
建議下次除了提供程式碼,相關試算表結構、你測過什麼、是否有錯誤訊息也一併附上來
其實通常做完上述的,這種小腳本、小需求就能自己找出問題了
或最乾脆的做法,連同腳本複製一個試算表,去識別化後把有編輯權限的連結附上來,這樣我們就可以直接測、直接改