基于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"); }
关键修改点
- 修正减法顺序:把
出库数量 - 现有库存改成现有库存 - 出库数量,这直接解决了你遇到的负数问题。 - 优化数据读取方式:一次性读取整表数据到数组,避免循环中反复调用
getRange(),大幅提升脚本执行效率(这在数据量较大时尤其明显)。 - 保持原有功能:保留了日志记录、清除指定区域内容的逻辑,确保其他功能不受影响。
测试一下你提到的场景:Las Rocas初始14瓶,出库2瓶,现在会计算14 - 2 = 12,得到正确的库存值。
内容的提问来源于stack exchange,提问作者Patxi Fernandez Coster
相关产品推荐
相关产品推荐

