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

基于SKU的库存增减脚本调试请求:OUTStock函数减法逻辑异常修复

修复出库库存更新的减法逻辑错误

我看到你在出库操作的库存更新逻辑上碰到了问题,这个错误其实很直观——减法的顺序完全搞反了!原来的代码里用「出库数量 - 现有库存」,自然会得到负数结果,正确的逻辑应该是「现有库存 - 出库数量」。

问题根源

在outStock函数的这两行代码里:

var boxUpdate = boxes[skus.indexOf(res)] - inventory.getRange(y,3).getValue();
var bottleUpdate = bottles[skus.indexOf(res)] - inventory.getRange(y,4).getValue();

你把计算顺序写反了,应该用库存当前值减去出库的数量,而不是反过来。

修复后的完整outStock函数

同时,我还优化了代码的性能——原来的写法在循环里频繁调用getRange(),这在Google Apps Script里会拖慢执行速度。下面的版本会一次性读取所有数据到数组中处理,效率更高:

function outStock(outstock, inventory){ //Function for OUTStock sheet data
  // 一次性读取OUTStock的相关数据,减少API调用
  const outstockData = outstock.getDataRange().getValues();
  const skus = [];
  const boxes = [];
  const bottles = [];
  
  // 提取出库数据(从第2行开始)
  for(let x = 1; x < outstockData.length; x++){ // 数组索引从0开始,对应表格第2行
    skus.push(outstockData[x][0]); // 对应OUTStock的A列
    boxes.push(outstockData[x][4]); // 对应OUTStock的E列
    bottles.push(outstockData[x][5]); // 对应OUTStock的F列
  }

  // 一次性读取Inventory的所有数据
  const inventoryData = inventory.getDataRange().getValues();
  const inventoryRange = inventory.getDataRange();

  // 遍历Inventory匹配SKU并更新
  for (let y = 2; y < inventoryData.length; y++){ // 数组索引从2开始,对应表格第3行
    const inventorySku = inventoryData[y][0]; // Inventory的A列
    skus.forEach((res, index) => {
      if(res === inventorySku){
        // 修正减法顺序:现有库存 - 出库数量
        const currentBox = inventoryData[y][2]; // Inventory的C列
        const currentBottle = inventoryData[y][3]; // Inventory的D列
        const boxUpdate = currentBox - boxes[index];
        const bottleUpdate = currentBottle - bottles[index];

        // 更新数组中的值
        inventoryData[y][2] = boxUpdate;
        inventoryData[y][3] = bottleUpdate;

        // 日志记录
        Logger.log(`Found Match for OUTStock SKU code ${res} on Inventory sheet at row #${y+1}\n==OUTSTOCK DATA==\nSKU: ${res}\nBox: ${boxes[index]}\nBottle: ${bottles[index]}\n==UPDATED INVENTORY==\nCell C${y+1} was updated to ${boxUpdate}\nCell D${y+1} was updated to ${bottleUpdate}`);
      }
    });
  }

  // 一次性写入更新后的库存数据
  inventoryRange.setValues(inventoryData);

  // 清除OUTStock的指定区域
  outstock.getRange("B2:B"+outstock.getDataRange().getLastRow()).clearContent();
  outstock.getRange("E2:F"+outstock.getDataRange().getLastRow()).clearContent();

  Logger.log(" Done Updating SKU codes: " + skus + " on Inventory sheet");
}

关键修改点

  1. 修正减法顺序:把出库数量 - 现有库存改成现有库存 - 出库数量,这直接解决了你遇到的负数问题。
  2. 优化数据读取方式:一次性读取整表数据到数组,避免循环中反复调用getRange(),大幅提升脚本执行效率(这在数据量较大时尤其明显)。
  3. 保持原有功能:保留了日志记录、清除指定区域内容的逻辑,确保其他功能不受影响。

测试一下你提到的场景:Las Rocas初始14瓶,出库2瓶,现在会计算14 - 2 = 12,得到正确的库存值。

内容的提问来源于stack exchange,提问作者Patxi Fernandez Coster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:27:39