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

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
    };
});

最后验证步骤

  1. 确认客户端脚本的File ID(1128350)在文件柜中对应修复后的脚本
  2. 重新部署用户事件脚本和Suitelet脚本
  3. 测试按钮点击,确认能正常跳转到Suitelet表单,提交后账单的拒绝原因和状态均更新

内容的提问来源于stack exchange,提问作者MMB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:35:03