如何在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
相关产品推荐
相关产品推荐

