如何通过SuiteScript 2在NetSuite销售订单中设置自定义段值?
如何通过SuiteScript 2设置NetSuite销售订单的自定义段值
问题背景
- 自定义段Revenue Channel的ID为
cseg1,记录ID为customrecord_cseg1,已关联销售订单,但仅在标准销售订单表单中可见 - 界面设置该字段值后,通过SuiteScript搜索/加载订单时无法找到该字段
- 创建销售订单时,尝试用
setText()和setValue()设置cseg1均不生效,且无报错信息
搜索订单的代码(无法找到自定义段字段)
require(['N/search', 'N/record'], function(search, record){ var nsSalesOrderIds = [] search .create({ type: search.Type.SALES_ORDER, filters: [ search.createFilter({ name: 'internalid', operator: search.Operator.IS, values: 123, }), ], }) .run() .each(function (result) { console.log(result.toJSON()) if (result.id) nsSalesOrderIds.push(result.id) }) console.log(nsSalesOrderIds) var objRecord = record.load({ type: search.Type.SALES_ORDER, id: nsSalesOrderIds[0], columns: 'itemid' }); var objFields = objRecord.getFields(); var emptyFields = [] for (var i = 0; i < objFields.sort().length; i++) { var val = objRecord.getValue({ fieldId: objFields[i] }); console.log(objFields[i] + ' = ' + val) } var sublistName = objRecord.getSublists(); console.log(sublistName.sort()) var itemFields = objRecord.getSublistFields({ sublistId: 'item' }); console.log(itemFields.sort()) })
创建订单的代码(无法设置自定义段值)
require(['N/record'], function(record){ try { var salesOrder = record.create({ type: record.Type.SALES_ORDER, isDynamic: true, defaultValues: { "entity": 123, }, }); salesOrder.setValue({ "fieldId": 'location', "value": 3123, }) salesOrder.setText({ "fieldId": "datecreated", "text": "7/18/2022", }); // 尝试设置自定义段,无效果也无报错 salesOrder.setText({ "fieldId": 'cseg1', "text": 'My Custom Value', "ignoreFieldChange": true }) // 另一种尝试,同样无效 salesOrder.setValue({ "fieldId": 'cseg1', "value": 1, }) // 设置行项目 salesOrder.selectNewLine({ "sublistId": 'item' }); salesOrder.setCurrentSublistValue({ "sublistId": 'item', "fieldId": 'item', "value": 2121 }); salesOrder.setCurrentSublistValue({ "sublistId": 'item', "fieldId": 'quantity', "value": 1 }); salesOrder.commitLine({ "sublistId": 'item' }); var newSalesOrderId = salesOrder.save(); console.log('newSalesOrderId', newSalesOrderId) } catch (err) { console.log(err.toJSON()) } })
解决方案
1. 确保字段可见性与角色权限
- 检查自定义段所在的表单:如果仅在标准表单可见,需确保脚本运行的角色有权限访问该表单,或者将自定义段添加到默认使用的销售订单表单中
- 在自定义段设置页面,确认应用对象已勾选「销售订单」(交易类型)
2. 调整搜索与记录加载逻辑
- 搜索时显式指定自定义段列:默认搜索不会返回所有字段,需在
columns中添加cseg1才能获取其值:search.create({ type: search.Type.SALES_ORDER, filters: [...], columns: [ search.createColumn({name: 'internalid'}), search.createColumn({name: 'cseg1'}) // 加入自定义段列 ] }) - 加载记录时强制获取所有字段:使用
allFields: true参数加载所有字段,不受表单隐藏设置影响:var objRecord = record.load({ type: search.Type.SALES_ORDER, id: nsSalesOrderIds[0], allFields: true });
3. 修正动态模式下的字段设置
动态模式(isDynamic: true)下,若自定义段位于特定标签页,需先切换到对应标签再设置值:
// 切换到包含自定义段的标签(示例为'main'标签,需根据实际调整) salesOrder.navigateToField({ fieldId: 'cseg1', tab: 'main' }); // 再设置值(优先用setValue传入内部ID,比setText更可靠) salesOrder.setValue({ fieldId: 'cseg1', value: 1 // 自定义段选项的内部ID });
4. 尝试静态模式创建记录
静态模式(isDynamic: false)无需处理标签切换,直接设置字段值更稳定:
var salesOrder = record.create({ type: record.Type.SALES_ORDER, isDynamic: false, defaultValues: { "entity": 123, }, }); // 直接设置自定义段的内部ID salesOrder.setValue({ fieldId: 'cseg1', value: 1 }); // 后续行项目设置逻辑不变...
内容的提问来源于stack exchange,提问作者Mule
相关产品推荐
相关产品推荐

