从大型电子表格中分类数据

时间:2013-07-17 04:24:13

标签: javascript google-apps-script google-sheets

我正在尝试创建一个脚本,该脚本将使用包含供应商列表的电子表格创建表格。电子表格有超过一千个条目,因此我的脚本处理速度非常慢。这是代码

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的输出输入到表中?

2 个答案:

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

在拼写错误上睁大眼睛 - 我只是输入了。

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

答案 1 :(得分:0)

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

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

我不确定NewCategoryFilter是什么。