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

SuiteScript 2.0:通过已保存搜索创建库存调整单

解决NetSuite中通过已保存搜索批量生成库存调整单行的问题

我之前尝试用已保存搜索来批量创建库存调整单,目的是把出现负库存的占位项调回正常数量,自动化这个流程。一开始写的代码基础功能能跑,但搞不清楚创建库存调整单行的循环该放在哪里,同时也不确定获取已保存搜索值的循环位置对不对。

初始的问题代码片段:

if(resultRange) { 
  var newAdjust = record.create({ 
    type:record.Type.INVENTORY_ADJUSTMENT, 
    isDynamic:true
  }); 
  newAdjust.setValue({ fieldId: 'account', value: 288, }); 
  newAdjust.setValue({ fieldId: 'customform', value: 142, }) 
  for(i=0;i < resultRange.length;i++) { 
    var adjLocation = resultRange[i].getValue({ name : 'name', join : 'inventoryLocation' }); 
    var adjItem = resultRange[i].getValue('itemid'); 
    var adjQty = resultRange[i].getValue('locationquantityonhand') * -1; 
  } 

后来我把问题解决了,下面是可以正常运行的完整计划脚本代码,关键是把子列表行的创建逻辑放到遍历搜索结果的循环内部,这样每一条搜索结果都会对应生成一行库存调整明细:

/**
 * @NApiVersion 2.0
 * @NScriptType ScheduledScript
 */
define(['N/record', 'N/search','N/runtime'], 
/**
 * @param{record} record
 * @param{search} search
 */
function(record, search, runtime) {
  function execute(context) {
    var mySearch = search.load({ id: 'customsearch_bom_negative_inventory' });
    var myResultSet = mySearch.run();
    var resultRange = myResultSet.getRange({ start: 0, end: 50 });
    if(resultRange) {
      var newAdjust = record.create({ 
        type:record.Type.INVENTORY_ADJUSTMENT, 
        isDynamic:true
      });
      newAdjust.setValue({ fieldId: 'subsidiary', value: '1' });
      newAdjust.setValue({ fieldId: 'account', value: '288' });
      // 遍历搜索结果,每一条生成一行调整明细
      for(i=0;i < resultRange.length;i++) {
        var adjLocation = resultRange[i].getValue({ name : 'internalid', join : 'inventoryLocation' });
        var adjItem = resultRange[i].getValue('itemid');
        var adjQty = resultRange[i].getValue('locationquantityonhand') * -1;
        
        // 动态模式下创建子列表行的步骤:选中新行→设置字段→提交行
        newAdjust.selectNewLine({ sublistId: 'inventory' });
        newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'item', value: 3405 });
        newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'location', value: adjLocation });
        newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'adjustqtyby', value: adjQty });
        newAdjust.commitLine({ sublistId: 'inventory' });
        
        log.debug('当前处理的位置ID', adjLocation);
      }
      // 所有明细行创建完成后,保存整个调整单
      var adjustId = newAdjust.save();
      log.debug('库存调整单创建成功', '单据ID:' + adjustId);
    }
  }
  return { execute: execute };
});

关键修改说明

  • 子列表循环位置:把selectNewLine、setCurrentSublistValue、commitLine这些子列表操作放到遍历搜索结果的循环里,这样每遍历一条结果就生成一行明细,这是解决问题的核心。
  • 位置字段修正:把获取位置的字段从name改成了internalid,因为NetSuite的库存调整单子列表里,location字段需要传入内部ID而不是名称,否则会报错。
  • 完整流程闭环:在所有明细行创建完成后再调用newAdjust.save(),确保整个单据一次性保存,避免重复创建单据。
  • 动态模式规范用法:因为用了isDynamic:true创建单据,所以必须严格遵循「选中新行→设置当前行字段→提交行」的步骤来操作子列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:57:30