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

NetSuite Estimate记录beforeLoad脚本需二次加载赋值问题排查

NetSuite User Event脚本:Estimate页面加载后立即填充合同状态字段

问题描述

我在运行一个NetSuite User Event脚本,逻辑是在Estimate记录的VIEW页面加载时,读取custbody_f5_insp_contract_num字段作为参数调用外部API,获取合同状态后赋值给custbody_contract_status字段。但现在需要加载两次页面,该字段才会显示数据,希望实现页面加载完成后立即填充并显示该字段。

原脚本代码:

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 */

define(["N/https", "N/record", "N/log", "N/url"], function (
  https,
  record,
  log,
  url
) {
  function beforeLoad(scriptContext) {
    if (scriptContext.type === scriptContext.UserEventType.VIEW) {
        var estimate = scriptContext.newRecord;

        var estimateRecord = record.load({
          type: "estimate",
          id: estimate.id,
        });
        var insphireContractNumber = estimateRecord.getValue({
          fieldId: "custbody_f5_insp_contract_num",
        });

        // log.debug("estimateRecord", estimateRecord);

        var insphireContractStatusUrl = url.format({
          domain:
            "https://ag-dev-dock.accessgroup.net.au/aps/Public/ProductionContractStatus?",

          params: {
            contractNo: insphireContractNumber,
          },
        });

        var insphireContractStatusResponse = https.get({
          method: https.Method.GET,

          url: insphireContractStatusUrl,
        });

        log.debug(
          "insphireContractStatusResponse",
          insphireContractStatusResponse
        );

        var insphireContractStatusParsed = JSON.parse(
          insphireContractStatusResponse.body
        );

        if (insphireContractStatusParsed.hasOwnProperty("resultFlag")) {
          log.debug(
            "Insphire Contract Status Error",
            insphireContractStatusParsed.message
          );
        } else {
          var contractStatusValue = insphireContractStatusParsed.contractStatus;
          log.debug("contractStatusValue1", contractStatusValue);

          switch (contractStatusValue) {
            case "0":
              contractStatusValue = 1;
              break;
            case "1":
              contractStatusValue = 2;
              break;
            case "2":
              contractStatusValue = 3;
              break;
            case "4":
              contractStatusValue = 4;
              break;
            default:
              contractStatusValue = 5;
              break;
          }

          log.debug("contractStatusValue2", contractStatusValue);
          log.debug("typeof", typeof contractStatusValue);

          estimateRecord.setValue({
            fieldId: "custbody_contract_status",
            value: contractStatusValue
          });

          estimateRecord.save();
        }
    }
  }
  return {
    beforeLoad: beforeLoad
  };
});

问题根源

原脚本在beforeLoad事件中重新加载记录、修改后调用save(),但此时页面已经基于初始的记录数据开始渲染,所以第一次打开页面时显示的是旧值;第二次加载时才会读取到数据库中已更新的新值。

解决方案

修改脚本逻辑,直接使用scriptContext.newRecord获取字段值,通过record.submitFields()批量更新数据库,同时修改newRecord的字段值让当前页面立即显示结果,无需刷新:

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 */

define(["N/https", "N/record", "N/log", "N/url"], function (
  https,
  record,
  log,
  url
) {
  function beforeLoad(scriptContext) {
    if (scriptContext.type === scriptContext.UserEventType.VIEW) {
        var estimate = scriptContext.newRecord;
        // 直接从newRecord获取合同编号,无需重新加载记录
        var insphireContractNumber = estimate.getValue({
          fieldId: "custbody_f5_insp_contract_num",
        });

        // 若合同编号为空,直接退出
        if (!insphireContractNumber) {
            log.debug("No Contract Number", "custbody_f5_insp_contract_num is empty");
            return;
        }

        var insphireContractStatusUrl = url.format({
          domain: "https://ag-dev-dock.accessgroup.net.au/aps/Public/ProductionContractStatus?",
          params: {
            contractNo: insphireContractNumber,
          },
        });

        try {
            var insphireContractStatusResponse = https.get({
              url: insphireContractStatusUrl,
            });

            log.debug("insphireContractStatusResponse", insphireContractStatusResponse);

            var insphireContractStatusParsed = JSON.parse(
              insphireContractStatusResponse.body
            );

            if (insphireContractStatusParsed.hasOwnProperty("resultFlag")) {
              log.debug(
                "Insphire Contract Status Error",
                insphireContractStatusParsed.message
              );
              return;
            }

            var contractStatusValue = insphireContractStatusParsed.contractStatus;
            log.debug("contractStatusValue1", contractStatusValue);

            // 转换状态值
            switch (contractStatusValue) {
              case "0":
                contractStatusValue = 1;
                break;
              case "1":
                contractStatusValue = 2;
                break;
              case "2":
                contractStatusValue = 3;
                break;
              case "4":
                contractStatusValue = 4;
                break;
              default:
                contractStatusValue = 5;
                break;
            }

            log.debug("contractStatusValue2", contractStatusValue);

            // 1. 直接更新数据库字段,无需加载整条记录
            record.submitFields({
              type: record.Type.ESTIMATE,
              id: estimate.id,
              values: {
                custbody_contract_status: contractStatusValue
              },
              options: {
                enableSourcing: false,
                ignoreMandatoryFields: true
              }
            });

            // 2. 修改newRecord的字段值,让当前页面立即显示更新后的数据
            estimate.setValue({
              fieldId: "custbody_contract_status",
              value: contractStatusValue
            });

        } catch (e) {
            log.error("API Call Error", e.message);
        }
    }
  }
  return {
    beforeLoad: beforeLoad
  };
});

关键优化点

  • 避免重复加载记录:直接使用scriptContext.newRecord读取字段,提升脚本性能
  • 使用record.submitFields():高效更新单个字段,比加载整条记录再save()更轻量
  • 修改newRecord字段值:确保当前页面渲染时直接显示最新的合同状态,无需二次加载
  • 增加异常捕获:处理API调用失败的情况,避免脚本中断

内容的提问来源于stack exchange,提问作者cristian cabacaba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:15:19