NetSuite RESTlet通过已保存搜索无法返回采购订单记录
我们有一个基于交易的已保存搜索(Saved Search)用于获取采购订单(Purchase Order)数据,筛选条件为:
Criteria:
Type is Purchase Order
Date is on yesterday
手动运行该搜索时可输出约20条记录,但通过SuiteScript 1.0编写的RESTlet调用该已保存搜索时,返回结果中data对象为空,记录数为0。若将筛选条件改为'类型为销售订单(Sales Order)',则可返回约100条记录。
使用的SuiteScript 1.0脚本如下:
function getRESTlet(dataIn) { var message = ""; var status = "OK"; var data = {}; var savedSearch = nlapiLoadSearch('transaction', 'customsearch_maximum_rdc'); var resultset = savedSearch.runSearch(); var returnSearchResults = []; var searchid = 0; do { var resultslice = resultset.getResults(searchid, searchid + 1000); for (var rs in resultslice) { returnSearchResults.push(resultslice[rs]); searchid++; } } while (resultslice.length >= 1000); var results = {"count":searchid, "data":returnSearchResults}; return results; } // Close function
检查RESTlet脚本的执行权限
确认RESTlet脚本部署关联的执行用户,是否拥有采购订单的查看权限。NetSuite中不同角色的权限差异可能导致:手动运行搜索的用户有权限,但脚本执行用户无采购订单访问权限。可临时将脚本执行用户替换为手动运行搜索的用户,测试是否能返回数据。验证已保存搜索的权限配置
查看已保存搜索的权限设置,确保该搜索对RESTlet的执行用户可见。若已保存搜索未给对应角色分配访问权限,脚本加载搜索后将无法获取结果。排查日期条件的时区差异
手动操作的时区与脚本执行的服务器时区可能不一致,导致“yesterday”的计算结果偏差。可修改搜索条件为具体测试日期,或在脚本中动态设置日期筛选:// 加载搜索后替换日期条件 var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); var formattedDate = nlapiDateToString(yesterday); savedSearch.addFilter(new nlobjSearchFilter('trandate', null, 'on', formattedDate));添加脚本错误捕获逻辑
在脚本中加入异常捕获,获取搜索执行时的错误信息,定位问题根源:try { var resultset = savedSearch.runSearch(); // 后续获取结果的逻辑 } catch (e) { return {"status": "ERROR", "message": e.message, "code": e.code}; }修改结果返回格式
直接推送NetSuite搜索结果对象到数组,可能因对象无法序列化导致返回异常。建议提取具体字段值后返回普通对象:for (var rs in resultslice) { var resultObj = {}; resultObj['tranid'] = resultslice[rs].getValue('tranid'); resultObj['trandate'] = resultslice[rs].getValue('trandate'); // 添加其他需要的字段 returnSearchResults.push(resultObj); searchid++; }检查已保存搜索的结果过滤规则
确认已保存搜索是否有“仅显示我创建的记录”这类过滤规则。手动运行时用户能看到自己创建的采购订单,但脚本执行用户若不是这些订单的创建者,会导致无结果返回。
内容的提问来源于stack exchange,提问作者Mark

