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

列 data[s][3] 是不同工作的供应商列表。有上千个条目,总共约160家供应商。这个脚本执行大约需要 5 分钟,非常缓慢且无效。

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

4

2 回答 2

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

留意错别字——我刚刚输入了这个。

在对象键中转换供应商可能有些风险,因为供应商名称可能不是合法的对象键。

于 2013-07-17T08:47:57.160 回答
0

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

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

我不确定 NewCategoryFilter 是什么。

于 2013-07-17T05:22:15.483 回答