Google Apps Script执行deleteRow报错Those rows are out of bounds问题求解
Google Apps Script 表格去重行删除越界异常解决方案
错误原因分析
出现Exception: Those rows are out of bounds异常的核心原因是删除行的计数逻辑错误:
- 倒序遍历删除行的场景下,删除下方行不会影响上方行的索引,不需要额外维护删除计数
d,你额外增加了-d++逻辑反而会把待删除的行号算小,最终会出现行号小于1的越界情况。 - 举例验证:假设表格共5行,
dt.length为5,i初始值为4(对应表格第5行),如果首次判断为重复待删除,计算行号为4+1 - 0 = 5无异常,d变为1;到i=3时如果再次判定为重复,计算行号为3+1 -1 =3,但倒序场景下本应删除第4行,错误计算后删除了第3行,后续i持续减小,i+1 -d会出现0甚至负数,触发越界异常。
修复后可运行代码
直接移除冗余的d计数逻辑即可:
function removeDuplicates() { var sh = SpreadsheetApp.getActiveSheet(); var dt = sh.getDataRange().getValues(); var uA = []; for( var i = dt.length - 1; i >= 0; i-- ) { if ( uA.indexOf( dt[ i ][ 0 ] ) == -1 ) { uA.push( dt[ i ][ 0 ] ); } else { // 数组索引从0开始,表格行号从1开始,直接取i+1即可 sh.deleteRow( i + 1 ); } } }
可选性能优化方案
如果数据量超过100行,建议先批量处理完数据后一次性写回表格,避免逐行操作带来的性能损耗:
function removeDuplicatesFast() { var sh = SpreadsheetApp.getActiveSheet(); var dt = sh.getDataRange().getValues(); var uA = []; var seen = new Set(); // Set查找效率远高于indexOf // 如需保留首次出现的重复项用正序遍历,保留最后一次出现的重复项用原倒序逻辑即可 for(var i = 0; i < dt.length; i++){ if(!seen.has(dt[i][0])){ seen.add(dt[i][0]); uA.push(dt[i]); } } sh.clearContents(); sh.getRange(1,1,uA.length, uA[0].length).setValues(uA); }
内容的提问来源于stack exchange,提问作者user16711311
相关产品推荐
相关产品推荐

