如何基于双条件将Google Sheets行移动到另一工作表的指定位置
修正Google Sheets onEdit脚本逻辑:按G列值指定位置粘贴行内容
问题根源
原脚本的核心错误出在优先级判断的条件上:
- 触发事件的是**H列(第8列)**的单元格(因为判断了
r.getColumn() == 8),所以r.getColumn() == 7永远不成立,但后面的|| "5"是一个非空字符串,在JS里会被判定为true,导致整个if条件永远为真,所以不管G列是什么值,都会粘贴到第8行。 - 另外,你需要读取的是当前行的G列值,而不是触发单元格(H列)的值。
修正后的完整代码
function onEdit(event){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); newprojectstoProjecttab(ss,s,r); } function newprojectstoProjecttab(ss,s,r){ if(s.getName() == "New Projects" && r.getColumn() == 8 && r.getValue() == "Approved") { var row = r.getRow(); var targetSheet = ss.getSheetByName("Project Tab"); // 获取当前行G列的值 var gColumnValue = s.getRange(row, 7).getValue(); // 定义目标范围 var targetRange; // 按G列值判断目标位置 if(gColumnValue === "4" || gColumnValue === "5") { targetRange = targetSheet.getRange(8, 1, 1, 7); } else { targetRange = targetSheet.getRange(60, 1, 1, 7); } // 复制前7列内容到目标位置 s.getRange(row, 1, 1, 7).copyTo(targetRange); // 清除原行前8列内容 s.getRange(row,1,1,8).clearContent(); } }
关键修改说明
- 正确获取G列值:通过
s.getRange(row,7).getValue()拿到当前触发行的G列内容,而不是用触发单元格(H列)的值。 - 修正判断逻辑:把错误的
r.getColumn() == 7 && r.getValue() == "4" || "5"改成直接判断G列值是否为"4"或"5",避免逻辑永远为真的问题。 - 优化代码结构:把重复的复制、清除代码提取到判断外,减少冗余,更易维护。
- 明确目标范围的列数:复制的是前7列,所以目标范围也指定为7列(
getRange(行,列,行数,列数)),避免不必要的单元格覆盖。
内容的提问来源于stack exchange,提问作者Justus Smith
相关产品推荐
相关产品推荐

