想要針對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]);
}
}
-----10/30更新
示意圖:


程式完成
function checkAndLogGValues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("Sheet1");
var logSheet = ss.getSheetByName("Sheet2");
if (!sourceSheet) {
Logger.log("找不到 Sheet1");
return;
}
if (!logSheet) {
logSheet = ss.insertSheet("Sheet2");
logSheet.getRange(1, 1, 1, 6).setValues([["時間", "G30", "G31", "G32", "G33", "G34"]]);
}
// 讀取 G30:G34 的值
var values = sourceSheet.getRange(30, 7, 5, 1).getValues(); // G = column 7
var g30 = values[0][0];
var g31 = values[1][0];
var g32 = values[2][0];
var g33 = values[3][0];
var g34 = values[4][0];
var timestamp = new Date();
var rowData = [timestamp, g30, g31, g32, g33, g34];
// 寫入 Sheet2 的下一列
var nextRow = logSheet.getLastRow() + 1;
logSheet.getRange(nextRow + 1, 1, 1, 6).setValues([rowData]);
logSheet.getRange(nextRow + 1, 1).setNumberFormat("yyyy/MM/dd HH:mm:ss");
}
睡前剛好觸及到這篇,只稍微瀏覽、沒實際細測,提供幾個大方向:
1、換個乾淨的環境測試
乍看不覺得是程式碼的問題,驗證的方式很簡單:
你開一份新的試算表,其他邏輯、公式都不要放,只貼上onEdit()
若能正常log,則為其他函式和公式的問題
2、錯誤訊息
你的問題是:第一次觸發,但之後的編輯都不會觸發?
那你第二次「手動」編輯之後,IDE是否有跳錯誤訊息?
3、使用方式與需求通靈
或是更基本的原因
onEdit只會因為user手動編輯觸發
GAS腳本、公式產生的值等等都不會觸發
你的腳本,一格一格一格手動慢慢慢編輯,應該會正常log
但你不是直接log編輯了什麼
那log出來的快照可能因為觸發時機只抓到最後一次的結果
說到底,log編輯紀錄本身才是最穩的做法
如果沒有特殊需求或場景限制
那保留所有編輯過的前後值當歷史紀錄,比保留結果更好管理資料
要跑結果可以再加一個表,讓每個表的功能切分清楚
4、建議
猜不出監聽的欄位會用什麼形式被編輯
也猜不出log的欄位和監聽的欄位的關係
建議下次除了提供程式碼,相關試算表結構、你測過什麼、是否有錯誤訊息也一併附上來
其實通常做完上述的,這種小腳本、小需求就能自己找出問題了
或最乾脆的做法,連同腳本複製一個試算表,去識別化後把有編輯權限的連結附上來,這樣我們就可以直接測、直接改