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

NetSuite SuiteScript设置销售订单Create PO为DropShip及字段校验

NetSuite SuiteScript 销售订单自动赋值开发问题

需求背景

  • 通过用户界面创建销售订单时,自动将item子列表的Create PO字段值设置为DropShip
  • 新增if判断逻辑,校验销售订单上的自定义字段值
  • 现有参考:SuiteAnswers 文章《Setting the Create PO field to null via SuiteScript》(答案编号35911)
  • 当前进度:已调通SuiteScript 1.0基础逻辑,可成功给createpo字段赋值DropShip,但无法添加自定义字段校验的if判断;已知SuiteScript 1.0已官方弃用,需要改写为2.0版本,但现有参考2.0代码存在逻辑错误,且账号新建脚本页面无2.0脚本类型选择入口。

现有可运行的SuiteScript 1.0代码

function beforeSubmit(type)
{
  var count = nlapiGetLineItemCount('item');
  for (i=1; i<= count; i++)
  {
    var currentContext = nlapiGetContext();
    // 仅UI触发脚本时设置createpo字段
    // 可在此处新增其他if判断条件
    // createpo可选值:Null、'DropShip'、'SpecOrd'
    if((currentContext.getExecutionContext() == 'userinterface'))
    {
      nlapiSetLineItemValue('item', 'createpo', i, 'DropShip');
    }
  }
}

存在逻辑错误的参考SuiteScript 2.0代码

function beforeSubmit(type){
  var count = objRecord.selectLine({
    sublistId: 'item',
    line: i
  });
  
  for (i=1; i<= count; i++)    {
    var currentContext = runtime.executionContext();
    
    // 仅Web Services触发时设置createpo为null,与需求不符
    if((currentContext.getExecutionContext() == 'webservices'))        {
      objRecord.setSublistValue({
        sublistId: 'item',
        fieldId: 'createpo',
        line: i,
        value: null
      });
    }
  }
}

待解决问题

  1. SuiteScript 1.0版本的beforeSubmit事件中,如何添加if判断逻辑校验销售订单头层面的字段值
  2. 如何编写可正常运行的SuiteScript 2.0版本脚本(包含beforeSubmit阶段字段校验逻辑),提供面向新手的详细操作指引,同时解决账号看不到2.0脚本类型入口的问题

解决方案

一、SuiteScript 1.0版本添加字段校验逻辑

1.0版本在beforeSubmit事件中获取头字段值直接调用nlapiGetFieldValue即可,注意字段ID要填写自定义字段的实际ID(销售订单头自定义字段一般以custbody_开头),判断逻辑直接加在UI上下文判断的同级或内层即可,优化后可直接运行的示例代码:

function beforeSubmit(type)
{
  // 仅创建模式下执行逻辑,编辑模式不需要生效可保留该判断
  if (type != 'create') return;

  // 先获取头层面需要校验的自定义字段值,示例字段ID替换为实际业务字段ID
  var isDropShipAllowed = nlapiGetFieldValue('custbody_allow_dropship');
  // 示例规则:如果自定义复选框"允许直发"未选中(NetSuite复选框选中值为'T',未选中为'F'),直接终止逻辑不赋值
  if (isDropShipAllowed != 'T') return;

  var currentContext = nlapiGetContext();
  // 上下文判断移到循环外,不需要每次循环都重复调用API,减少治理单元消耗
  if(currentContext.getExecutionContext() != 'userinterface') return;

  var count = nlapiGetLineItemCount('item');
  // 循环变量i必须加var声明,避免变成全局变量引发不可预期错误
  for (var i=1; i<= count; i++)
  {
    // 如需校验行层面字段,在这里调用nlapiGetLineItemValue获取值判断即可
    // var lineFieldVal = nlapiGetLineItemValue('item', 'custcol_xxx', i);
    // if (lineFieldVal != 'xxx') continue;
    nlapiSetLineItemValue('item', 'createpo', i, 'DropShip');
  }
}

二、SuiteScript 2.0版本实现方案

1. 解决看不到2.0脚本入口的问题

