SuiteScript 2.0按钮跳转Suitelet报错:mod.redirectToSuitelet不是函数
问题分析与修复方案
错误mod.redirectToSuitelet is not a function的核心原因是客户端脚本存在语法错误、API使用不当,导致函数未正确注册到客户端模块中。以下是具体问题和修复步骤:
一、客户端脚本的核心错误与修复
原客户端脚本存在多处语法和API使用问题,修复后的代码如下:
define(['N/currentRecord', 'N/url', 'N/log'], function (currentRecord, url, log) { function redirectToSuitelet() { // 使用SuiteScript 2.x API获取当前记录ID var billId = currentRecord.get().id; // 用2.x的url.resolveScript生成Suitelet链接,避免手动拼接错误 var suiteletUrl = url.resolveScript({ scriptId: 'customscript_reject_reason_code', deploymentId: 'customdeploy_reject_reason_code', params: { billId: billId } }); log.debug('Redirecting to Suitelet', suiteletUrl); // 修正变量名错误:suiteUrl → suiteletUrl window.location.href = suiteletUrl; } // 确保return语句在define回调函数内部 return { redirectToSuitelet: redirectToSuitelet }; });
修复点说明:
- 替换1.0的
nlapiGetRecordId()为2.x的currentRecord.get().id,符合NetSuite脚本规范 - 用
url.resolveScript生成链接,避免手动拼接URL时的参数格式错误(比如原代码中&billID =的空格问题) - 修正变量名拼写错误:
suiteUrl改为suiteletUrl - 将
log.debug移至函数内部,确保执行时能正确获取变量值 - 调整return语句位置,确保函数被正确暴露给客户端模块
二、用户事件脚本的优化(可选但推荐)
原用户事件脚本中已经生成了正确的Suitelet链接,可以直接将该链接传递给客户端脚本,减少客户端的计算逻辑:
define(['N/url', 'N/ui/serverWidget'], function (url, serverWidget) { function beforeLoad(context) { if (context.type === context.UserEventType.VIEW) { var form = context.form; var billId = context.newRecord.id; var suiteletURL = url.resolveScript({ scriptId: 'customscript_reject_reason_code', deploymentId: 'customdeploy_reject_reason_code', params: { billId: billId } }); form.addButton({ id: 'custpage_reject_button', label: 'Send Back to AP', // 直接传递生成好的URL,客户端函数无需再拼接 functionName: "redirectToSuitelet('" + suiteletURL + "')" }); form.clientScriptFileId = '1128350'; // 确认该File ID对应正确的客户端脚本文件 } } return { beforeLoad: beforeLoad }; });
对应调整客户端脚本的函数,直接接收链接:
define(['N/log'], function (log) { function redirectToSuitelet(suiteletUrl) { log.debug('Redirecting to Suitelet', suiteletUrl); window.location.href = suiteletUrl; } return { redirectToSuitelet: redirectToSuitelet }; });
三、Suitelet脚本补充:设置拒绝状态
原Suitelet只更新了拒绝原因,未实现设置拒绝状态的需求,需添加状态设置代码(注意NetSuite中账单状态的具体值需根据你的账户配置调整,以下为示例):
define(['N/record', 'N/ui/serverWidget', 'N/redirect'], function (record, serverWidget, redirect) { function onRequest(context) { if (context.request.method === 'GET') { var form = serverWidget.createForm({ title: 'Enter Reject Reason' }); form.addField({ id: 'custpage_reject_reason', type: serverWidget.FieldType.TEXTAREA, label: 'Reject Reason' }).isMandatory = true; form.addSubmitButton({ label: 'Submit' }); form.addField({ id: 'custpage_bill_id', type: serverWidget.FieldType.TEXT, label: 'Bill ID' }).updateDisplayType({ displayType: serverWidget.FieldDisplayType.HIDDEN }).defaultValue = context.request.parameters.billId; context.response.writePage(form); } else { var rejectReason = context.request.parameters.custpage_reject_reason; var billId = context.request.parameters.custpage_bill_id; var billRecord = record.load({ type: record.Type.VENDOR_BILL, id: billId }); billRecord.setValue({ fieldId: 'custbody_reject_reason', value: rejectReason }); // 添加设置拒绝状态的代码,示例值需根据实际账户调整 billRecord.setValue({ fieldId: 'status', value: 'Rejected' // 或使用内部ID,如'-10',具体可通过NetSuite自定义记录类型查看 }); billRecord.save(); redirect.toRecord({ type: record.Type.VENDOR_BILL, id: billId }); } } return { onRequest: onRequest }; });
最后验证步骤
- 确认客户端脚本的File ID(1128350)在文件柜中对应修复后的脚本
- 重新部署用户事件脚本和Suitelet脚本
- 测试按钮点击,确认能正常跳转到Suitelet表单,提交后账单的拒绝原因和状态均更新
内容的提问来源于stack exchange,提问作者MMB
相关产品推荐
相关产品推荐

