【问题标题】:How to get over 1000 records from a SuiteScript Saved Search?如何从 SuiteScript 保存的搜索中获取超过 1000 条记录?
【发布时间】:2016-02-16 09:56:21
【问题描述】:

下面是我想出的代码,用于使用 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');
}

以下代码是我发现用于返回超过 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;

【问题讨论】:

    标签: netsuite


    【解决方案1】:

    试试这个:

    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;
    }
    

    我查看了您的代码,但您似乎缺少生成的 CSV 文件中的标签标题。如果您一定要使用现有代码,那么只需替换

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

    与

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

    只需使用提到的辅助函数来摆脱 1000 个结果的限制。

    干杯!

    【讨论】:

    • 摇滚明星,你的答案是摇滚明星!它工作得很好……非常感谢你花时间和精力帮助我!非常感谢。
    • @Accounting 很高兴知道它有帮助。干杯!!
    • 我遇到了一些问题。如果保存的搜索执行缓慢,则脚本会出错并且不会生成文件。我调整了我保存的搜索中的标准以更有效地执行,问题现在已经解决。但我担心当保存的搜索增长到 1000 条记录时它可能会重新出现。是否可以添加任何代码来让 SS 有时间在出错之前执行?提前感谢您的洞察!
    • 我将部署设置为通过电子邮件向我发送错误,因此我收到一封包含以下错误的电子邮件。我能够确定它是由保存的搜索超时引起的。感谢您的任何想法!
    • 环境:生产日期和时间:7/13/2015 11:36 pm 执行时间:0.40s 脚本使用:5 脚本:SSEmailScript 类型:计划函数:returnCSVFile 错误:UNEXPECTED_ERROR 票证:ic2ujgxd1u8l7evkntq3l 堆栈跟踪: getItems(1000.js$109256:64) returnCSVFile(1000.js$109256:41)
    【解决方案2】:

    我很高兴自从发布和回复此内容以来已经有一段时间了,但是对于其他寻求对原始问题的更通用回复的人来说,以下代码应该就足够了:

    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)
    

    另外值得一提的是,如果您的代码要更新字段/记录/创建记录,您需要牢记脚本治理。 将您的代码移动到预定脚本以处理大量记录会更有效,并且可以让您处理治理。

    【讨论】:

      【解决方案3】:

      下面一行:

      var savedsearch = nlapiCreateSearch( 'customrecord_mybigfatlist', filters, columns );
      

      可以像这样适应您自己保存的搜索:

      var savedsearch = nlapiLoadSearch('item', 'customsearch219729');
      

      希望这会有所帮助。

      【讨论】:

      • 感谢您的回答。但是我在哪里/如何将代码插入到我的主 SuiteScript 代码中?而且我不确定第二个代码片段是否有效……我只是将它作为一个示例,说明如何生成超过 1000 条记录的已保存搜索。谢谢!
      • 将第二个代码sn-p封装在自己的函数中,比如说getAllResults()。然后,将代码的第一行替换为:var search = getAllResults().
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多