You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: 生成记录、脚本的URL
  • N/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:29