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