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

如何在Google Sheets合并重复项时排除B列(基于getDataRange()脚本)

解决方案

先给你修正并调整后的完整代码,已经实现B列不合并、仅保留单个值的需求:

function mergeIdenticals() {
  var firstRow = 2;
  var firstCol = 1;
  var sht = SpreadsheetApp.getActiveSheet();
  
  // 按第一列排序,确保相同项连续
  sht.getRange(firstRow, firstCol, sht.getLastRow() - firstRow + 1, sht.getLastColumn() - firstCol + 1).sort(1);
  
  // 添加临时行以处理最后一组数据
  sht.appendRow(['***','***','Control-z one more time','***','***']);
  
  var datR = sht.getDataRange();
  var lastRow = datR.getLastRow(); // 修正原错误,改用整个数据范围的最后一行
  var lastCol = datR.getLastColumn(); // 修正原错误,改用整个数据范围的最后一列
  var datA = datR.getValues();
  
  // 清除原数据区域(从第2行第1列开始)
  sht.getRange(firstRow, firstCol, lastRow - firstRow + 1, lastCol - firstCol + 1).clearContent().setWrap(true);
  
  var datoutA = [];
  var k = 1;
  var n = 0;
  
  for(var i = 0; i < datA.length; i++) {
    if(i > 1) {
      if(datA[i][0] == datA[i-1][0]) {
        k++; // 连续相同项的计数
      } else {
        datoutA[n] = [];
        if(k == 1) {
          // 只有一行的情况,直接复制整行
          for(var c = 0; c < datA[i-1].length; c++) {
            datoutA[n][c] = datA[i-1][c];
          }
        } else {
          // 合并k行数据
          var firstTime = true;
          for(var a = 1; a <= k; a++) {
            for(var b = 0; b < datA[i].length - 1; b++) {
              // 针对B列(数组索引1),仅在第一次循环时赋值,后续不再追加
              if(b === 1) {
                if(firstTime) {
                  datoutA[n][b] = datA[i - a][b];
                }
                continue; // 跳过B列的合并逻辑
              }
              
              // 其他列的合并逻辑保持不变
              if(a > 1 || b > 0) {
                datoutA[n][b] += ', ';
              }
              if(firstTime || b == 0) {
                datoutA[n][b] = datA[i - a][b];
              } else {
                datoutA[n][b] += datA[i - a][b];
              }
            }
            // 最后一列的求和逻辑保持不变
            if(firstTime) {
              datoutA[n][datA[i].length - 1] = Number(datA[i - a][datA[i].length - 1]);
            } else {
              datoutA[n][datA[i].length - 1] += Number(datA[i - a][datA[i].length - 1]);
            }
            firstTime = false;
          }
        }
        k = 1;
        n++;
      }
    }
  }
  
  // 将合并后的数据写入表格
  var datoutR = sht.getRange(firstRow, firstCol, datoutA.length, datoutA[0].length);
  datoutR.setValues(datoutA);
  
  // 设置列宽
  var colwidth = 250;
  sht.setColumnWidth(2, colwidth);
  sht.setColumnWidth(3, colwidth);
  sht.setColumnWidth(4, colwidth);
  
  // 删除临时添加的行
  sht.deleteRow(lastRow);
}

关键修改点说明:

  • 修正了原代码中lastRow和lastCol的错误:原代码错误地取了B列的行/列数,现在改回使用整个数据范围的行/列数,确保处理所有列
  • 添加了B列的判断逻辑:在列循环中,当b === 1(对应表格的B列,因为数组索引从0开始)时,仅在第一次处理该行组时赋值,后续直接跳过,避免合并
  • 调整了清除内容的范围:原代码只清除B列开始的区域,现在改为从第一列开始,确保所有旧数据被清除后写入新的合并数据
  • 新增了删除临时行的代码:原代码只添加了临时行但没删除,现在在最后删除临时行,避免残留无关内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:47:15