You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:54:01