如何在SuiteScript中将内部ID转换为可读的名称值

在suitescript中,`getvalue()` 返回字段的内部id(如员工id),而 `gettext()` 可返回其对应显示名称(如员工姓名);但需注意:`gettext()` 仅对已加载的记录(尤其是通过 `record.load()` 加载的完整记录)有效,无法直接在当前动态创建/编辑的上下文中调用。

在构建邮件通知(如销售单据创建后的自动提醒)时,若需将 salesrep 字段展示为销售代表的真实姓名而非内部ID(例如 12345),关键在于正确使用 record.getText() 方法——但它有一个重要前提:该方法不能作用于尚未保存或仅处于客户端/临时状态的记录(如 currentRecord 在用户界面脚本或用户事件 beforeSubmit 中的实例),而必须基于通过 record.load() 显式加载的、服务端完整的记录对象。

✅ 正确做法如下(以用户事件脚本为例):

/**
 * @NApiVersion 2.1
 * @NScriptType UserEvent
 */
define(['N/currentRecord', 'N/record'], function(currentRecord, record) {
    function afterSubmit(context) {
        if (context.type === context.UserEventType.CREATE) {
            var recordId = context.newRecord.id;
            var recordType = context.newRecord.type;

            // ✅ 必须重新加载记录(服务端完整加载)
            var loadedRecord = record.load({
                type: recordType,
                id: recordId,
                isDynamic: true
            });

            // ✅ getText() 获取销售代表的显示名称(如 "张三")
            var repName = loadedRecord.getText({ fieldId: 'salesrep' });

            // 构建邮件内容(示例)
            var documentNum = loadedRecord.getText({ fieldId: 'tranid' }); // 使用getText获取单号显示值更安全
            var emailBody = "Details Below:
" + documentNum + "
Sales Rep: " + repName; // 后续发送邮件逻辑(略) log.debug('Email Body', emailBody); } } return { afterSubmit: afterSubmit }; });

⚠️ 注意事项:

  • currentRecord.getValue({fieldId: 'salesrep'}) 在 beforeSubmit 或 afterSubmit 中返回的是内部ID(数字),不支持 getText() —— 因为 currentRecord 是轻量级引用,未加载关联记录元数据;
  • record.load() 是必需步骤:它从数据库拉取完整记录,使系统能解析下拉字段、列表字段等的文本映射关系;
  • 若字段为空(如未指定销售代表),getText() 将返回空字符串 '',建议增加空值校验;
  • 对于自定义字段(如 custbody_sales_rep_mgr),同样适用 getText(),前提是该字段类型支持文本解析(如 list、entity、select 等);
  • 性能提示:record.load() 会产生一次服务端查询,请避免在循环中频繁调用;如需批量处理,可考虑 search.create() 配合 search.lookupFields() 替代。

总结:将内部ID转为可读名称的本质,是利用NetSuite服务端的字段元数据映射能力。getText() 是标准且可靠的解决方案,但必须搭配 record.load() 使用——这是SuiteScript中“ID→Name”转换不可绕过的最佳实践。