我正在尝试创建一个脚本,该脚本将使用包含供应商列表的电子表格创建表格。电子表格有超过一千个条目,因此我的脚本处理速度非常慢。这是代码
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 :(得分: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是什么。