SuiteScript 2.x定时脚本上传报错:需实现脚本类型函数求助
解决NetSuite定时脚本上传报错:SuiteScript 2.x entry point scripts must implement one script type function
问题描述
上传NetSuite定时脚本(Scheduled Script)时收到报错:
SuiteScript 2.x entry point scripts must implement one script type function
脚本已按要求实现execute入口函数,但无法完成上传测试。
错误分析及修复方案
以下是脚本中导致报错的关键问题及修复方式:
- 缺失
N/email模块依赖:catch块中调用了email.send(),但define的依赖数组未包含N/email,导致脚本加载异常,NetSuite无法识别入口函数。需在依赖数组中添加'N/email'。 - 字符串未闭合:catch块中
var body = 'There has been an error in ;末尾单引号缺失,属于语法错误,导致脚本解析失败。需补全单引号,并建议添加错误详情。 record.save()调用错误:markAsSoldOut和inactivateItems函数中,调用record.save()时未传入加载的itemRecord对象,正确写法应为itemRecord.save()。- 履约状态判断逻辑错误:
orderInfo.itemFulfillStatus是通过getText('shiprecvstatusline')获取的文本值,判断== 'true'不符合实际返回值,需改为匹配实际状态文本(如'Shipped'),或改用getValue获取内部状态编码。 - 多余尾逗号:返回对象
return { execute: execute, };中的尾逗号可能引发解析问题,建议移除。
修复后的完整脚本
/** * This script looks for originals sold, and marks the parent, child, * and kit as sold out when the sales order is approved, * and inactivates the parent, child, and kit when fulfilled. * * @NApiVersion 2.x * @NScriptType ScheduledScript * @NModuleScope SameAccount */ define(['N/search', 'N/record', 'N/log', 'N/email'], function (search, record, log, email) { function createSoldOriginalSearch() { return search.create({ type: "salesorder", filters: [ ["type", "anyof", "SalesOrd"], "AND", ["item.custitemitemoriginal", "is", "T"], "AND", ["item.isinactive", "is", "F"], "AND", ["datecreated", "within", "lastmonth"] ], columns: [ "statusref", "shiprecvstatusline", search.createColumn({ name: "type", join: "item" }), search.createColumn({ name: "formulatext", formula: "CASE WHEN {item.type}='Kit/Package' THEN SUBSTR({item.memberitem}, 0, 6) ELSE SUBSTR({item}, 0, 6) END" }), "internalid" ] }); } function getAllResults(searchObj) { var start = 0; var allResults = []; var results = []; var resultSet = searchObj.run(); results = resultSet.getRange({ start: start, end: start + 1000 }); allResults = allResults.concat(results); while (results.length) { start += 1000; results = resultSet.getRange({ start: start, end: start + 1000 }); allResults = allResults.concat(results); } return allResults; } function getOrderInfo(results, index) { var orderInfo = {}; orderInfo.id = results[index].id; orderInfo.SOInternalId = results[index].getValue('internalid'); orderInfo.masterItemNum = results[index].getValue('formulatext'); orderInfo.SOStatus = results[index].getText('statusref'); orderInfo.itemFulfillStatus = results[index].getText('shiprecvstatusline'); return orderInfo; } function getItemIds(orderInfo) { var searchFilter = search.createFilter({ name: 'itemid', operator: search.Operator.CONTAINS, values: orderInfo.masterItemNum }); var inventorySearch = search.create({ type: search.Type.ITEM, filters: [searchFilter], columns: ['internalid'] }); var itemSearchResults = inventorySearch.run().getRange({ start: 0, end: 1000 // Change this value to retrieve more or fewer results. }); return itemSearchResults; } function markAsSoldOut(orderInfo, itemId) { var itemRecord = record.load({ type: record.Type.SERIALIZED_INVENTORY_ITEM, id: itemId }); if (orderInfo.SOStatus !== 'Pending Approval' && orderInfo.SOStatus !== 'Closed' && orderInfo.SOStatus !== 'Cancelled') { itemRecord.setValue({ fieldId: 'custitemsold_out', value: true }); } var saveSoldOut = itemRecord.save(); return saveSoldOut; } function inactivateItems(orderInfo, itemId) { var itemRecord = record.load({ type: record.Type.SERIALIZED_INVENTORY_ITEM, // Assuming you want to inactivate the item record id: itemId }); // 替换为实际的已履约状态文本,比如'Shipped',根据你的NetSuite配置调整 if (orderInfo.itemFulfillStatus === 'Shipped') { itemRecord.setValue({ fieldId: 'isinactive', value: true }); } var saveInactivate = itemRecord.save(); return saveInactivate; } function execute(context) { try { var soldOriginalSearch = createSoldOriginalSearch(); var results = getAllResults(soldOriginalSearch); log.debug('initial results', results); for (var i = 0; i < results.length; i++) { var orderInfo = getOrderInfo(results, i); log.debug('orderinfo', orderInfo); var itemResults = getItemIds(orderInfo); if (itemResults && itemResults.length > 0) { for (var j = 0; j < itemResults.length; j++) { var itemId = itemResults[j].getValue('internalid'); var saveSoldOut = markAsSoldOut(orderInfo, itemId); var saveInactivate = inactivateItems(orderInfo, itemId); } } } } catch (e) { var subject = 'General Error in Scheduled Script'; var body = 'There has been an error in the scheduled script: ' + e.message; var recipients = ['example@example']; email.send({ author: 349571, recipients: recipients, subject: subject, body: body }); log.error('Scheduled Script Error', e.message); } } return { execute: execute }; });
内容的提问来源于stack exchange,提问作者Kim Newman
相关产品推荐
相关产品推荐

