2013-07-17 32 views
0

我正在尝试制作一个脚本,它将从电子表格与供应商列表中创建一个表格。电子表格有超过一千个条目,所以我的脚本处理速度非常慢。下面是代码对大型电子表格中的数据进行分类

function SupplerAnalysis() { 
//Importing data 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = SpreadsheetApp.getActiveSheet(); 
var data = sheet.getDataRange().getValues(); 

//Creating a sheet 
if (ss.getSheetByName("Analysis") !=null) { 
//Logger.log('exists'); 
} else { 
//Logger.log('Creating new'); 
    ss.insertSheet("Analysis"); 
} 
var sheetNumber = ss.getSheetByName("Analysis").getIndex() - 1; 
ss.getSheetByName("Analysis").clear(); 
var newsheet = ss.getSheets()[sheetNumber]; 
var newdata = newsheet.getDataRange().getValues(); 

newsheet.getRange(1, 1).setValue('Suppliers'); 

//Get list of suppliers 
for (var s = 1; s < data.length; s++) { 
var supplier = data[s][3]; 
var z = 1; 
newdata = newsheet.getDataRange().getValues(); 
    for (var r = 1; r < newdata.length;r++) { 
     if (supplier === newdata[r][0]) { 
      z = 2; 
     } else { Logger.log(r);} 
    } 
    if (z === 1) { 
     newsheet.getRange(r+1, 1).setValue(supplier); 
    } else if (z > 1) { Logge.log('Error'); 
    } 
    } 

列数据[S] [3]是供应商不同作业的列表。有超过一千个参赛作品,共有约160家供应商。该脚本需要大约5分钟才能执行,这非常缓慢且无效。

如何更改代码以加快此过程? 有没有什么办法可以将NewCategoryFilter的输出放入表中?

+0

要标记帖子已解决,您必须简单地“接受”,它将向答复者授予15个代表。编辑标题并不是这个平台上的常用用法。 –

+0

谢谢。对不起,我是新来的:) –

+0

同样也是斯里兰卡,感谢你也要更正:) –

回答

1

只是不调用API中循环:

function SupplerAnalysis() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var data = sheet.getDataRange().getValues(); 
    var newsheet; 

    if ((newsheet=ss.getSheetByName("Analysis")) == null) 
    newsheet = ss.insertSheet("Analysis"); 
    else newsheet.clear(); 

    var supplierList = [['Suppliers']]; 

    for (var s = 1; s < data.length; s++) { 
    for (var r = 1; r < supplierList.length; r++) 
     if (data[s][3] == supplierList[r][0]) break; 
    if (r == supplierList.length) supplierList.push([data[s][3]]); 
    } 

    newsheet.getRange(1,1,supplierList.length,1).setValues(supplierList); 
} 

睁大你的眼睛上的错别字 - 我只是在输入这个

在转换对象键的供应商可能是作为供应商有点冒险。名称可能不是合法的对象键。

+0

哇,非常感谢。太棒了。对象键也起作用,但如果你说它有风险,我会使用它。非常感谢您的帮助。 –

0

摆脱循环中对newsheet.getDataRange的调用可能会加快速度。您可以通过将值存储为对象{}键并使用“in”运算符来查看它们是否存在,从而更快地检查重复项。例如

var set = {}; 
vals.forEach(function(value){ 
    if(value in set) { 
     console.log('duplicate found'); 
    } 
    set[value] = true; 
}); 

我不确定NewCategoryFilter是什么。

+0

“摆脱循环内对newsheet.getDataRange的调用可能会加快速度。” 我知道,但没有它在“for(var r = 1; r

+0

这工作得很好。该列表在几秒钟内生成。非常感谢。 –

相关问题