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

Google Sheets行重复与分组功能实现需求及代码求助

Google Sheets 行重复与分组功能实现求助

原本以为在Google Sheets中实现行的重复与分组操作难度不大,但目前已陷入困境。我准备了示例图,展示功能的初始状态、期望实现的分组效果,以及可接受的替代方案效果。

先写出了初步的autoDup函数和未完成的autoGroup函数,后续在@tedinoz帮助下,更新了可实现替代方案的完整代码,希望能得到进一步的技术指导。

初始代码

function autoDup() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = [];
  for(var n in data){
    newData.push(data[n]);
    if(!Number(data[n][3])){continue};// if column 3 is not a number then do nothing
    for(var c=0 ; c < Number(data[n][3]) ; c++){
      newData.push(data[n]);//store values
    }
  }
  sheet.getRange(1,1,newData.length,newData[0].length).setValues(newData);// write new data to sheet, overwriting old data
}

function autoGroup() {
}

更新后代码

function autoDup(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var rowLen = sheet.getLastRow()-1;
  var dataRange = sheet.getRange(2,1,rowLen,sheet.getLastColumn());
  var data = dataRange.getValues().sort();

  dataRange.expandGroups().shiftRowGroupDepth(-1);

  var newData = [];

  data = removeDups(data, rowLen);

  for(var n in data){
    
    newData.push(data[n]);
    var qty = data[n][2];

    if(!Number(qty)){continue};
    if(qty !== 1){
      for(var c=0 ; c < qty ; c++){
        newData.push([data[n][0],data[n][1],1]);//store values
      }
    }
  }
  // write new data to sheet, overwriting old data
  sheet.getRange(2,1,newData.length,newData[0].length).clearContent().setValues(newData);

}

function removeDups(data, dataLen){

  var newData = []

  for(var i=0; i<dataLen; i++){

    var valLast = data[i-1];
    var valCurrent = data[i];
    var valNext = data[i+1];

    if(valCheck(valCurrent, valNext)){
      continue;
    }else if(valCheck(valCurrent, valLast)){
      continue;
    }else {
      newData.push(valCurrent)
    }
  }
  
  return newData;
}

function autoGroup(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var rowLen = sheet.getLastRow() - 1;
  var data = sheet.getRange(2,1,rowLen,sheet.getLastColumn()).getValues();

  for(var i=0, j=0, r=0; i<rowLen; i++){
    
    var valCurrent = data[i];
    var valNext = data[i+1];

    if(valCheck(valCurrent, valNext)){
      if(j === 0){
       j++;
       r = i + 2;
      }else j++;
    }else {
      if(j !== 0){
        sheet.getRange(r,1,j+1).activate().shiftRowGroupDepth(1);
        j=0;
      }
    }
  }
  sheet.collapseAllRowGroups();

}

function valCheck(value1,value2){
  if(value1 != null && value2 != null){
    if(value1.join() === value2.join()){
      return true;
    }else return false;
  }else return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:38