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

Google Apps Script多维数组合并难题:库存数据自动化处理求助

解决方案:合并箱规数组与移除列后的数组

我明白你现在卡在哪了——你想把拆分出来的箱规数值合并到移除了第4列的arr3数组的对应行里,但当前的push操作是把箱规当成新的一行加到arr3末尾,而不是和原有行合并,这就导致结果完全不符合预期了。

问题根源

你当前的循环代码:

for(var i = 0; i < arr4.length; i++) {
  arr3.push(arr4[i]);
}

这里的push是向arr3这个二维数组的末尾添加新元素(也就是新的一行),但我们需要的是把arr4的每个值插入到arr3对应行的末尾,属于行内合并,而非新增行。

修正方案

我们分两步调整代码,就能解决这个问题:

1. 优化splitCol函数(可选但推荐)

当前splitCol返回的是一个单元素数组(比如["6"]),直接返回字符串会更方便后续合并:

function splitCol(row){
  var caseSize = row[3].split(" x");
  // 取拆分后的第一部分,并去除前后空格(避免数据格式问题)
  return caseSize[0].trim();
}

2. 修改合并逻辑

把箱规值添加到arr3的对应行末尾,而不是新增行:

for(var i = 0; i < arr4.length; i++) {
  // 将箱规值插入到arr3第i行的末尾
  arr3[i].push(arr4[i]);
}

如果不想修改splitCol函数,也可以直接取数组的第一个元素:

for(var i = 0; i < arr4.length; i++) {
  arr3[i].push(arr4[i][0]);
}

完整修正后的代码

function countFile() {
  var app = SpreadsheetApp;
  var ss = app.getActive();
  var ws = ss.getSheetByName("report");
  // 修正行数计算:从第5行开始,有效行数为lastRow - 4,避免包含空行
  var onHand = ws.getRange(5, 1, ws.getLastRow()-4, 6).getValues();
  
  var caseCounts = []; 
  var sglCounts = []; 

  onHand.map(function(r){
    var d = r[5];
    if(d.toString().indexOf("CASE") === -1){
      sglCounts.push(r);
    } else {
      caseCounts.push(r);
    }
  });

  var arr3 = removeEl(caseCounts, 3);
  var arr4 = caseCounts.map(splitCol); 

  // 正确合并数组:将箱规值添加到对应行末尾
  for(var i = 0; i < arr4.length; i++) {
    arr3[i].push(arr4[i]);
  }

  Logger.log(arr3);
}

function splitCol(row){
  var caseSize = row[3].split(" x");
  return caseSize[0].trim();
}

function removeEl(array, remIdx) {
  return array.map(function(arr) {
    return arr.filter(function(el,idx){return idx !== remIdx});
  });
};

额外优化建议(简化代码)

如果想减少中间数组的创建,提升代码效率,可以在筛选caseCounts的同时直接完成拆分和列移除,省去arr3和arr4的步骤:

function countFile() {
  var app = SpreadsheetApp;
  var ss = app.getActive();
  var ws = ss.getSheetByName("report");
  var onHand = ws.getRange(5, 1, ws.getLastRow()-4, 6).getValues();
  
  var caseCountsProcessed = [];
  var sglCounts = []; 

  onHand.forEach(function(r){
    var d = r[5];
    if(d.toString().indexOf("CASE") !== -1){
      // 拆分箱规值
      var caseSize = r[3].split(" x")[0].trim();
      // 移除第4列(索引3),并将箱规值添加到行末尾
      var newRow = r.filter(function(el, idx){ return idx !== 3; });
      newRow.push(caseSize);
      caseCountsProcessed.push(newRow);
    } else {
      sglCounts.push(r);
    }
  });

  Logger.log(caseCountsProcessed);
  Logger.log(sglCounts);
}

这样代码更简洁,也减少了数组操作的开销,适合处理行数较多的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:09:08