NetSuite MapReduce SuiteScript执行报错求助:语句缺失分号
NetSuite MapReduce脚本执行失败排查与修复
问题概述
在NetSuite中调用已保存搜索执行销售订单MapReduce处理时,脚本执行失败,报错信息:
Fail to evaluate script: {"type":"error.SuiteScriptModuleLoaderError","name":"UNEXPECTED_ERROR","message":"missing ; before statement (SS_SCRIPT_FOR_METADATA#73)","stack":[]}
错误原因分析
- define语法错误:
define(['N/record']),多了一个右括号,违反SuiteScript 2.x模块定义语法,这是触发当前报错的直接原因。 - 已保存搜索加载方式错误:用
record.load()加载已保存搜索是错误的,该方法用于加载业务记录,已保存搜索需使用N/search模块的search.load()。 - getInputData无返回值:MapReduce的
getInputData函数必须返回搜索对象、结果数组等合法数据源,原代码未返回任何内容,导致Map阶段无数据可处理。 - 变量混淆与未定义:Map函数中使用了未定义的
recordId变量,应使用导入的record模块;context.write中的context应为mapContext,且write方法需同时传入key和value。 - Summarize函数无效调用:存在无参数的
log.audit()调用,且输出内容逻辑混乱,无实际诊断意义。
修正后的完整代码
/** *@NApiVersion 2.x *@NScriptType MapReduceScript *@NModuleScope SameAccount */ define(['N/record', 'N/search', 'N/log'], function(record, search, log) { function getInputData() { try { // 用search.load加载已保存搜索 var mySearch = search.load({ id: 'customsearch_my_so_search' }); // 返回搜索对象,MapReduce自动迭代结果 return mySearch; } catch(e) { log.debug('Error in GET INPUT DATA', e); // 异常时返回空数组避免脚本中断 return []; } } function map(mapContext) { try { var searchResult = JSON.parse(mapContext.value); var salesOrderId = searchResult.id; // 用record模块加载销售订单,修正变量错误 var objRecord = record.load({ type: record.Type.SALES_ORDER, id: salesOrderId, isDynamic: true }); // 此处添加需要对销售订单执行的业务逻辑(示例:修改字段) // objRecord.setValue({fieldId: 'status', value: 'Pending Approval'}); // 保存记录,修正变量命名 var savedRecordId = objRecord.save({ enableSourcing: true, ignoreMandatoryFields: true }); // 正确调用mapContext.write,传入key和value mapContext.write({ key: salesOrderId, value: savedRecordId }); } catch(e) { log.error('Exception in MAP', e); } } function summarize(summary) { try { // 输出脚本总使用量 log.audit('Script Usage', 'Total Usage: ' + summary.usage); // 遍历Map阶段的错误日志 summary.mapSummary.errors.iterator().each(function(key, error) { log.error('Map Error for Key: ' + key, error); return true; }); } catch(e) { log.error("Exception in SUMMARIZE", e); } } return { getInputData: getInputData, map: map, summarize: summarize }; });
关键修复说明
- 修正模块定义语法:移除
define调用后多余的右括号,符合SuiteScript 2.x模块规范。 - 导入必要模块:添加
N/search用于加载已保存搜索,N/log用于规范日志输出。 - 修复输入数据逻辑:
getInputData返回加载后的搜索对象,让MapReduce自动处理结果;异常时返回空数组避免脚本中断。 - Map函数变量修正:替换错误变量名,完善
write方法参数,确保逻辑合法。 - 优化Summarize函数:移除无效日志调用,改为输出脚本使用量和Map阶段错误,便于问题排查。
内容的提问来源于stack exchange,提问作者Kayle Davis
相关产品推荐
相关产品推荐

