我有一个代码,它循环遍历我的行,并根据第2列中的值返回不同类型的IndexMatch公式。我的代码运行得很好,并将公式放在相关的列中,但是速度非常慢。
我得到一条消息,.getValue()非常重,因此会减慢代码的速度。
现在我需要弄清楚如何提高代码的速度,但由于我是编码新手,我不是特别确定如何解决这个问题。
这就是我所拥有的:
function setFormulas() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); //gets the workbook being used
var sheet = ss.getSheetByName("Open Requests"); //gets the active worksheet
var sheetnametoWatch ="Open Requests"; //defines sheet
var columnnumbertoWatch = 14
var valuetoWatch = ""
var CostCenter = "'Open Requests'!"
var lastrow = sheet.getLastRow();
var datarange = sheet.getRange(11,2,lastrow -1,50).getValues()
var row = 10
for (i=0;i<datarange.length;i++){
var rowID = 10 + i + 1
if (datarange[i][0] == "CC"){
var addedCell = '=CONCATENATE(F'+rowID+',N'+rowID+',K'+rowID+')';
sheet.getRange(row + i+1,35).setFormula(addedCell);
var MatchedCell = '=INDEX(Input!$Q:$Q,MATCH('+CostCenter+'$AI$'+rowID+',Input!$K:$K,0))';
sheet.getRange(row + i+1,17).setFormula(MatchedCell);
sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
}
else if (datarange[i][0] == "CC + TM1"){
var addedCell = '=CONCATENATE(F'+rowID+',N'+rowID+',K'+rowID+')';
sheet.getRange(row + i+1,35).setFormula(addedCell);
var MatchedCell = '=INDEX(Input!$Q:$Q,MATCH('+CostCenter+'$AI$'+rowID+',Input!$K:$K,0))';
sheet.getRange(row + i+1,17).setFormula(MatchedCell);
sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
}
else if (datarange[i][0] == "GC"){
sheet.getRange(row + i+1,18).setValue("kristin.j@ni.com")
}
}
}
正如您所看到的,我正在遍历数据,然后根据列是否= CC、CC+TM1、GC,它会将其他单元格设置为等于相关公式。
如果有人能帮助我加快这个过程,那就太好了。
发布于 2018-10-19 06:35:42
我很难理解代码到底做了什么,但从更高的层次来看,我认为您应该这样做:不是在循环for循环时为特定的单元格设置公式,而是使用循环来确定哪些单元格应该设置为哪些公式,并存储这些信息。然后,在for循环结束时,只调用sheet.getRange(x,y).setFormula(Formula);
几次,可能每个公式调用一次。
这看起来能行得通吗?
https://stackoverflow.com/questions/52871715
复制相似问题