我有一些工作正常的代码,只是相当缓慢和笨重。我确定有更好的方法:
我有两张纸,一张是用户编辑的('MAIN'),另一张是脚本从中提取数据(超过5000行数据)('REF')。基本上它会检查第1列的匹配项,如果它与用户输入的匹配项匹配,则会从第3列的同一行中获取值。
代码有效,但速度很慢:
function onEdit(){
var s = SpreadsheetApp.getActive().getSheetByName('MAIN');
var sref = SpreadsheetApp.getActive().getSheetByName('REF');
var activeRow = s.getActiveCell().getRow();
var activeCol = s.getActiveCell().getColumn();
var activeCell = s.getActiveCell().getValue();
var mainPageBranch = s.getRange(8,1).getValue();
var refPageBranch = sref.getRange('I4').getValue();
var lastrow = sref.getLastRow();
if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){
if(activeRow > 9 && activeRow < 41){
if(activeCell > 100000){
s.getRange(activeRow, activeCol+1).setValue(1);
}
else{
s.getRange(activeRow, activeCol+1).setValue('');
}
for(var i=5; i <lastrow; i++){
var productCode = sref.getRange(i, 1).getValue();
if(activeCell == productCode){
var essMould = sref.getRange(i,3).getValue();
s.getRange(activeRow+1,activeCol).setValue(essMould);
s.getRange(activeRow+1,activeCol+1).setValue('1');
break;
}
}
Logger.log('Product Code: ' + productCode);
Logger.log('Ess Mould: ' + essMould);
Logger.log('Last Row: ' + lastrow);
}
}
}
我知道它有点笨重 - 任何使它更快的帮助都会很棒!
如果您还需要其他信息,请告诉我们。)
编辑:这是更新的代码谢谢!
function onEdit(){
var s = SpreadsheetApp.getActive().getSheetByName('MAIN');
var sref = SpreadsheetApp.getActive().getSheetByName('REF');
var activeRow = s.getActiveCell().getRow();
var activeCol = s.getActiveCell().getColumn();
var activeCell = s.getActiveCell().getValue();
var mainPageBranch = s.getRange(8,1).getValue();
var refPageBranch = sref.getRange('I4').getValue();
var lastrow = sref.getLastRow();
var productCode,essMould,data,L;
data = sref.getRange(5, 1, lastrow-5,3).getValues();
L = data.length; //Length of data
if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){
if(activeRow > 9 && activeRow < 41){
if(activeCell > 100000){
s.getRange(activeRow, activeCol+1).setValue(1);
}
else{
s.getRange(activeRow, activeCol+1).setValue('');
}
for(var i=5; i <L; i++){
productCode = data[i][0];
if(activeCell == productCode){
essMould = data[i][2];
s.getRange(activeRow+1,activeCol).setValue(essMould);
s.getRange(activeRow+1,activeCol+1).setValue('1');
break;
}
}
Logger.log('Product Code: ' + productCode);
Logger.log('Ess Mould: ' + essMould);
}
}
}
答案 0 :(得分:1)
你不应该在每个循环中获得单独的值:
var callIt = function(fn, ...args) {
var res = 0;
for(var i = 0; i < args.length; i++){
res += fn(args[i]);
}
return res
};
var result = callIt(function(n) {
return n
}, 2,3);
console.log(result);
首先获取所有值,遍历数据数组,根据需要更改数组中的数据,然后将整个数据集写回电子表格。
for(var i=5; i <lastrow; i++){
var productCode = sref.getRange(i, 1).getValue();