【问题标题】:Error in running scheduled script from suitelet form script in Suitescript 2.0?从 Suitescript 2.0 中的套件表单脚本运行计划脚本时出错?
【发布时间】:2019-10-19 06:15:23
【问题描述】:

我是套件脚本的新手。我制作了一个包含 3 个字段的 Suitelet 表单脚本,这些字段将充当预定脚本的过滤器。从我保存的搜索中过滤了 suit let 脚本的 3 个值后,将 PDF 文件发送到某个电子邮件的预定脚本。 当我点击套件表单上的按钮时,输入字段后,预定的脚本会继续处理 1 小时,然后失败。 我认为我在预定脚本中加载我保存的搜索时放置了错误的过滤器。 保存的搜索 (customsearch_mx_itemsearch) 没有任何过滤器或条件。 如果有人知道,请帮忙。谢谢

我的 Suitelet 表单脚本:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/task'],
  function (ui, search, render, runtime, file, task) {
    /**
     * main function for suitelet
     * @param {object} ctx
     */

    function onRequest(ctx) {

      var req = ctx.request;
      var res = ctx.response;
      var param = req.parameters;
      /**
       * create form is creating the UI for report generation
       */
      if (req.method === 'GET') {
        // createForm(req, res, param);
        createForm(req, res, param);
      } else {
        generateReport(req, res, param);
      }
    }

    // R E Q U E S T
    function createForm(req, res, param) {

      if (req.method === 'GET') {
        var form = ui.createForm({
          title: 'Generate Item Report'
        });

        var item = form.addField({
          id: 'custpage_selectitem',
          type: ui.FieldType.SELECT,
          label: 'Select Item',
          source: 'item'
        });
        item.isMandatory = true;

        var gender = form.addField({
          id: 'custpage_selectgender',
          type: ui.FieldType.SELECT,
          label: 'Select Gender',
          source: 'customrecord6'
        });
        gender.isMandatory = true;

        var fromDate = form.addField({
          id: 'custpage_selectdate',
          // type: ui.FieldType.DATETIME,
          type: ui.FieldType.DATE,
          label: 'Select Date/Time',
        });


        form.addSubmitButton({
          label: 'Generate Report'
        });

        res.writePage(form);
      }
    }

    // R E S P O N C E
    function generateReport(req, res, param) {
      var param = req.parameters;
      log.debug('parameters', param);
      var script = runtime.getCurrentScript();

      var filters = {
        'isgender': param.custpage_selectgender,
        'isItem': param.custpage_selectitem,
        'fromDate': param.custpage_selectdate
      };

      log.debug('filters', filters);

      var scriptTask = task.create({ taskType: task.TaskType.SCHEDULED_SCRIPT });
      // scriptTask.scriptId = 3920;
      scriptTask.scriptId = 'customscript_mx_itemreport_ss';
      scriptTask.deploymentId = 'customdeploy_mx_itemreport_ss';
      scriptTask.params = {
        custscript_searchfilter_report: JSON.stringify(filters)
      };
      log.debug('workingtillhere');
      var scriptTaskId = scriptTask.submit();
      res.write("Your report is being generated. It will be emailed to you shortly.")

    }

    return {
      onRequest: onRequest
    };
  });

我的预定脚本:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/email'],
  function (ui, search, render, runtime, file, email) {

    function execute() {
      try {
        generateReport();
      }
      catch (e) {
        log.error('generateReport ERROR', e);
      }
    }

    function generateReport(req, res, param) {

      var slfilters = runtime.getCurrentScript().getParameter({ name: 'custscript_searchfilter_report' });
      log.debug('slfilters', slfilters);

      if (!!slfilters) {
        slfilters = JSON.parse(slfilters);
      }
      log.debug('slfilters2', slfilters);

      var getUser = runtime.getCurrentUser();

      var gender = slfilters.isgender
      log.debug('gender', gender)
      var item = slfilters.isItem
      log.debug('item', item)

      var item = getItems(item, gender);
      log.debug('items table', item)

      var xmlTemplateFile = file.load(3918);
      var template = script.getParameter({ name: 'custscript_template' });
      var renderer = render.create();
      renderer.templateContent = xmlTemplateFile.getContents();
      var customSources = {
        alias: 'searchdata',
        format: render.DataSource.JSON,
        data: JSON.stringify({
          value: item,
        })
      };
      renderer.addCustomDataSource(customSources);

      var xml = renderer.renderAsString();
      var pdf = render.xmlToPdf({
        "xmlString": xml
      });

      email.send({
        author: 317,
        recipients: 'aniswtf@gmail.com',
        subject: 'Item Report',
        body: 'Report Generated: ',
        attachments: [pdf]
      });
    }

    //
    // ─── GET RESULTS ───────────────────────────────────────────────────
    //
    const getResults = function (set) {
      var results = [];
      var i = 0;
      while (true) {
        var result = set.getRange({
          "start": i,
          "end": i + 1000
        });
        if (!result) break;
        results = results.concat(result);
        if (result.length < 1000) break;
        i += 1000;
      }
      return results;
    };

    //
    // ─── GET ITEMS ───────────────────────────────────────────────────
    //
    function getItems(item, gender) {

      try {
        var itemSearch = search.load({
          id: 'customsearch_mx_itemsearch'
        });

        var defaultFilters = itemSearch.filters;
        var arrFilters = [];

        arrFilters.push(search.createFilter({
          name: 'custitem5',//gender
          operator: 'anyof',
          values: [gender]
        }));
        arrFilters.push(search.createFilter({
          name: 'internalid',
          operator: 'anyof',
          values: [item]
        }));

        //defaultFilters.push(arrFilters)
        defaultFilters = defaultFilters.concat(arrFilters);

        var results = getResults(itemSearch.run()).map(function (x) {
          return {

            'category': x.getText({
              name: "custitem10",
              join: "parent"
            }),
            'season': x.getValue({
              name: "custitem11",
              join: "parent"
            }),
            'riselabel': x.getValue({
              name: "custitem_itemriselabel",
              join: "parent"
            }),
            'fit': x.getValue({
              name: "custitem9",
              join: "parent"
            }),
            'name': x.getValue({ //sku
              name: "itemid",
              join: "parent"
            }),
            'style': x.getValue({
              name: "custitem8",
              join: "parent"
            }),
            'inseam': x.getValue({
              name: "custitem7",
              join: "parent"
            }),
            'wash': x.getValue({
              name: "custitem_washname",
              join: "parent"
            }),
          };
        });
        return results;

      } catch (e) {
        log.error('error in getItems', e)
      }

    }
    return {
      execute: execute
    };
  });

【问题讨论】:

  • 发布错误信息,在不知道确切错误的情况下可能很难调试。
  • 感谢阿维的回复。没有确切的错误消息。据我检查,似乎我从 Suitelet 传递到 Sched 脚本的过滤器正在被传递(我通过日志看到),但没有在我加载搜索和推送过滤器的函数 getItems() 中应用,因此脚本继续处理,因为保存的搜索有很多数据。

标签: javascript netsuite suitescript suitescript2.0


【解决方案1】:

您为generateReport() 定义了reqresparam 参数,但是当您在execute() 中调用generateReport() 时实际上并没有填充它们。您需要为这些参数传递值。

【讨论】:

  • 我也试过打电话给他们,但似乎没有任何影响。每当我执行预定的脚本时,它都会进行长时间的处理,我认为它的过滤器没有被应用到 getItems 函数(这是搜索加载功能)中。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2017-05-16
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多