SuiteScript 2.1中dialog.confirm().then报错问题求助
问题原因
- NetSuite的UserEvent脚本(
beforeSubmit阶段)属于服务器端脚本,运行在NetSuite服务器环境中,而非用户浏览器里。 N/ui/dialog模块在服务器端的实现是同步逻辑,dialog.confirm()直接返回布尔值,而非官方文档中针对客户端脚本场景描述的Promise对象。- 你在服务器端脚本中尝试对非Promise对象调用
.then(),因此触发TypeError报错。
修复方案
要实现编辑已打印拣货单的销售订单时弹出确认对话框,必须改用客户端脚本(Client Script),利用saveRecord事件拦截保存操作,在用户浏览器中弹出确认框。以下是修改后的代码:
define(['N/ui/dialog', 'N/log'], function(dialog, log) { /** * @NApiVersion 2.1 * @NScriptType ClientScript */ function saveRecord(context) { var currentRecord = context.currentRecord; var orderStatus = currentRecord.getValue({fieldId: 'status'}); // 仅处理未结账的订单 if (orderStatus !== 'Billed') { var hasPrintedPickTicket = currentRecord.getValue({fieldId: 'printedpickingticket'}); // 直接读取订单内置的打印状态字段,替代系统笔记查询,提升性能 if (hasPrintedPickTicket === true) { var options = { title: 'WARNING: Pick Ticket Printed', message: 'The pick ticket has already been printed for this sales order. Are you sure you want to edit?' }; // 客户端环境下dialog.confirm返回Promise,通过.then()处理用户选择 return dialog.confirm(options) .then(function(confirmResult) { return confirmResult; // 用户确认则返回true允许保存,取消则返回false阻止保存 }) .catch(function(error) { log.error('Dialog Error', error); return false; // 出错时阻止保存 }); } } return true; // 无需确认时直接允许保存 } return { saveRecord: saveRecord }; });
关键优化说明
- 切换为客户端脚本的
saveRecord事件:该事件运行在用户浏览器中,完全支持dialog.confirm()的Promise返回值。 - 替换系统笔记查询:直接读取销售订单的
printedpickingticket字段,避免高开销的系统笔记搜索,大幅提升脚本效率。 - 利用事件返回值控制保存:
saveRecord事件返回true则允许保存,返回false则阻止保存,完美匹配需求逻辑。
部署步骤
- 将脚本类型设置为Client Script。
- 部署到目标销售订单表单,勾选
Save Record事件。 - 确保用户角色拥有
printedpickingticket字段的读取权限。
内容的提问来源于stack exchange,提问作者GJKamClark
相关产品推荐
相关产品推荐

