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

Google Apps Script行定位偏移致误删行,如何修复?

修复Google Apps Script行删除定位错误问题

问题概述

在处理「NWSS Sidecar」工作表中PUT样本配对时,代码会错误定位到目标行的下一行,导致删除了不应删除的行。即使改为从下到上循环,问题仍存在,尤其在处理「PUT PCR Data」中无记录的新样本时,会错误删除目标样本及配对的第一个样本。

核心问题分析

  1. 循环条件语法错误:原代码中[i] >= 0是无效语法,导致循环逻辑异常。
  2. 相邻配对判断逻辑错误:仅检查上一行ID是否等于当前ID+1,未覆盖当前ID是较大值的情况,且未标记已处理的配对,导致重复操作。
  3. 行号转换与删除逻辑混乱:数组索引与工作表行号对应关系错误,删除行后未调整索引,引发后续行定位偏差。
  4. 低效的单元格访问:多次单独调用getRange获取数据,既影响性能也容易引发行号偏移问题。

修复后的完整代码

function nWSSPUTReplicateResolution() {
  Logger.log("Resolving Putnam samples");
  const ss = SpreadsheetApp.openByUrl(''); // 请填入你的表格URL
  const sidecarSheet = ss.getSheetByName('NWSS Sidecar');
  const putSheet = ss.getSheetByName('PUT PCR Data');
  const entrySheet = ss.getSheetByName('ENTRY SHEET');

  // 批量获取所有数据,减少API调用
  const putData = putSheet.getDataRange().getValues();
  const sidecarData = sidecarSheet.getDataRange().getValues();
  const entryData = entrySheet.getDataRange().getValues();
  const searchkey = 'PUT';

  // 构建PUT数据的ID映射,快速查找
  const putIdMap = new Map();
  for (let j = 1; j < putData.length; j++) {
    putIdMap.set(putData[j][0], {
      n1: putData[j][1],
      row: j + 1 // 存储工作表行号
    });
  }

  // 从下到上循环,避免删除行影响后续索引
  for (let i = sidecarData.length - 1; i >= 1; i--) {
    const currentRow = sidecarData[i];
    const currentPutID = currentRow[4];
    const currentSheetRow = i + 1;

    // 跳过非PUT或无ID的行
    if (currentRow[15] !== searchkey || currentPutID === '') continue;

    const prevRow = sidecarData[i - 1];
    const prevPutID = prevRow[4];

    // 判断是否是相邻配对(ID差为1,且上一行也是PUT)
    if (prevRow[15] !== searchkey || prevPutID === '' || Math.abs(currentPutID - prevPutID) !== 1) continue;

    // 标记当前配对已处理,避免重复处理上一行
    sidecarData[i - 1][15] = 'PROCESSED';

    const largerPutID = Math.max(currentPutID, prevPutID);
    const smallerPutID = Math.min(currentPutID, prevPutID);
    const smallerSheetRow = currentPutID === smallerPutID ? currentSheetRow : (i);

    Logger.log(`处理配对:${smallerPutID} 和 ${largerPutID}`);

    if (putIdMap.has(largerPutID)) {
      // 已存在记录,更新Sidecar的B列并删除较小ID的行
      const putRecord = putIdMap.get(largerPutID);
      sidecarSheet.getRange(currentSheetRow, 2).setValue(putRecord.n1);
      sidecarSheet.deleteRow(smallerSheetRow);
    } else {
      // 新样本,添加到PUT PCR Data并计算平均值
      const putNewRow = putSheet.appendRow([largerPutID, '', '', '', '', '', '', '']).getRow();
      
      // 在ENTRY SHEET中查找较大ID
      let entryRecord = null;
      for (let k = 1; k < entryData.length; k++) {
        if (entryData[k][0] === largerPutID) {
          entryRecord = entryData[k];
          // 获取上一行数据(批量获取已存储,避免重复调用API)
          const prevEntryRecord = entryData[k - 1];
          const n1Average = (entryRecord[1] + prevEntryRecord[1]) / 2;
          const n2Average = (entryRecord[2] + prevEntryRecord[2]) / 2;
          const rPAverage = (entryRecord[3] + prevEntryRecord[3]) / 2;
          const testResultDate = entryData[1][7]; // H2对应数组索引[1][7]
          const correctionFactor = entryData[0][7]; // H1对应数组索引[0][7]
          const putAvgN1wCF = n1Average * correctionFactor;
          const putAvgN2wCF = n2Average * correctionFactor;

          // 批量更新PUT PCR Data
          putSheet.getRange(putNewRow, 2, 1, 6).setValues([
            [n1Average, n2Average, rPAverage, testResultDate, putAvgN1wCF, putAvgN2wCF]
          ]);

          // 更新Sidecar的B列并删除较小ID的行
          sidecarSheet.getRange(currentSheetRow, 2).setValue(n1Average);
          sidecarSheet.deleteRow(smallerSheetRow);
          break;
        }
      }
    }
  }
  Logger.log("Putnam samples resolved");
}

关键修复点说明

  • 修正循环条件:将错误的[i] >= 0改为i >= 1(从第2行数组索引1开始,避免越界访问i-1)。
  • 添加配对处理标记:处理完配对后,将上一行的P列标记为PROCESSED,避免重复处理同一配对。
  • 构建ID映射表:用Map存储PUT数据的ID与对应行信息,替代循环查找,提升效率并避免行号偏差。
  • 统一行号计算逻辑:明确数组索引与工作表行号的转换关系,精准计算需要删除的较小ID行号。
  • 批量数据操作:一次性获取所有工作表数据,减少getRange调用次数,避免因实时行号变化引发的定位错误。
  • 完善配对判断逻辑:用Math.abs判断ID差值为1,覆盖当前ID是较大值或较小值的两种情况。

内容的提问来源于stack exchange,提问作者PooDatabase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:20:16