使用 SuiteScript 2 在 NetSuite 中搜索项目数组
Searching an array of items in NetSuite using SuiteScript 2
我正在尝试编写一个 suitescript 搜索,允许我将标识符数组传递到 Netsuite 中的特定字段并 return 结果。我尝试了 'ANYOF'、'ALLOF' 和“WITHIN”,但我总是收到错误
到目前为止,这是我的代码:
if(params.type=='sku'){
var filter_name = 'itemid';
}else{
var filter_name = 'upccode';
}
var filters = [
search.createFilter({
name: filter_name,
operator: search.Operator.ANYOF,
values: ['HERHR5201','HERHR5202','HERHR5203']
}),
];
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters,
}).run();
s = s.getRange(0,100);
return JSON.stringify(s);
有谁知道创建 itemid 的多重搜索的正确顺序?另外,作为奖励,有没有办法让结果集 return 是我需要的列而不是想法?我需要创建列吗?
在过滤文本字段的搜索时,您不能使用 ANYOF
、ALLOF
等。您需要使用 OR 创建筛选器表达式以搜索多个值。
我会这样做:
if(params.type=='sku'){
var filter_name = 'itemid';
}else{
var filter_name = 'upccode';
}
var filters = [
[filter_name, 'is', 'HERHR5201'], 'OR',
[filter_name, 'is', 'HERHR5202'], 'OR',
[filter_name, 'is', 'HERHR5203']
];
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters
}).run();
就从搜索中返回特定列而言,正如您所指出的,您需要使用 search.createColumn()。所以它会是这样的:
//Previous code...
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters,
'columns': [search.createColumn({name: 'internalid'}),
search.createColumn({name: 'upccode'}),
search.createColumn({name: 'itemid'})
/*Other columns as needed*/]
}).run();
提供的答案是正确的,但是根据您提供的示例代码,我假设搜索需要以某种方式动态创建。这意味着您提到的 'array of identifiers' 不会总是相同的,它们的长度也不总是相同的。为了创建一个完全基于传入 'array of identifiers' 的动态搜索,您需要非常有创意。在下面的解决方案中,我假设函数参数 'params' 是一个带有 'type' 属性 和 arrIn(字符串数组)属性 的对象。下面的搜索使用公式函数 'DECODE',可以在 here.
中找到其描述
function execute(params) {
var filter_name;
var itemSearchObj;
var stringArr = '';
var arrIn = params.arrIn;
var i;
var count;
// create search filter type
filter_name = params.type === 'sku' ? 'itemid' : 'upccode';
// create stringArr using incoming arrIn
for (i = 0; arrIn && arrIn.length > i; i += 1) {
stringArr += i > 0 ? ", '" + arrIn[i] + "', 'true'" : "'" + arrIn[i] + "', 'true'";
}
if (arrIn.length > 0) {
itemSearchObj = nsSearch.create({
type: 'item',
filters: [
["formulatext: DECODE({" + filter_name + "}," + stringArr + ")", "is", 'true']
],
columns: [
'itemid', // dont need to get fancy here, just put the internal id of whichever fields you want in the columns
'description'
]
});
count = itemSearchObj.runPaged().count;
itemSearchObj.run().each(function (result) {
// Do things for each result
});
}
}
我觉得这有点曲折,因为我想得太多了。搜索需要一个数组:
results = search.create({
type: search.Type.CUSTOMER,
filters: [],
columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})
此过滤器数组由搜索词数组和逻辑运算符(AND、OR)组成。
['fieldid', 'is', yourValue], // search term array
'AND' // logical operator
因此,您可以根据需要输入搜索词和逻辑运算符,从而创建自己的过滤器数组。
例如,如果您想要 return 数组中客户电子邮件的内部 ID:
let email = ['abc@test.com', 'def@test.com'];
let myFilter = createFilter(email);
function createFilter(email){
let filter = [];
email.forEach((result, index) => {
if(index > 0)
filter.push('OR'); // Logical Operator
filter.push(['email', 'is', result]);
});
return filter;
}
变量 myFilter 现在等于:
[ ['email', 'is', 'abc@test.com'], 'OR', ['email', 'is', 'def@test.com'] ]
并且可以直接引用作为搜索中的过滤器。
let results = search.create({
type: search.Type.CUSTOMER,
filters: myFilter,
columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})
我正在尝试编写一个 suitescript 搜索,允许我将标识符数组传递到 Netsuite 中的特定字段并 return 结果。我尝试了 'ANYOF'、'ALLOF' 和“WITHIN”,但我总是收到错误
到目前为止,这是我的代码:
if(params.type=='sku'){
var filter_name = 'itemid';
}else{
var filter_name = 'upccode';
}
var filters = [
search.createFilter({
name: filter_name,
operator: search.Operator.ANYOF,
values: ['HERHR5201','HERHR5202','HERHR5203']
}),
];
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters,
}).run();
s = s.getRange(0,100);
return JSON.stringify(s);
有谁知道创建 itemid 的多重搜索的正确顺序?另外,作为奖励,有没有办法让结果集 return 是我需要的列而不是想法?我需要创建列吗?
在过滤文本字段的搜索时,您不能使用 ANYOF
、ALLOF
等。您需要使用 OR 创建筛选器表达式以搜索多个值。
我会这样做:
if(params.type=='sku'){
var filter_name = 'itemid';
}else{
var filter_name = 'upccode';
}
var filters = [
[filter_name, 'is', 'HERHR5201'], 'OR',
[filter_name, 'is', 'HERHR5202'], 'OR',
[filter_name, 'is', 'HERHR5203']
];
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters
}).run();
就从搜索中返回特定列而言,正如您所指出的,您需要使用 search.createColumn()。所以它会是这样的:
//Previous code...
var s = search.create({
'type': record.Type.INVENTORY_ITEM,
'filters':filters,
'columns': [search.createColumn({name: 'internalid'}),
search.createColumn({name: 'upccode'}),
search.createColumn({name: 'itemid'})
/*Other columns as needed*/]
}).run();
提供的答案是正确的,但是根据您提供的示例代码,我假设搜索需要以某种方式动态创建。这意味着您提到的 'array of identifiers' 不会总是相同的,它们的长度也不总是相同的。为了创建一个完全基于传入 'array of identifiers' 的动态搜索,您需要非常有创意。在下面的解决方案中,我假设函数参数 'params' 是一个带有 'type' 属性 和 arrIn(字符串数组)属性 的对象。下面的搜索使用公式函数 'DECODE',可以在 here.
中找到其描述function execute(params) {
var filter_name;
var itemSearchObj;
var stringArr = '';
var arrIn = params.arrIn;
var i;
var count;
// create search filter type
filter_name = params.type === 'sku' ? 'itemid' : 'upccode';
// create stringArr using incoming arrIn
for (i = 0; arrIn && arrIn.length > i; i += 1) {
stringArr += i > 0 ? ", '" + arrIn[i] + "', 'true'" : "'" + arrIn[i] + "', 'true'";
}
if (arrIn.length > 0) {
itemSearchObj = nsSearch.create({
type: 'item',
filters: [
["formulatext: DECODE({" + filter_name + "}," + stringArr + ")", "is", 'true']
],
columns: [
'itemid', // dont need to get fancy here, just put the internal id of whichever fields you want in the columns
'description'
]
});
count = itemSearchObj.runPaged().count;
itemSearchObj.run().each(function (result) {
// Do things for each result
});
}
}
我觉得这有点曲折,因为我想得太多了。搜索需要一个数组:
results = search.create({
type: search.Type.CUSTOMER,
filters: [],
columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})
此过滤器数组由搜索词数组和逻辑运算符(AND、OR)组成。
['fieldid', 'is', yourValue], // search term array
'AND' // logical operator
因此,您可以根据需要输入搜索词和逻辑运算符,从而创建自己的过滤器数组。
例如,如果您想要 return 数组中客户电子邮件的内部 ID:
let email = ['abc@test.com', 'def@test.com'];
let myFilter = createFilter(email);
function createFilter(email){
let filter = [];
email.forEach((result, index) => {
if(index > 0)
filter.push('OR'); // Logical Operator
filter.push(['email', 'is', result]);
});
return filter;
}
变量 myFilter 现在等于:
[ ['email', 'is', 'abc@test.com'], 'OR', ['email', 'is', 'def@test.com'] ]
并且可以直接引用作为搜索中的过滤器。
let results = search.create({
type: search.Type.CUSTOMER,
filters: myFilter,
columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})