Google Apps Script按单元格值复制删除行报错求助
问题解决与代码修正
报错原因分析
- 逻辑判断列错误:你需求是判断A列(第一列)值为
2 bestellt,但原代码里判断的是L列(解构后的l变量),直接导致筛选逻辑完全错误。 - 空数组未处理:当没有符合条件的行时,
values是空数组,此时values[0]为undefined,调用values[0].length就会触发Cannot read property 'length' of undefined错误。 - 缺少删除原行逻辑:原代码仅实现了复制,未完成删除源表符合条件行的需求。
修正后的完整代码
function copyAndDeleteTargetRows() { const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = spreadSheet.getSheetByName('Wunschliste'); const targetSheet = spreadSheet.getSheetByName('Bestellt'); // 获取源表所有数据(从第二行开始,包含表头下的所有行) const sourceData = sourceSheet.getRange(2, 1, sourceSheet.getLastRow() - 1, 13).getValues(); const targetValues = []; const rowsToDelete = []; // 遍历数据,筛选符合条件的行 sourceData.forEach((row, index) => { // 判断A列(索引0)的值是否为"2 bestellt" if (row[0] === "2 bestellt") { // 提取指定列:B(1), C(2), D(3), I(8), J(9), K(10) targetValues.push([row[1], row[2], row[3], row[8], row[9], row[10]]); // 记录需要删除的行号(源表中是第index+2行,因为从第二行开始遍历) rowsToDelete.push(index + 2); } }); // 仅当有数据时才执行复制操作 if (targetValues.length > 0) { const targetLastRow = targetSheet.getLastRow(); targetSheet.getRange(targetLastRow + 1, 1, targetValues.length, targetValues[0].length).setValues(targetValues); } // 倒序删除源表中的目标行(避免正序删除导致行号偏移) for (let i = rowsToDelete.length - 1; i >= 0; i--) { sourceSheet.deleteRow(rowsToDelete[i]); } }
代码说明
- 列索引修正:用数组索引(从0开始)对应工作表列,A列是
row[0],符合你的筛选需求。 - 空数组保护:通过
if (targetValues.length > 0)判断,避免空数组时执行setValues引发错误。 - 行删除逻辑:采用倒序删除,防止删除前面的行后,后面的目标行号发生偏移导致删除错误。
- 指定列提取:严格按照需求提取B、C、D、I、J、K列的数据(对应数组索引1、2、3、8、9、10)。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

