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 }); } } }
待解决问题
- SuiteScript 1.0版本的
beforeSubmit事件中,如何添加if判断逻辑校验销售订单头层面的字段值 - 如何编写可正常运行的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. 新手部署步骤
- 把上面的代码复制到本地文本编辑器,替换自定义字段ID、判断规则为实际业务逻辑,保存为
SO_Auto_Set_DropShip_UE.js(文件名不要包含中文和特殊字符) - 进入NetSuite
定制 > 脚本 > 新建,选择刚才保存的js文件上传,系统会自动识别脚本类型为User Event脚本 - 在脚本配置页面填写脚本名称、脚本ID(ID建议用下划线命名,比如
_ue_so_auto_dropship),保存脚本 - 点击脚本页面的
部署记录按钮新建部署:- 应用到:选择
销售订单 - 状态:测试阶段选
测试(仅脚本作者和管理员可触发),正式上线选已发布 - 事件处理子标签下,确认
beforeSubmit函数已正确绑定 - 受众子标签下,选择需要生效的角色、部门,全公司生效则勾选所有角色
- 应用到:选择
- 保存部署后,新建销售订单测试逻辑即可。
内容的提问来源于stack exchange,提问作者AWendel
相关产品推荐
相关产品推荐

