使用 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 是我需要的列而不是想法?我需要创建列吗?

在过滤文本字段的搜索时,您不能使用 ANYOFALLOF 等。您需要使用 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 }) ]
})