首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SuiteScript工作流操作错误SSS_USAGE_LIMIT_EXCEEDED和电子邮件未附加到相关记录

SuiteScript工作流操作错误SSS_USAGE_LIMIT_EXCEEDED和电子邮件未附加到相关记录
EN

Stack Overflow用户
提问于 2022-07-24 03:07:44
回答 1查看 152关注 0票数 0

当我试图处理超过15个事务时,我收到了以下错误:

代码语言:javascript
运行
复制
Error: SSS_USAGE_LIMIT_EXCEEDED
{"type":"error.SuiteScriptError","name":"SSS_USAGE_LIMIT_EXCEEDED","message":"Script Execution Usage Limit Exceeded","stack":["createError(N/error)","onAction(/SuiteScripts/sdf_ignore/Send Remittance PFA Workflow Action.js:84)"],"cause":{"type":"internal error","code":"SSS_USAGE_LIMIT_EXCEEDED","details":"Script Execution Usage Limit Exceeded","userEvent":null,"stackTrace":["createError(N/error)","onAction(/SuiteScripts/sdf_ignore/Send Remittance PFA Workflow Action.js:84)"],"notifyOff":false},"id":"","notifyOff":false,"userFacing":false}

该脚本是一个工作流操作脚本,当用户单击按钮发送电子邮件汇款通知时会触发该脚本。

这在很大程度上是可行的,除非我超过了一定数量的交易。

我需要使用另一种脚本类型吗?或者我是否可以修改以下脚本以减少其治理使用?

代码语言:javascript
运行
复制
    /**
     *@NApiVersion 2.x
     *@NScriptType WorkflowActionScript
     */
    define([
      "N/search",
      "N/record",
      "N/render",
      "N/file",
      "N/xml",
      "N/email",
    ], function (search, record, render, file, xml, email) {
      function onAction(context) {
        var fileObj = [];
        var record = context.newRecord;
        log.debug("record", record);
        var batchId = record.getValue({ fieldId: "name" });
        var id = record.id;
        log.debug("recordid", record.id);
    
        var vendorpaymentSearchObj = search.create({
          type: "vendorpayment",
          filters: [
            ["type", "anyof", "VendPymt"],
            "AND",
            ["custbody_9997_pfa_record", "anyof", id],
          ],
          columns: [
            search.createColumn({
              name: "transactionnumber",
              summary: "GROUP",
              label: "Transaction Number",
            }),
            search.createColumn({
              name: "formulatext",
              summary: "GROUP",
              formula: "{entity}",
              label: "Vendor",
            }),
            search.createColumn({
              name: "formulatext",
              summary: "GROUP",
              formula:
                "CASE WHEN {vendor.custentity_2663_email_address_notif} IS NULL THEN {vendor.email} ELSE  {vendor.custentity_2663_email_address_notif} END",
              label: "Email",
            }),
            search.createColumn({
              name: "total",
              summary: "SUM",
              label: "Amount (Transaction Total)",
            }),
            search.createColumn({
              name: "currency",
              summary: "GROUP",
              label: "Currency",
            }),
            search.createColumn({
              name: "trandate",
              summary: "GROUP",
              sort: search.Sort.ASC,
              label: "Date",
            }),
    
            search.createColumn({
              name: "internalid",
              summary: "GROUP",
              label: "internalid",
            }),
            search.createColumn({
              name: "internalid",
              join: "vendor",
              summary: "GROUP",
              label: "Internal ID",
            }),
            search.createColumn({
              name: "internalid",
              summary: "GROUP",
              label: "Internal ID",
            }),
          ],
        });
        var searchResultCount = vendorpaymentSearchObj.runPaged().count;
        log.debug("vendorpaymentSearchObj result count", searchResultCount);
        vendorpaymentSearchObj.run().each(function (result) {
          var emailAddress = result.getValue(result.columns[2]);
          var transactionNumber = result.getValue(result.columns[0]);
          var amount = result.getValue(result.columns[3]);
          var date = result.getValue(result.columns[5]);
          var vendor = result.getValue(result.columns[1]);
          var resultId = result.getValue(result.columns[6]);
          var vendorId = result.getValue(result.columns[7]);
          var transactionId = result.getValue(result.columns[8]);
          log.debug(
            "emailAddress: ",
            emailAddress +
              " transaction bumber: " +
              transactionNumber +
              " amount: " +
              amount +
              " date: " +
              date +
              " vendor: " +
              vendor +
              " resultId " +
              resultId +
              " transactionId " +
              transactionId
          );
          var pdfFile = render.transaction({
            entityId: parseInt(resultId),
            printMode: render.PrintMode.PDF,
            formId: 109,
            inCustLocale: true,
          });
          pdfFile.folder = 1351;
          var fileId = pdfFile.save();
    
          var pdffile2 = file.load({ id: fileId });
          //   var fileObj = file.load({ id: parseInt(fileId) });
    
          var mergeResult = render.mergeEmail({
            templateId: 8,
    
            //   entity: {
            //     type: "employee",
            //     id: parseInt(recipient),
            //   },
    
            entity: {
              type: "vendor",
              id: parseInt(vendorId),
            },
    
            recipient: {
              type: "vendor",
              id: parseInt(vendorId),
            },
            supportCaseId: null,
            transactionId: parseInt(resultId),
            customRecord: null,
            // {
            //     type: "customrecord_2663_entity_bank_details",
            //     id: parseInt(bankDetailsId),
            // },
          });
          var emailSubject = mergeResult.subject;
          var emailBody = mergeResult.body;
          //create a placeholder in the original HTML with an element called NLID. This will replace that with a value that is part of the script
          emailSubject = emailSubject.replace("NLVENDOR", vendor);
          //   emailBody = emailBody.replace("NLDOCNUMBER", bankDetailsId);
          var emailString = JSON.stringify(emailAddress);
          email.send({
            author: -5,
            //   recipients: 2020,
            recipients: emailAddress,
    
            subject: emailSubject,
            body: emailBody,
            attachments: [pdffile2],
            relatedRecords: {
              entity: parseInt(vendorId),
              customRecord: {
                id: parseInt(id),
                recordType: 'customrecord_2663_file_admin', //an integer value
              },
       //     transactionId: 38326,
            },
          });
    
          return true;
        });
    
        /*
         vendorpaymentSearchObj.id="customsearch1658554258593";
         vendorpaymentSearchObj.title="Bill Payments in a Payment Batch (copy)";
         var newSearchId = vendorpaymentSearchObj.save();
         */
      }
      return {
        onAction: onAction,
      };
    });

