NetSuite创建库存副本时获取原记录ID为空问题求助
问题分析与解决方案
核心问题
在NetSuite UserEventScript的CREATE事件中,context.oldRecord本身就是null——因为CREATE事件对应全新记录的创建,不存在旧记录上下文。你通过复制原物料生成副本的操作,原物料的信息不会通过oldRecord传递,而是隐藏在请求的URL参数中。
修正方案
通过解析当前请求的URL参数获取原物料ID,再完成后续逻辑:
修改后的代码
/** *@NApiVersion 2.0 *@NScriptType UserEventScript */ define(["N/url", "N/record", "N/runtime"], function (url, record, runtime) { function afterSubmit(context){ var newRecord = context.newRecord; var eventType = context.type; var itemName = newRecord.getValue({fieldId:'itemid'}); var isCopy = newRecord.getValue({fieldId:'custitem17'}); // 仅处理CREATE事件,且是标记为副本的记录 if(eventType !== context.UserEventType.CREATE || !isCopy) return; // 从URL参数中获取原物料的source ID var currentUrl = runtime.getCurrentScript().getParameter({name: 'currentUrl'}); var urlParams = url.parse({url: currentUrl, parseQuery: true}); var sourceItemId = urlParams.query.source; if(!sourceItemId) return; // 验证新物料名称是否以"-c"结尾 var sourceRecord = record.load({type: newRecord.type, id: sourceItemId}); var sourceItemName = sourceRecord.getValue({fieldId: 'itemid'}); if(itemName === sourceItemName + '-c'){ // 将原物料ID填入指定字段(若需原物料名称,替换为sourceItemName) record.submitFields({ type: newRecord.type, id: newRecord.id, values:{custitem_item_link: sourceItemId} }); } } return{ afterSubmit:afterSubmit } });
关键修改点
- 移除
context.oldRecord依赖:改用NetSuite复制记录时默认携带的URL参数source获取原物料ID - 修正语法错误:将条件判断中的赋值操作
=改为相等比较===,修复逻辑判断的语法问题 - 优化流程逻辑:提前过滤不符合条件的事件和记录,避免无效执行
- 明确字段赋值:如果
custitem_item_link字段需要原物料的内部ID,直接用sourceItemId;若需要原物料的名称itemid,则替换为sourceItemName
额外注意事项
- 脚本部署时需勾选在复制时执行选项
- 确保脚本拥有加载物料记录、提交字段更新的权限
内容的提问来源于stack exchange,提问作者Abdul bazith
相关产品推荐
相关产品推荐

