对大型电子表格中的数据进行分类



我正在尝试制作一个脚本,该脚本将从包含供应商列表的电子表格中创建一个表。电子表格有一千多个条目,所以我的脚本处理它的速度非常慢。这是代码

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的输出放到一个表中?

只是不要在循环中调用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);
}

注意打字错误-我刚刚输入了这个。

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

在循环中取消对newssheet.getDataRange的调用可能会加快速度。通过将值存储为对象{}键并使用"in"运算符查看它们是否存在,可以更快地检查重复项。例如

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

我不确定NewCategoryFilter是什么。

最新更新