账号新建脚本页不显示2.0脚本类型,90%的情况是当前角色缺少对应权限:

  • 用管理员角色登录,进入设置 > 用户/角色 > 角色管理,找到当前使用的角色点编辑
  • 在权限 > 设置子标签下,添加SuiteScript 2.0权限,级别设为完整
  • 保存后清除浏览器缓存重新登录,新建脚本页面即可看到2.0/2.1脚本类型选项
  • 如果管理员账号仍看不到入口,检查设置 > 公司 > 启用功能 > 云开发标签下,Client SuiteScript和Server SuiteScript功能是否已开启。

2. 可直接运行的2.0版本User Event脚本代码

SuiteScript 2.0的User Event脚本需要先声明依赖模块,不能直接调用全局API。之前拿到的参考代码存在缺少模块声明、record对象获取逻辑错误、触发上下文判断错误、行号索引错误(2.0子列表行号从0开始,不是1)等问题,以下是修正后的完整代码,保存为.js文件即可直接上传:

/**
 *@NApiVersion 2.0
 *@NScriptType UserEventScript
 */
// 声明依赖模块:N/record用来操作记录,N/runtime用来获取执行上下文
define(['N/record', 'N/runtime'], function(record, runtime) {
  function beforeSubmit(context) {
    // 仅创建模式下执行,需要编辑模式也生效可把context.UserEventType.EDIT加入判断
    if (context.type != context.UserEventType.CREATE) return;
    
    const currentRecord = context.newRecord;
    const execContext = runtime.executionContext;
    // 仅UI触发时执行,需要其他触发场景生效可自行扩展判断条件
    if (execContext != runtime.ContextType.USER_INTERFACE) return;

    // 头字段校验逻辑,替换为实际业务的字段ID和判断规则
    const isDropShipAllowed = currentRecord.getValue({
      fieldId: 'custbody_allow_dropship'
    });
    // 示例规则:复选框未选中则终止逻辑
    if (isDropShipAllowed !== true) return;

    // 获取item子列表总行数
    const lineCount = currentRecord.getLineCount({
      sublistId: 'item'
    });

    // 2.0子列表行号从0开始,循环范围为0到lineCount-1
    for (let i = 0; i < lineCount; i++) {
      // 如需校验行字段,在这里调用getSublistValue获取值判断即可
      // const lineFieldVal = currentRecord.getSublistValue({
      //   sublistId: 'item',
      //   fieldId: 'custcol_xxx',
      //   line: i
      // });
      // if (lineFieldVal != 'xxx') continue;

      // 设置createpo字段值为DropShip
      currentRecord.setSublistValue({
        sublistId: 'item',
        fieldId: 'createpo',
        line: i,
        value: 'DropShip'
      });
    }
  }

  return {
    beforeSubmit: beforeSubmit
  };
});

注意:2.0版本在beforeSubmit阶段给行字段赋值不要用selectLine+setCurrentSublistValue的写法,直接用setSublistValue性能更高,也不会出现行指针错误;所有字段ID可通过浏览器按F12,点击目标字段检查元素查看ID属性,不要填写字段的显示名称。

3. 新手部署步骤

  1. 把上面的代码复制到本地文本编辑器,替换自定义字段ID、判断规则为实际业务逻辑,保存为SO_Auto_Set_DropShip_UE.js(文件名不要包含中文和特殊字符)
  2. 进入NetSuite定制 > 脚本 > 新建,选择刚才保存的js文件上传,系统会自动识别脚本类型为User Event脚本
  3. 在脚本配置页面填写脚本名称、脚本ID(ID建议用下划线命名,比如_ue_so_auto_dropship),保存脚本
  4. 点击脚本页面的部署记录按钮新建部署:
    • 应用到:选择销售订单
    • 状态:测试阶段选测试(仅脚本作者和管理员可触发),正式上线选已发布
    • 事件处理子标签下,确认beforeSubmit函数已正确绑定
    • 受众子标签下,选择需要生效的角色、部门,全公司生效则勾选所有角色
  5. 保存部署后,新建销售订单测试逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:39:18