NetSuite User Event Script报错:ReferenceError: Query未定义
NetSuite UserEvent脚本错误排查与修正
问题分析
你的脚本出现ReferenceError: "Query" is not defined及查询逻辑失效,根源集中在这几点:
- 模块注入遗漏:define中声明了
N/query依赖,但回调函数未接收该参数,导致query变量未绑定NetSuite查询模块 - SuiteQL语法错误:WHERE子句
tranid = transaction.tranid是恒真条件,无法过滤当前发票对应的客户;表名字段大小写不统一,易引发查询失败 - 结果处理错误:
runSuiteQL返回的是ResultSet对象,不能直接与字符串"Manual"做比较,需提取具体字段值 - 逻辑顺序不合理:先执行查询再判断是否为发票,会造成不必要的资源消耗
修正后的脚本
/** * @NApiVersion 2.x * @NScriptType UserEventScript */ define(['N/record', 'N/query', 'N/log'], function(record, query, log) { function beforeSubmit(context) { try { var newRecord = context.newRecord; // 先判断是否为发票类型,避免无效查询 if (newRecord.type === record.Type.INVOICE) { // 获取当前发票关联的客户ID var customerId = newRecord.getValue({ fieldId: 'entity' }); // 用客户ID精准查询配送方式,避免关联Transaction表的冗余 var resultSet = query.runSuiteQL({ query: 'SELECT deliverymethod FROM customer WHERE id = ?', params: [customerId] }); // 提取查询结果 var deliveryMethod = ''; var results = resultSet.asMappedResults(); if (results.length > 0) { deliveryMethod = results[0].deliverymethod; } // 判断配送方式是否为Manual if (deliveryMethod === 'Manual') { // 更新自定义字段 newRecord.setValue({ fieldId: 'midaccount', value: 1 }); newRecord.setValue({ fieldId: 'createinvoice', value: 3 }); newRecord.setValue({ fieldId: 'email', value: 'Info@someone.com' }); log.debug({ title: 'Invoice Updated', details: '自定义字段已更新' }); } } } catch (e) { log.error({ title: 'Error in beforeSubmit', details: e.toString() }); } } return { beforeSubmit: beforeSubmit }; });
关键修改说明
- 修复模块注入:回调函数添加
query参数,与define中的N/query依赖对应 - 优化查询逻辑:直接通过客户ID查询Customer表,无需关联Transaction,更高效且避免语法错误
- 正确处理查询结果:用
asMappedResults()将结果转为对象数组,提取deliverymethod字段值 - 调整逻辑顺序:先判断发票类型再执行查询,减少不必要的操作
- 使用参数化查询:避免SQL注入风险,同时让查询更灵活
内容的提问来源于stack exchange,提问作者RayJohn
相关产品推荐
相关产品推荐

