NetSuite工作流动作脚本报错:TypeError: Cannot read property 'getValue' of null
NetSuite客户记录变更排查:TypeError问题分析与解决
问题描述
编辑保存NetSuite客户记录时触发以下错误:
TypeError: Cannot read property 'getValue' of null [at Object.onAction]
仅能打印newRecord相关日志,字段对比逻辑无法正常执行。
错误根源
oldRecord为空:Workflow Action Script的scriptContext中,oldRecord并非在所有编辑场景下都存在。若Workflow触发时机为「记录提交后」,或未满足同步获取旧记录的条件,oldRecord会返回null,直接调用其getValue方法就会触发空指针错误。- 字段ID错误:原代码中
CUSTOMER_FIELDS里的id不是NetSuite 2.x API的标准字段名,客户记录的内部ID字段应为internalid。 - 无效重复提交:循环内只要检测到字段变更就调用
record.submitFields,会重复执行提交操作,浪费治理单元。
修复方案
1. 先校验oldRecord是否存在
在使用oldRecord的方法前,必须先判断其是否为null,避免空指针异常。
2. 修正字段ID
将CUSTOMER_FIELDS中的id替换为internalid,匹配NetSuite标准字段名。
3. 优化提交逻辑
将提交操作移到循环外,仅当检测到字段变更时执行一次提交,减少治理单元消耗。
修正后的代码
/** * @NApiVersion 2.1 * @NScriptType workflowactionscript */ define(["N/record", "N/runtime", "N/redirect"], function ( record, runtime, redirect ) { let GLOBALVAR = { CUSTOMER: { RECORD: "customer", ID: "internalid", STATUS: "custentity_custstatus", INACTIVE: "inactive", }, CUSTOMER_FIELDS: [ "internalid", // 替换原id为标准字段名 "isperson", "companyname", "entitystatus", "salesrep", "partner", "url", "category", "comments", "email", "phone", "defaultaddress" ], }; function onAction(scriptContext) { log.debug("onAction", "onAction"); let objScript = runtime.getCurrentScript(); if (scriptContext.type === "edit") { let oldRec = scriptContext.oldRecord; let newRec = scriptContext.newRecord; let customerfields_updated = false; // 先校验旧记录是否存在 if (!oldRec) { log.error("oldRecord为空", "无法获取旧记录进行字段对比"); return; } for (let i = 0; i < GLOBALVAR.CUSTOMER_FIELDS.length; i++) { let fieldId = GLOBALVAR.CUSTOMER_FIELDS[i]; try { let newValue = newRec.getValue({ fieldId: fieldId }); let oldValue = oldRec.getValue({ fieldId: fieldId }); if (oldValue !== newValue) { customerfields_updated = true; break; // 检测到变更后跳出循环,无需继续对比 } } catch (e) { log.error(`字段对比失败: ${fieldId}`, e.message); } } // 确认有变更后再执行提交 if (customerfields_updated) { try { record.submitFields({ type: GLOBALVAR.CUSTOMER.RECORD, id: newRec.id, values: { 'isinactive': true, }, }); log.debug("客户字段已更新", customerfields_updated); } catch (submitErr) { log.error("提交字段失败", submitErr.message); } } log.debug('_剩余治理单元: ', objScript.getRemainingUsage()); } } return { onAction: onAction, }; });
额外注意事项
- 确认Workflow触发时机:若需获取
oldRecord,建议将Workflow事件设置为「记录提交前」;若必须用「提交后」,则需通过record.load手动加载旧记录(注意消耗治理单元)。 - 权限检查:确保脚本关联的角色拥有所有对比字段的读取权限,避免
getValue因权限不足报错。
内容的提问来源于stack exchange,提问作者Mil
相关产品推荐
相关产品推荐