我在这个脚本中遇到的另一个问题是,email.send方法不会为自定义记录抛出错误,但实际上也不会将电子邮件消息附加到指定的事务类型。它不允许我把电子邮件附加到一个交易(如果我收到一个“意外的错误”)

我终于得到了一张地图减少的工作,为这个:

代码语言:javascript
运行
复制
    /**
     *@NApiVersion 2.x
     *@NScriptType MapReduceScript
     */
    define([
      "N/search",
      "N/record",
      "N/render",
      "N/file",
      "N/xml",
      "N/email",
      "N/runtime",
    ], function (search, record, render, file, xml, email, runtime) {
      function getInputData(context) {
        var scriptObj = runtime.getCurrentScript();
        var recordId = scriptObj.getParameter("custscript_recordid");
        // var record = context.newRecord;
        // log.debug("record", record);
        // var batchId = record.getValue({ fieldId: "name" });
        var id = recordId;
        log.debug("recordid", recordId);
    
        var vendorpaymentSearchObj = search.create({
          type: "vendorpayment",
          filters: [
            ["type", "anyof", "VendPymt"],
            "AND",
            ["custbody_9997_pfa_record", "anyof", id],
          ],
          columns: [
            //0
            search.createColumn({
              name: "transactionnumber",
              summary: "GROUP",
              label: "Transaction Number",
            }),
            //1
            search.createColumn({
              name: "formulatext",
              summary: "GROUP",
              formula: "{entity}",
              label: "Vendor",
            }),
            //2
            search.createColumn({
              name: "formulatext",
              summary: "GROUP",
              formula:
                "CASE WHEN {vendor.custentity_2663_email_address_notif} IS NULL THEN {vendor.email} ELSE  {vendor.custentity_2663_email_address_notif} END",
              label: "Email",
            }),
            //3
            search.createColumn({
              name: "total",
              summary: "SUM",
              label: "Amount (Transaction Total)",
            }),
            //4
            search.createColumn({
              name: "currency",
              summary: "GROUP",
              label: "Currency",
            }),
            //5
            search.createColumn({
              name: "trandate",
              summary: "GROUP",
              sort: search.Sort.ASC,
              label: "Date",
            }),
    
            //6
            search.createColumn({
              name: "internalid",
              join: "vendor",
              summary: "GROUP",
              label: "vendorId",
            }),
            //7
            search.createColumn({
              name: "internalid",
              summary: "GROUP",
              label: "searchResultId",
            }),
          ],
        });
        log.debug(
          "vendorpaymentSearchObj result count",
          vendorpaymentSearchObj.runPaged().count
        );
    
        var vendorPayments = [];
    
        vendorpaymentSearchObj.run().each(function (result) {
          vendorPayments.push({
            emailAddress: result.getValue(result.columns[2]),
            transactionNumber: result.getValue(result.columns[0]),
            amount: result.getValue(result.columns[3]),
            date: result.getValue(result.columns[5]),
            vendor: result.getValue(result.columns[1]),
            resultId: result.getValue(result.columns[7]),
            vendorId: result.getValue(result.columns[6]),
            id: id,
            // transactionId: result.getValue(result.columns[8]),
          });
          return true;
        });
    
        return vendorPayments;
      }
      /**
       * @param {MapReduceContext.map} context
       */
      function map(context) {
        try {
          log.debug("context", context);
          const result = JSON.parse(context.value);
          log.debug("result", result);
          var emailAddress = result.emailAddress;
          var transactionNumber = result.transactionNumber;
          var amount = result.amount;
          var date = result.date;
          var vendor = result.vendor;
          var resultId = result.resultId;
          var vendorId = result.vendorId;
          var id = result.id;
          // var transactionId = result.transactionId;
          log.debug(
            "emailAddress: ",
            emailAddress +
              " transaction bumber: " +
              transactionNumber +
              " amount: " +
              amount +
              " date: " +
              date +
              " vendor: " +
              vendor +
              " resultId " +
              resultId +
              // " transactionId " +
              // transactionId +
              "vendorId " +
              vendorId
          );
          // for (var i = 0; i < context.value.length; i++) {
          var pdfFile = render.transaction({
            entityId: parseInt(resultId),
            printMode: render.PrintMode.PDF,
            formId: 109,
          });
    
          pdfFile.folder = 1351;
          var fileId = pdfFile.save();
    
          var pdffile2 = file.load({ id: fileId });
          // context.write({
          //   key: context.value[i],
          //   value: [
          //     [pdffile2],
          //     pdfFile,
          //     fileId,
          //     emailAddress,
          //     transactionNumber,
          //     amount,
          //     date,
          //     vendor,
          //     resultId,
          //     vendorId,
          //     transactionId,
          //   ],
          // });
    
          log.debug("fileid: " + fileId + pdfFile + pdffile2);
          context.write({
            key: resultId,
            value: JSON.stringify({
              vendorId: vendorId,
              vendor: vendor,
              fileId: fileId,
              emailAddress: emailAddress,
              id: id,
            }),
          });
          // }
        } catch (ex) {
          log.error("Error on map", ex.message + ex.error);
        }
      }
    
      //   var fileObj = file.load({ id: parseInt(fileId) });
      /**
       * @param {MapReduceContext.reduce} context
       */
      function reduce(context) {
        try {
          var reduceResults = context.values; //note: context.values and not context.value unlike the earlier stages. Also, this is not JSON.Parse
          log.debug("reduceResults", reduceResults);
          var pdffile2 = [];
          for (var i = 0; i < reduceResults.length; i++) {
            //note: this is context.value(S)
            log.debug("vendorId", JSON.parse(reduceResults[i]).vendorId);
            log.debug("key", context.key);
            if (reduceResults) {
              var mergeResult = render.mergeEmail({
                templateId: 8,
    
                //   entity: {
                //     type: "employee",
                //     id: parseInt(recipient),
                //   },
    
                entity: {
                  type: "vendor",
                  id: parseInt(JSON.parse(reduceResults[i]).vendorId),
                },
    
                recipient: {
                  type: "vendor",
                  id: parseInt(JSON.parse(reduceResults[i]).vendorId),
                },
                supportCaseId: null,
                transactionId: parseInt(context.key),
                customRecord: null,
              });
    
              log.debug("mergeResult", mergeResult);
              var emailSubject = mergeResult.subject;
              var emailBody = mergeResult.body;
    
              log.debug("email body", emailBody);
              var pdf = file.load({
                id: JSON.parse(reduceResults[i]).fileId,
              });
              var vendorName = JSON.parse(reduceResults[i]).vendor;
              log.debug("vendorname", vendorName);
              pdffile2.push(pdf);
              //create a placeholder in the original HTML with an element called NLVENDOR. This will replace that with a value that is part of the script
              var emailSubjectNew = emailSubject.replace("NLVENDOR", vendorName);
              log.debug("email subject", emailSubjectNew);
              var emailString = JSON.parse(reduceResults[i]).emailAddress;
              log.debug("emailstring", emailString);
              email.send({
                author: -5,
                recipients: JSON.parse(reduceResults[i]).emailAddress,
                subject: emailSubjectNew,
                body: emailBody,
                attachments: pdffile2,
                relatedRecords: {
                  entity: parseInt(JSON.parse(reduceResults[i]).vendorId),
                  transactionId: parseInt(context.key),
                },
              });
            }
          }
        } catch (ex) {
          log.error("Error on reduce", ex.message + "" + ex.name);
        }
      }
    
      /**
       * @param {MapReduceContext.summarize} context
       */
      function summarize(summary) {
        log.debug("context", summary);
        summary.output.iterator().each(function (key, value) {
          contents += key + " " + value + "\n";
          return true;
        });
      }
      return {
        getInputData: getInputData,
        map: map,
        reduce: reduce,
        summarize: summarize,
      };
    });
EN

回答 1

Stack Overflow用户

发布于 2022-07-26 07:25:36

对我来说,如果你不知道搜索有多少结果,这个操作似乎更适合地图/还原。这意味着,如果它总是呈现一个PDF,并发送它所以不需要一个MR,但如果数量是未知的,所以地图/减少是要走的路。

如果您仍然想尝试并减少对此脚本的使用,可以尝试:

  • 没有保存和加载PDF。相反,只需生成并发送它。(假设这不是requirement)
  • You,则可以尝试添加搜索条件以缩小查询

我怀疑这两种方法中的任何一种是否都能减少使用量,从而产生真正的效果。我会查看N/任务模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73095512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档