Google Sheets脚本添加多源/目标工作表后失效及报错排查
问题分析与修复方案
首先,你遇到的The coordinates of the target range are outside the dimensions of the sheet错误,核心原因有两个:
1. 未限制第二个条件的工作表范围
你的第二个if(r.getValue() == "H")判断没有限定只能在Job Schedule工作表触发,这意味着如果在Job History或Job Holding工作表中输入"H",这个分支也会执行——它会尝试把当前行复制到Job Holding,然后删除当前行,这不仅不符合你的逻辑,还可能因为跨表列数不匹配触发范围错误。
2. 复制时使用源表列数,与目标表列数不匹配
当你从Job History/Job Holding复制行到Job Schedule时,你用了numColumns = s.getLastColumn()(源表的列数)来定义目标范围的列数。如果源表的列数比Job Schedule的实际列数多,就会导致目标范围超出工作表的维度,触发报错。
修复后的完整脚本
function onEdit(event) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); // Job Schedule → Job History(原逻辑,保留) if(s.getName() == "Job Schedule" && r.getColumn() == 50 && r.getValue() == "X") { var row = r.getRow(); // 改用目标表的列数,避免超出范围 var numColumns = ss.getSheetByName("Job History").getLastColumn(); var targetSheet = ss.getSheetByName("Job History"); var targetRow = targetSheet.getLastRow() + 1; // 确保目标表有足够行(如果是空表,从第1行开始) if(targetRow === 1) { targetSheet.insertRowBefore(1); } var target = targetSheet.getRange(targetRow, 1, 1, numColumns); var source = s.getRange(row, 1, 1, numColumns); var notes = source.getNotes(); source.copyTo(target, {contentsOnly:true}); target.setNotes(notes); s.deleteRow(row); } // Job Schedule → Job Holding(新增工作表限制) if(s.getName() == "Job Schedule" && r.getColumn() == 50 && r.getValue() == "H") { var row = r.getRow(); var numColumns = ss.getSheetByName("Job Holding").getLastColumn(); var targetSheet = ss.getSheetByName("Job Holding"); var targetRow = targetSheet.getLastRow() + 1; if(targetRow === 1) { targetSheet.insertRowBefore(1); } var target = targetSheet.getRange(targetRow, 1, 1, numColumns); var source = s.getRange(row, 1, 1, numColumns); var notes = source.getNotes(); source.copyTo(target, {contentsOnly:true}); target.setNotes(notes); s.deleteRow(row); } // Job History → Job Schedule if(s.getName() == "Job History" && r.getColumn() == 50 && r.getValue() == "R") { var row = r.getRow(); var targetSheet = ss.getSheetByName("Job Schedule"); var numColumns = targetSheet.getLastColumn(); var targetRow = targetSheet.getLastRow() + 1; if(targetRow === 1) { targetSheet.insertRowBefore(1); } var target = targetSheet.getRange(targetRow, 1, 1, numColumns); var source = s.getRange(row, 1, 1, numColumns); var notes = source.getNotes(); source.copyTo(target, {contentsOnly:true}); target.setNotes(notes); s.deleteRow(row); } // Job Holding → Job Schedule if(s.getName() == "Job Holding" && r.getColumn() == 50 && r.getValue() == "R") { var row = r.getRow(); var targetSheet = ss.getSheetByName("Job Schedule"); var numColumns = targetSheet.getLastColumn(); var targetRow = targetSheet.getLastRow() + 1; if(targetRow === 1) { targetSheet.insertRowBefore(1); } var target = targetSheet.getRange(targetRow, 1, 1, numColumns); var source = s.getRange(row, 1, 1, numColumns); var notes = source.getNotes(); source.copyTo(target, {contentsOnly:true}); target.setNotes(notes); s.deleteRow(row); } }
关键修改点说明
- 为第二个条件添加工作表限制:确保只有在
Job Schedule工作表的第50列输入"H"时,才会触发行转移到Job Holding的逻辑。 - 改用目标表的列数:所有复制操作中,
numColumns都取目标表的列数,避免源表列数过多导致目标范围超出工作表维度。 - 处理空目标表的情况:当目标表为空时(
getLastRow() +1 ===1),先插入一行,确保可以正常写入数据。
这样修改后,脚本就能正确处理双向的行转移逻辑,不会再触发范围超出的错误了。
内容的提问来源于stack exchange,提问作者raphaelsword
相关产品推荐
相关产品推荐

