You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:36:21