Google Sheets Apps Script实现两表行数据回写覆盖问题求助
Google Sheets 双向同步代码修复方案
你原有代码的核心问题是原始行号的传递和读取逻辑错误,以下是可直接运行的修复后代码:
function onEdit(event) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); // 从MainSheet复制行到ToDo表逻辑 if(s.getName() == "MainSheet" && r.getColumn() == 2 && r.getValue() == true) { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("ToDo"); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // 将MainSheet的当前行号写入第10列(J列)作为原始行标识 s.getRange(row, 10).setValue(row); // 复制整行到ToDo表 s.getRange(row, 1, 1, numColumns).copyTo(target); // 重置MainSheet的复选框状态 s.getRange(row, 2).setValue(false); } // 从ToDo表回写数据到MainSheet原始行逻辑 if(s.getName() == "ToDo" && r.getColumn() == 3 && r.getValue() == true) { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("MainSheet"); // 读取ToDo当前行第10列存储的原始行号 var originalRow = s.getRange(row, 10).getValue(); // 定位MainSheet的原始行 var target = targetSheet.getRange(originalRow, 1); // 复制修改后的数据回原始行 s.getRange(row, 1, 1, numColumns).copyTo(target); // 删除ToDo表的当前行 s.deleteRow(row); } }
关键修改说明
- 移除了全局无效的originalRow初始化,在MainSheet复制逻辑中直接把当前行号存入第10列,随行数据同步到ToDo表
- ToDo表触发回写时,优先从当前行的第10列读取原始行号,再用该值定位MainSheet的目标行
可选调整建议
- 如果你的表第10列(J列)有其他业务用途,可将代码中所有
10替换为其他未使用的列号 - 若不需要同步格式仅需要同步数值,可将copyTo语句修改为:
s.getRange(row, 1, 1, numColumns).copyTo(target, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); - 可增加非空判断避免originalRow为空时的报错:
if(originalRow && originalRow > 0) { var target = targetSheet.getRange(originalRow, 1); s.getRange(row, 1, 1, numColumns).copyTo(target); }
内容的提问来源于stack exchange,提问作者murarobe
相关产品推荐
相关产品推荐

