在 Suitelet 上单击按钮时触发客户端脚本?

Trigger a client script on a button clicked on a Suitelet?

我正在尝试根据在 suitelet 上单击的按钮更新自定义记录上的值

这将有 3 或 4 个不同的按钮。

点击按钮只能加载一个设置页面。

例如,'recurring'在suitelet上被点击。这将加载自定义记录页面并设置参数。 如果单击 'fortnightly invoice' 按钮,这也会加载相同的自定义记录页面并设置参数。

我被卡住的地方:我有一个带有按钮的套件,这些按钮旨在通过调用客户端脚本函数来加载自定义记录

相反,一旦 suitelet 加载,自定义记录页面就会加载并卡在无限循环中,一次又一次地重新加载

这是我的 suitelet 脚本:


    /**
     *@NApiVersion 2.x
     *@NScriptType Suitelet
     */
    define(["N/ui/serverWidget"], function (ui) {
      var exports = {};
    
      function onRequest(context) {
        if (context.request.method === "GET") {
          var form = ui.createForm({
            title: "Consolidated Invoicing Type",
          });
          // form.clientScriptModulePath =
          //   "SuiteScripts/sdf_ignore/Consolidated Invoice Client Script.js";
          form.clientScriptFileId = 2659;
    
          form.addButton({
            id: "recurring",
            label: "Recurring",
            functionName: "pageInit",
          });
    
          context.response.writePage(form);
        } else if ((context.response.method = "POST")) {
          log.debug({
            title: "request method type",
            details: "suitelet is posting",
          });
        }
      }
      exports.onRequest = onRequest;
      return exports;
    });

这是客户端脚本:

    /**
     *@NApiVersion 2.x
     *@NScriptType ClientScript
     */
    define(["N/record", "N/runtime", "N/url"], function (
      record,
    
      runtime,
      url
    ) {
      /**
       * @param {ClientScriptContext.pageInit} context
       */
      function pageInit(context) {
        var scriptObj = runtime.getCurrentScript();
        var recordType = scriptObj.getParameter("custscript_ci_suitelet_record");
        var pageUrl =
          "https://tstdrv.app.netsuite.com/app/common/custom/custrecordentry.nl?rectype=143&id=1&e=T";
    
        var url = new URL(pageUrl);

        window.location.href = url;
      }
    
      return {
        pageInit: pageInit,
      };
    });

我是否需要使用其他脚本类型来设置自定义记录的值? (即不是客户端脚本)

我如何 link suitelet 的 userevent 脚本,以便在单击按钮时触发它?

如果客户端脚本应该绑定到表单上的按钮,为什么会在加载 suitelet 页面时自动启动?

谢谢

页面不断重新加载,因为客户端脚本中的“pageInit”函数将由 Netsuite 自动执行,因为“pageInit”是默认的 Netsuite 入口函数。如果您只是重命名您的函数,它将起作用:

小套房:

form.addButton({
        id: "recurring",
        label: "Recurring",
        functionName: "executeRecurring",
      });

在客户端脚本上:

/**
 *@NApiVersion 2.x
 *@NScriptType ClientScript
 */
define(["N/record", "N/runtime", "N/url"], function (
  record,

  runtime,
  url
) {
  /**
   * @param {ClientScriptContext.pageInit} context
   */
  function executeRecurring() {
    var scriptObj = runtime.getCurrentScript();
    var recordType = scriptObj.getParameter("custscript_ci_suitelet_record");
    var pageUrl =
      "https://tstdrv.app.netsuite.com/app/common/custom/custrecordentry.nl?rectype=143&id=1&e=T";

    var url = new URL(pageUrl);

    window.location.href = url;
  }

  function pageInit(context) { // you need to keep at least one Netsuite Entry function, otherwise you will get an error
  }

  return {
    pageInit: pageInit,
    executeRecurring: executeRecurring
  };
});

另外如果参数custscript_ci_suitelet_record是Suitelet脚本中的参数,那么你将无法在客户端脚本中得到它的值,你必须获取 Suitelet 脚本的值并在按钮调用期间将其作为参数传递:

套房:

/**
 *@NApiVersion 2.x
 *@NScriptType Suitelet
 */
define(["N/ui/serverWidget", "N/runtime"], function (ui, runtime) {
  var exports = {};

  function onRequest(context) {
    if (context.request.method === "GET") {
      var form = ui.createForm({
        title: "Consolidated Invoicing Type",
      });
      // form.clientScriptModulePath =
      //   "SuiteScripts/sdf_ignore/Consolidated Invoice Client Script.js";
      form.clientScriptFileId = 2659;
      
    var recordType = runtime.getCurrentScript().getParameter("custscript_ci_suitelet_record");

      form.addButton({
        id: "recurring",
        label: "Recurring",
        functionName: "executeRecurring('" + recordType + "')",
      });

      context.response.writePage(form);
    } else if ((context.response.method = "POST")) {
      log.debug({
        title: "request method type",
        details: "suitelet is posting",
      });
    }
  }
  exports.onRequest = onRequest;
  return exports;
});

客户端脚本:

/**
 *@NApiVersion 2.x
 *@NScriptType ClientScript
 */
define(["N/record", "N/runtime", "N/url"], function (
  record,

  runtime,
  url
) {
  /**
   * @param {ClientScriptContext.pageInit} context
   */
  function executeRecurring(recType) {
    var pageUrl =
      "https://tstdrv.app.netsuite.com/app/common/custom/custrecordentry.nl?rectype=" + recType + "&id=1&e=T";

    var url = new URL(pageUrl);

    window.location.href = url;
  }

  function pageInit(context) { // you need to keep at least one Netsuite Entry function, otherwise you will get an error
  }

  return {
    pageInit: pageInit,
    executeRecurring: executeRecurring
  };
});