编辑:代码的工作版本(归功于 Netsuite slack 上的用户 Raghav 以获得解决方案)
/**
* @NApiVersion 2.x
* @NScriptType MapReduceScript
*/
define(["N/runtime", "N/search", "N/util"], function (runtime, search, util) {
function getInputData() {
var scriptObj = runtime.getCurrentScript();
var filtersParam = runtime
.getCurrentScript()
.getParameter({ name: "custscript_selected_lines_json" });
var lineIdToTransactionIdMap = JSON.parse(filtersParam);
log.debug("lineIdToTransactionIdMap", lineIdToTransactionIdMap);
var searchResults = [];
function convertToSuiteScriptFilter(lineIdToTransactionIdMap) {
var filter = [];
filter.push(["type", "anyof", "CustInvc"]);
filter.push("AND");
var subFilter = [];
var flag = false;
for (var internalId in lineIdToTransactionIdMap) {
if (lineIdToTransactionIdMap.hasOwnProperty(internalId)) {
if (flag) {
subFilter.push("OR");
}
flag = true;
var temp = [];
temp.push(["internalid", "anyof", internalId]);
temp.push("AND");
var lineIds = lineIdToTransactionIdMap[internalId];
var lineFilters = [];
for (var i = 0; i < lineIds.length; i++) {
lineFilters.push(["line", "equalto", lineIds[i]]);
if (i !== lineIds.length - 1) {
lineFilters.push("OR");
}
}
temp.push(lineFilters);
subFilter.push(temp);
}
}
filter.push(subFilter);
return filter;
}
var dynamicFilter = convertToSuiteScriptFilter(lineIdToTransactionIdMap);
log.debug("filter", filter);
// var keyValuePairs = lineIdToTransactionIdMap;
// Creating the filter
// var filters = createDynamicFilter(keyValuePairs);
log.debug("createdynamicfilters", dynamicFilter);
var isarray = util.isArray(dynamicFilter);
log.debug("isarray?", isarray);
try {
// Create the search using the filters
var invoiceSearchObj = search.create({
type: "invoice",
filters: dynamicFilter,
columns: [
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({ name: "trandate", label: "Date" }),
search.createColumn({ name: "entity", label: "Name" }),
search.createColumn({ name: "tranid", label: "Document Number" }),
search.createColumn({ name: "line", label: "Line" }),
search.createColumn({ name: "amount", label: "Amount" }),
],
});
var resultSet = invoiceSearchObj.run();
log.debug("invoiceSearchObj", resultSet);
return invoiceSearchObj;
} catch (e) {
var errorMessage = e.message + " (Line: " + e.lineNumber + ")";
log.error({
title: "Error",
details: errorMessage,
});
}
}
选定的行将作为 [内部 id,行 id] 对传递到地图缩减脚本。
例如,从屏幕截图中选定的行中,传递给 MapReduce 脚本的结果值为: {"44760":["9"],"44762":["3","4"]}
对于 MapReduce 的获取输入阶段,我如何构建一个过滤器以便它获取这些数据对?
从 UI 到脚本(使用 chrome 导出脚本扩展),我可以看到搜索是:
var invoiceSearchObj = search.create({
type: "invoice",
filters:
[
["type","anyof","CustInvc"],
"AND",
["internalid","anyof","44762"],
"AND",
[["line","equalto","3"],"OR",["line","equalto","4"]],
"OR",
["internalid","anyof","44760"],
"AND",
[["line","equalto","3"],"OR",["line","equalto","4"]]
],
columns:
[
search.createColumn({name: "internalid", label: "Internal ID"}),
search.createColumn({name: "trandate", label: "Date"}),
search.createColumn({name: "entity", label: "Name"}),
search.createColumn({name: "tranid", label: "Document Number"}),
}),
如何传递动态键值对以适应此语法?