NetSuite Restlet中无法通过externalid筛选客户记录的问题
问题描述
在NetSuite Restlet中尝试通过externalid对Customer记录执行Upsert操作,因为Restlet仅支持通过internal id加载记录,所以用search.create基于externalid设置筛选条件,却触发了以下错误:
"name":"SSS_INVALID_SRCH_OPERATOR","message":"An nlobjSearchFilter contains an invalid operator, or is not in proper syntax: externalid."
相同的筛选语法用在其他字段上完全正常,但externalid无法被筛选,需要解决该问题并实现通过externalid直接完成Upsert的需求。
原代码如下:
/** *@NApiVersion 2.x *@NScriptType Restlet */ define(['N/record', 'N/search', 'N/error'], function(record, search, error) { // Create a NetSuite record from request params function post(context) { try { // Get the external ID and other fields from the request parameters var externalId = context.externalId; var email = context.email; var companyname = context.companyname; var subsidiary = context.subsidiary; var taxitem = context.taxitem; // Add other fields as needed // Search for the customer record based on external ID var customerSearch = search.create({ type: search.Type.CUSTOMER, filters: [ ['externalid', search.Operator.IS, externalId] ] }); var searchResults = customerSearch.run().getRange({ start: 0, end: 1 }); if (searchResults && searchResults.length > 0) { // If a matching record is found, update the existing record var customerId = searchResults[0].id; var existingRecord = record.load({ type: record.Type.CUSTOMER, id: customerId, isDynamic: true }); // Set fields for the existing record existingRecord.setValue({ fieldId: 'email', value: email }); existingRecord.setValue({ fieldId: 'companyname', value: companyname }); existingRecord.setValue({ fieldId: 'subsidiary', value: subsidiary }); existingRecord.setValue({ fieldId: 'taxitem', value: taxitem }); // Set other fields as needed // Save the existing record var updatedCustomerId = existingRecord.save(); // Return the ID of the updated record return { success: true, message: 'Customer record updated successfully', customerId: updatedCustomerId }; } else { // If no matching record is found, create a new record var newRecord = record.create({ type: record.Type.CUSTOMER, isDynamic: true }); // Set fields for the new record newRecord.setValue({ fieldId: 'email', value: email }); newRecord.setValue({ fieldId: 'externalid', value: externalId }); newRecord.setValue({ fieldId: 'companyname', value: companyname }); newRecord.setValue({ fieldId: 'subsidiary', value: subsidiary }); newRecord.setValue({ fieldId: 'taxitem', value: taxitem }); // Set other fields as needed // Save the new record var newCustomerId = newRecord.save(); // Return the ID of the newly created record return { success: true, message: 'New customer record created successfully', customerId: newCustomerId }; } } catch (e) { // Handle errors and return an error object return { success: false, error: e.toString() }; } } return { post: post }; });
问题原因
NetSuite的Search API中,externalid属于系统保留字段,直接使用['externalid', search.Operator.IS, externalId]的数组格式筛选会触发语法识别错误,该字段需要特殊的引用方式。
解决方法
有两种可行方案实现需求,推荐第二种更高效的方式:
方案1:修正搜索筛选语法
改用search.createFilter定义筛选条件,或直接使用字符串运算符替代枚举值:
// 方式1:使用search.createFilter var customerSearch = search.create({ type: search.Type.CUSTOMER, filters: [ search.createFilter({ name: 'externalid', operator: search.Operator.IS, values: externalId }) ] }); // 方式2:使用字符串运算符 var customerSearch = search.create({ type: search.Type.CUSTOMER, filters: [ ['externalid', 'is', externalId] ] });
方案2:直接用record.load加载externalid(推荐)
NetSuite 2.x的record.load方法支持直接通过externalid加载记录,无需先执行搜索,代码更简洁高效。逻辑为:尝试通过externalid加载记录,成功则更新,捕获RECORD_NOT_FOUND错误则创建新记录。
完整修正后的代码:
/** *@NApiVersion 2.x *@NScriptType Restlet */ define(['N/record'], function(record) { function post(context) { try { var externalId = context.externalId; var email = context.email; var companyname = context.companyname; var subsidiary = context.subsidiary; var taxitem = context.taxitem; // 尝试通过externalId加载现有客户记录 var existingRecord = record.load({ type: record.Type.CUSTOMER, id: externalId, isDynamic: true, options: { enableSourcing: false, ignoreMandatoryFields: true } }); // 更新记录字段 existingRecord.setValue({fieldId: 'email', value: email}); existingRecord.setValue({fieldId: 'companyname', value: companyname}); existingRecord.setValue({fieldId: 'subsidiary', value: subsidiary}); existingRecord.setValue({fieldId: 'taxitem', value: taxitem}); var updatedCustomerId = existingRecord.save(); return { success: true, message: '客户记录更新成功', customerId: updatedCustomerId }; } catch (e) { // 捕获记录不存在的错误,创建新记录 if (e.name === 'RECORD_NOT_FOUND') { var newRecord = record.create({type: record.Type.CUSTOMER, isDynamic: true}); newRecord.setValue({fieldId: 'email', value: email}); newRecord.setValue({fieldId: 'externalid', value: externalId}); newRecord.setValue({fieldId: 'companyname', value: companyname}); newRecord.setValue({fieldId: 'subsidiary', value: subsidiary}); newRecord.setValue({fieldId: 'taxitem', value: taxitem}); var newCustomerId = newRecord.save(); return { success: true, message: '新客户记录创建成功', customerId: newCustomerId }; } else { // 处理其他异常 return { success: false, error: e.toString() }; } } } return { post: post }; });
内容的提问来源于stack exchange,提问作者user19976880

