SuiteScript添加按钮转换记录报错:transformToCreditNote未定义
NetSuite SuiteScript 按钮点击错误修复 + 速查表
错误原因分析
- 按钮配置的
functionName: 'transformToCreditNote'是客户端函数,但你将该函数定义在服务器端UserEvent脚本的beforeLoad内部,客户端浏览器无法访问这个函数,导致Uncaught ReferenceError。 - 服务器端代码中使用
window.location.href属于客户端API,服务器端环境不存在window对象,即使函数能访问也会报错。
正确实现方案
需要拆分逻辑:用UserEvent脚本添加按钮并关联客户端脚本;客户端脚本处理点击事件,调用服务器端Suitelet执行记录转换,最后跳转至新记录页面。
1. UserEvent脚本(添加按钮并关联客户端脚本)
/** * @NApiVersion 2.x * @NScriptType UserEventScript * @NModuleScope SameAccount */ define(['N/ui/serverWidget', 'N/url'], function(serverWidget, url) { function beforeLoad(context) { if (context.type === context.UserEventType.VIEW) { var form = context.form; // 添加按钮 form.addButton({ id: 'custpage_transform_to_credit_note', label: 'Transform to Credit Note', functionName: 'handleTransformClick' // 客户端脚本中的函数名 }); // 关联客户端脚本(替换为你的客户端脚本模块路径) form.clientScriptModulePath = './credit_note_transform_cs.js'; } } return { beforeLoad: beforeLoad }; });
2. 客户端脚本(处理按钮点击,调用Suitelet)
/** * @NApiVersion 2.x * @NScriptType ClientScript * @NModuleScope SameAccount */ define(['N/url', 'N/currentRecord'], function(url, currentRecord) { function handleTransformClick() { var invoiceId = currentRecord.get().id; // 生成Suitelet的URL var suiteletUrl = url.resolveScript({ scriptId: 'customscript_credit_note_transform_sl', // 替换为你的Suitelet脚本ID deploymentId: 'customdeploy_credit_note_transform_sl', // 替换为你的Suitelet部署ID params: { 'invoice_id': invoiceId } }); // 跳转至Suitelet执行转换 window.location.href = suiteletUrl; } return { handleTransformClick: handleTransformClick }; });
3. Suitelet脚本(执行记录转换并跳转)
/** * @NApiVersion 2.x * @NScriptType Suitelet * @NModuleScope SameAccount */ define(['N/record', 'N/redirect'], function(record, redirect) { function onRequest(context) { if (context.request.method === 'GET') { var invoiceId = context.request.parameters.invoice_id; // 加载发票记录 var invoiceRec = record.load({ type: record.Type.INVOICE, id: invoiceId }); // 转换为贷项通知单 var creditMemoRec = invoiceRec.transform({ fromType: record.Type.INVOICE, toType: record.Type.CREDIT_MEMO }); // 保存贷项通知单 var creditMemoId = creditMemoRec.save(); // 重定向至新生成的贷项通知单页面 redirect.toRecord({ type: record.Type.CREDIT_MEMO, id: creditMemoId, isEditMode: true }); } } return { onRequest: onRequest }; });
SuiteScript 2.x 速查表
核心模块
N/record: 记录的创建、加载、修改、保存、转换N/ui/serverWidget: 自定义表单、按钮、字段(服务器端)N/ui/dialog: 客户端弹窗提示N/url: 生成记录、脚本的URLN/redirect: 服务器端页面重定向N/currentRecord: 客户端获取当前打开的记录N/search: 记录搜索
常见脚本类型
- UserEventScript: 记录事件触发(beforeLoad、beforeSubmit、afterSubmit)
- ClientScript: 客户端交互逻辑(按钮点击、字段变更)
- Suitelet: 自定义页面/接口,处理HTTP请求
- ScheduledScript: 定时任务
- RESTlet: REST接口服务
关键API示例
加载记录
var rec = record.load({ type: record.Type.INVOICE, id: 123 });
转换记录
var newRec = rec.transform({ fromType: record.Type.INVOICE, toType: record.Type.CREDIT_MEMO });
客户端获取当前记录ID
var currentId = currentRecord.get().id;
内容的提问来源于stack exchange,提问作者F M FM
相关产品推荐
相关产品推荐

