SuiteScript 2.0:如何通过脚本更新Classification记录的External ID
解决NetSuite SuiteScript 2.0定时脚本无法更新Classification External ID的问题
我来帮你搞定这个NetSuite External ID更新的问题——你的代码里有两个关键问题导致失败,我逐一给你拆解并修正:
1. 字段名大小写搞错了
NetSuite的record.submitFields()方法认的是全小写的内部字段ID,External ID的正确字段名是externalid,不是你写的externalId(驼峰写法在这儿行不通)。
2. 赋值逻辑完全反了
你现在是把搜索到的空externalid值又塞回去,等于啥也没改啊!按照你的需求,应该用其他字段(比如项目名称name或者自定义字段custrecord_proj_full_name)来生成新的External ID才对。
修正后的完整代码
/** * @NApiVersion 2.0 * @NScriptType ScheduledScript */ define(['N/runtime','N/log','N/record','N/search'], function(runtime,log,record,search) { var qtyProjects=0; function execute(context) { try { log.debug('Script Started'); /********** Update Project (Classes) External ID ***********/ var classificationSearchObj = search.create({ type: "classification", filters: [ ["externalid","is","@NONE@"] ], columns: [ search.createColumn({name: "name",label: "Name"}), search.createColumn({name: "custrecord_proj_full_name",label: "FullName"}), search.createColumn({name: "custrecord_proj_manager",label: "ProjectManager"}), search.createColumn({name: "externalid",label: "Externalid"}) ] }); var prj_srch = classificationSearchObj.run().each(processProject); log.debug('Quantity of projects: ',qtyProjects); log.debug('Script Finished'); } catch(e) { log.debug('Error',e.message); } } function processProject(result) { var number = result.getValue({name: "name"}); var fullName = result.getValue({name: "custrecord_proj_full_name"}); var currentExternalId = result.getValue({name: "externalid"}); qtyProjects++; // 这里用fullName生成External ID,你可以根据需求调整规则(比如替换空格、加前缀) var newExternalId = fullName ? fullName.replace(/\s+/g, '_') : number; log.debug('Update Details: ', `${number} | ${fullName} | 当前ExternalID: ${currentExternalId} | 新ExternalID: ${newExternalId}`); try { record.submitFields({ type: record.Type.CLASSIFICATION, // 推荐用枚举类型,避免拼写错误 id: result.id, values: { "externalid": newExternalId, // 这里用了正确的字段名 "custrecord_proj_full_name": "Test Ale 2" // 保留你原来的测试字段更新 }, options: { ignoreMandatoryFields: true // 忽略必填字段,防止更新时被卡住 } }); } catch(updateErr) { log.error(`更新Classification ${result.id}失败`, updateErr.message); } return true; // 必须返回true才能继续处理下一条记录,原代码注释掉了这个! } return { execute: execute }; });
额外要注意的点
- External ID必须唯一:NetSuite要求同类型记录的External ID不能重复,所以生成
newExternalId的时候最好加个去重逻辑,比如拼接记录ID,或者把特殊字符替换掉(比如空格换成下划线)。 - 用枚举类型更靠谱:用
record.Type.CLASSIFICATION代替字符串'classification',能避免拼写错误,代码也更易读。 - 单独捕获更新错误:在处理每条记录的时候单独加错误捕获,这样某一条更新失败不会导致整个脚本挂掉。
- 别忘return true:搜索遍历的
each方法里,必须返回true才能继续处理下一条,你原代码把这个注释掉了,会导致只处理第一条记录就停了。
内容的提问来源于stack exchange,提问作者Alessandro Aguiar
相关产品推荐
相关产品推荐

