如何从SuiteScript保存的搜索中获取超过1000条记录?

Acc*_*ing 5 netsuite

下面是我使用SuiteScript在NetSuite中运行保存搜索的代码,使用保存的搜索结果创建CSV,然后通过电子邮件发送CSV.麻烦的是,结果限于1000条记录.我已经研究过这个问题,看起来解决方案是运行一个以1000为增量切片的循环.我相信用于切片搜索的样本也在下面.

但是,我似乎无法将切片合并到我的代码中.任何人都可以帮我将切片代码与原始搜索代码结合起来吗?

var search = nlapiSearchRecord('item', 'customsearch219729'); 

// Creating some array's that will be populated from the saved search results 
var content = new Array(); 
var cells = new Array(); 
var temp = new Array(); 
var x = 0; 

// Looping through the search Results 
for (var i = 0; i < search.length; i++) { 
var resultSet = search[i]; 
// Returns an array of column internal Ids
var columns = resultSet.getAllColumns(); 

// Looping through each column and assign it to the temp array 
for (var y = 0; y <= columns.length; y++) { 
temp[y] = resultSet.getValue(columns[y]); 
} 
// Taking the content of the temp array and assigning it to the Content Array. 
content[x] += temp; 
// Incrementing the index of the content array 
x++; 
} 

//Inserting headers
content.splice(0, 0, "sku,qty,");

// Creating a string variable that will be used as the CSV Content 
var contents; 

// Looping through the content array and assigning it to the contents string variable. 
for (var z = 0; z < content.length; z++) { 
contents += content[z].replace('undefined', '') + '\n';
}
// Creating a csv file and passing the contents string variable. 
var file = nlapiCreateFile('InventoryUpdate.csv', 'CSV', contents.replace('undefined', ''));

// Emailing the script.
function SendSSEmail()
{
   nlapiSendEmail(768, 5, 'Inventory Update', 'Sending saved search via scheduled script', 'cc@email.com', null, null, file, true, null, 'cc@email.com');
}
Run Code Online (Sandbox Code Playgroud)

以下代码是我发现的用于返回超过1000条记录的示例.同样,作为一个新手,我似乎无法将切片结合到我原来的功能性SuiteScript中.任何帮助当然非常感谢.

var filters = [...];
var columns = [...];
var results = [];
var savedsearch = nlapiCreateSearch( 'customrecord_mybigfatlist', filters, columns );
var resultset = savedsearch.runSearch();
var searchid = 0;
do {
    var resultslice = resultset.getResults( searchid, searchid+1000 );
    for (var rs in resultslice) {
        results.push( resultslice[rs] );
        searchid++;
    }
} while (resultslice.length >= 1000);
return results;
Run Code Online (Sandbox Code Playgroud)

Roc*_*tar 9

试试这个:

function returnCSVFile(){

    function escapeCSV(val){
        if(!val) return '';
        if(!(/[",\s]/).test(val)) return val;
        val = val.replace(/"/g, '""');
        return '"'+ val + '"';
    }


    function makeHeader(firstLine){
        var cols = firstLine.getAllColumns();
        var hdr = [];
        cols.forEach(function(c){
            var lbl = c.getLabel(); // column must have a custom label to be included.
            if(lbl){
                hdr.push(escapeCSV(lbl));
            }
        });
        return hdr.join(",");
    }

    function makeLine(srchRow){
        var cols = srchRow.getAllColumns();
        var line = [];
        cols.forEach(function(c){
            if(c.getLabel()){
                line.push(escapeCSV(srchRow.getText(c) || srchRow.getValue(c)));
            }
        });
        return line.join(",");
    }

    function getDLFileName(prefix){
        function pad(v){ if(v >= 10) return v; return "0"+v;}
        var now = new Date();
        return prefix + '-'+    now.getFullYear() + pad(now.getMonth()+1)+ pad(now.getDate()) + pad( now.getHours())    +pad(now.getMinutes()) + ".csv";
    }


    var srchRows = getItems('item', 'customsearch219729'); //function that returns your saved search results

    if(!srchRows)   throw nlapiCreateError("SRCH_RESULT", "No results from search");


    var fileLines = [makeHeader(srchRows[0])];

    srchRows.forEach(function(soLine){
        fileLines.push(makeLine(soLine));
    });



var file = nlapiCreateFile('InventoryUpdate.csv', 'CSV', fileLines.join('\r\n'));
nlapiSendEmail(768, 5, 'Test csv Mail','csv', null, null, null, file);
}

function getItems(recordType, searchId) {
    var savedSearch = nlapiLoadSearch(recordType, searchId);
    var resultset = savedSearch.runSearch();
    var returnSearchResults = [];
    var searchid = 0;
    do {
        var resultslice = resultset.getResults(searchid, searchid + 1000);
        for ( var rs in resultslice) {
            returnSearchResults.push(resultslice[rs]);
            searchid++;
        }
    } while (resultslice.length >= 1000);

    return returnSearchResults;
}
Run Code Online (Sandbox Code Playgroud)

我查看了您的代码,但似乎您在生成的CSV文件中缺少标签标题.如果您必须使用现有代码,则只需替换即可

var search = nlapiSearchRecord('item', 'customsearch219729'); 
Run Code Online (Sandbox Code Playgroud)

同

var search = getItems('item', 'customsearch219729');
Run Code Online (Sandbox Code Playgroud)

并只使用提到的帮助函数来摆脱1000结果限制.

干杯!


小智 5

我很感激它已经发布并回复了一段时间,但是对于寻找对原始问题更通用的回复的其他人来说,以下代码应该足够了:

var search = nlapiLoadSearch('record_type', 'savedsearch_id');
var searchresults = search.runSearch();
var resultIndex = 0;
var resultStep = 1000;
var resultSet;
do {
    resultSet = searchresults.getResults(resultIndex, resultIndex + resultStep);    // retrieves all possible results up to the 1000 max  returned
    resultIndex = resultIndex + resultStep;                     // increment the starting point for the next batch of records
    for(var i = 0; !!resultSet && i < resultSet.length; i++){   // loop through the search results
       // Your code goes here to work on a the current resultSet (upto 1000 records per pass)
    }
} while (resultSet.length > 0)
Run Code Online (Sandbox Code Playgroud)

另外值得一提的是,如果您的代码要更新字段/记录/创建记录,则需要牢记脚本治理.将代码移动到计划脚本以处理大量记录更有效,并允许您处理治理.