NetSuite客户端脚本生产环境失效问题求助
在NetSuite中为销售订单(SO)新增自定义选择项,开发了UserEvent Script与ClientScript。沙箱环境中两个脚本均正常运行,但生产环境仅UserEvent Script工作正常,ClientScript完全失效。相关代码如下:
UserEvent Script(beforeLoad入口)
EntryPoint.beforeLoad = (context) => { const LOGTITLE = "beforeload " + context.newRecord.id; try { if(context.form && context.type == context.UserEventType.EDIT) { var currentForm = context.form; currentForm.addField({ id: 'custpage_paymentoption', type: 'SELECT', label: 'Custom Payment Option', }); } } catch (e) { log.error(LOGTITLE, JSON.stringify(e)); } return true; }
ClientScript(fieldChanged入口)
EntryPoint.fieldChanged = (scriptContext) => { const LOGTITLE = "fieldChanged " + scriptContext.currentRecord.id; try { var record = scriptContext.currentRecord; if (scriptContext.fieldId == 'custpage_paymentoption') { var currentOption = record.getValue({ fieldId: 'custpage_paymentoption', }) log.debug('currentOption', currentOption); record.setValue({ fieldId: 'paymentoption', value: currentOption, ignoreFieldChange: true, forceSyncSourcing: true }); } } catch (e) { log.error(LOGTITLE, JSON.stringify(e)); } };
以下是针对生产环境ClientScript失效的排查与修复步骤:
检查ClientScript部署配置
确认生产环境中ClientScript的部署状态为「已启用」,且部署记录的「应用到」选项正确选择了销售订单类型。同时检查部署的过滤条件(如子公司、部门、角色),确保目标订单符合规则;需确认部署的「执行模式」包含「编辑」模式(因为UserEvent仅在EDIT时添加临时字段)。关联ClientScript到临时字段
UserEvent中添加的custpage_paymentoption是临时字段,生产环境可能因表单渲染顺序导致ClientScript无法识别该字段。可在UserScript的addField后显式关联ClientScript:const customField = currentForm.addField({ id: 'custpage_paymentoption', type: 'SELECT', label: 'Custom Payment Option', }); // 替换为你的ClientScript的实际ID customField.setScript('customscript_your_client_script_id');验证角色权限与执行上下文
确认生产环境中操作订单的角色拥有以下权限:查看paymentoption字段的权限、执行ClientScript的权限。沙箱与生产环境的角色权限可能不一致,需同步配置。同时确认测试的订单处于「编辑」模式,非EDIT模式下临时字段不存在,ClientScript不会触发。增强ClientScript的容错性
在ClientScript中添加字段存在性判断,避免因生产环境字段未加载导致的静默失败:EntryPoint.fieldChanged = (scriptContext) => { const LOGTITLE = "fieldChanged " + scriptContext.currentRecord.id; try { var record = scriptContext.currentRecord; if (scriptContext.fieldId == 'custpage_paymentoption') { // 先检查自定义字段是否存在 if (!record.hasField({ fieldId: 'custpage_paymentoption' })) { log.error(LOGTITLE, "custpage_paymentoption field not found"); return; } var currentOption = record.getValue({ fieldId: 'custpage_paymentoption', }); log.info('currentOption', currentOption); // 改用info级别确保生产环境可见 // 检查目标字段是否存在 if (!record.hasField({ fieldId: 'paymentoption' })) { log.error(LOGTITLE, "paymentoption field not found"); return; } record.setValue({ fieldId: 'paymentoption', value: currentOption, ignoreFieldChange: true, forceSyncSourcing: true }); } } catch (e) { log.error(LOGTITLE, JSON.stringify(e)); } };清除生产环境表单缓存
NetSuite生产环境的表单缓存可能保留旧配置,导致新字段或脚本未生效。以管理员角色登录后,进入销售订单表单,点击自定义 > 清除表单缓存,然后重新部署两个脚本并刷新测试。
内容的提问来源于stack exchange,提问作者Core

