Google Apps Script按钮触发失效:仅手动输入可同步J/K列旧值至L/M列
问题原因
onEdit(e)是Google Apps Script的简单触发器,仅会在用户手动编辑单元格时触发;通过脚本(比如按钮调用的submitValues)修改单元格内容的操作,不会触发这个函数,也就无法自动更新L/M列的旧值。- 另外,脚本触发的单元格修改不会生成
e.oldValue参数,这也是onEdit无法捕获此类操作旧值的核心原因。
解决方案
直接在submitValues函数里提前获取旧值并写入对应列,再更新J1和K1的新值。修改后的完整代码如下:
function submitValues() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName("Sheet1"); var sheet2 = ss.getSheetByName("Sheet2"); // 先获取J1、K1当前的旧值 var oldJValue = sheet2.getRange("J1").getValue(); var oldKValue = sheet2.getRange("K1").getValue(); // 将旧值写入L1和M1 sheet2.getRange("L1").setValue(oldJValue); sheet2.getRange("M1").setValue(oldKValue); // 获取新值并更新J1、K1 var cellC11 = sheet1.getRange("C11").getValue(); var currentDate = new Date(); sheet2.getRange("J1").setValue(cellC11); sheet2.getRange("K1").setValue(currentDate); } function onEdit(e) { var sheet = e.source.getSheetByName("Sheet2"); var range = e.range; if (sheet.getName() === "Sheet2") { if (range.getColumn() === 10) { // J列对应第10列 var oldValue = e.oldValue; var newValue = e.value; if (oldValue !== newValue) { sheet.getRange(range.getRow(), 12).setValue(oldValue); } } else if (range.getColumn() === 11) { // K列对应第11列 var oldDate = e.oldValue; var newDate = e.value; if (oldDate !== newDate) { sheet.getRange(range.getRow(), 13).setValue(oldDate); } } } }
额外优化建议
可以通过批量单元格操作减少API调用次数,提升脚本运行效率,比如把多个getRange/setValue合并:
// 替换submitValues里的单个单元格操作代码 var [oldJValue, oldKValue] = sheet2.getRange("J1:K1").getValues()[0]; sheet2.getRange("L1:M1").setValues([[oldJValue, oldKValue]]); sheet2.getRange("J1:K1").setValues([[cellC11, currentDate]]);
内容的提问来源于stack exchange,提问作者Point Click
相关产品推荐
相关产品推荐

