NetSuite工作流动作脚本:创建销售订单时基于自定义记录设置地址字段
解决NetSuite Workflow Action Script设置销售订单地址时的提交错误
问题场景
- 在创建Sales Order(SO)时,通过自定义记录类型设置其地址信息,已完成配置:
- SO上添加了仓库代码自定义主体字段,字段非空时触发工作流动作;
- 拥有存储各类地址值的自定义记录类型,用于给SO的地址子记录赋值。
- 脚本执行到提交步骤时出现错误:
The subrecord line has already been committed or cancelled. The previous subrecord reference is no longer valid. You must get another reference to the subrecord in order to perform this operation.
错误原因
- 动态模式未正确启用:代码中
isDynamic: true仅作为单独语句存在,未赋值给record对象,导致实际以标准模式操作,但后续逻辑却按动态模式处理。 - 子记录引用失效:设置
shipaddresslist为null会重置地址子记录,之前获取的shipaddr引用不再有效,继续操作旧引用触发错误。 - 错误使用
commitLine:shippingaddress是子记录而非子列表,不需要调用commitLine方法。
修复后的代码
/** * @NApiVersion 2.x * @NScriptType WorkflowActionScript */ define(['N/record', 'N/search'], function(record, search) { function onAction(context) { // 正确启用动态模式 var salesOrder = context.newRecord; salesOrder.isDynamic = true; log.debug({ title: 'Start Script' }); // 获取SO上的仓库代码自定义字段值 var warehouseCode = salesOrder.getValue({ fieldId: 'custbody_nsc_amz_warehouse_cod' }); log.debug({ title: 'Custom Field Value', details: warehouseCode }); if (warehouseCode) { // 搜索匹配仓库代码的自定义记录 var warehouseSearch = search.create({ type: 'customrecord_amazon_warehouse_codes', filters: [ ['name', 'is', warehouseCode] ], columns: [ 'custrecord_amz_addr1', 'custrecord_amz_addr2', 'custrecord_amz_city', 'custrecord_amz_state', 'custrecord_amz_zip', 'custrecord_amz_country' ] }); var searchResult = warehouseSearch.run().getRange({ start: 0, end: 1 }); if (searchResult && searchResult.length > 0) { var result = searchResult[0]; log.debug({ title: 'Search Results Found', details: result }); // 先清空默认地址列表 salesOrder.setValue({ fieldId: 'shipaddresslist', value: null }); log.debug({ title: 'Unset Shipping Address List', details: 'Address should be unset' }); // 重置地址后重新获取子记录引用 var shipaddr = salesOrder.getSubrecord({fieldId: 'shippingaddress'}); log.debug({ title: 'Shipping Address', details: shipaddr }); // 设置地址字段,先设置国家 shipaddr.setValue({ fieldId: 'country', value: result.getValue('custrecord_amz_country') || 'US' }); shipaddr.setValue({ fieldId: 'addr1', value: result.getValue('custrecord_amz_addr1') }); shipaddr.setValue({ fieldId: 'addr2', value: result.getValue('custrecord_amz_addr2') }); shipaddr.setValue({ fieldId: 'city', value: result.getValue('custrecord_amz_city') }); shipaddr.setValue({ fieldId: 'state', value: result.getValue('custrecord_amz_state') }); shipaddr.setValue({ fieldId: 'zip', value: result.getValue('custrecord_amz_zip') }); log.debug({ title: 'Shipping Address Set Successfully' }); } else { log.debug({ title: 'No Matching Warehouse Record Found' }); } } else { log.debug({ title: 'No Warehouse Code Specified' }); } } return { onAction: onAction }; });
关键修复点
- 正确启用动态模式:将
isDynamic: true改为salesOrder.isDynamic = true,确保记录以动态模式加载。 - 调整操作顺序:先清空
shipaddresslist,再重新获取shippingaddress子记录引用,避免使用失效的旧引用。 - 移除错误的
commitLine调用:shippingaddress是子记录,修改后自动同步到主记录,无需提交行操作。
内容的提问来源于stack exchange,提问作者ksmera01
相关产品推荐
相关产品推荐

