当我试图处理超过15个事务时,我收到了以下错误:
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}
该脚本是一个工作流操作脚本,当用户单击按钮发送电子邮件汇款通知时会触发该脚本。
这在很大程度上是可行的,除非我超过了一定数量的交易。
我需要使用另一种脚本类型吗?或者我是否可以修改以下脚本以减少其治理使用?
/**
*@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方法不会为自定义记录抛出错误,但实际上也不会将电子邮件消息附加到指定的事务类型。它不允许我把电子邮件附加到一个交易(如果我收到一个“意外的错误”)
我终于得到了一张地图减少的工作,为这个:
/**
*@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,
};
});
发布于 2022-07-26 07:25:36
对我来说,如果你不知道搜索有多少结果,这个操作似乎更适合地图/还原。这意味着,如果它总是呈现一个PDF,并发送它所以不需要一个MR,但如果数量是未知的,所以地图/减少是要走的路。
如果您仍然想尝试并减少对此脚本的使用,可以尝试:
我怀疑这两种方法中的任何一种是否都能减少使用量,从而产生真正的效果。我会查看N/任务模块。
https://stackoverflow.com/questions/73095512
复制相似问题