在我的脚本中,我遍历每个单元格,每个单元格代表“日历”网格上的一天。因此,它从较早的日期(由用户更改的单元格)到较晚的日期。从上到下,从左到右。
当用户更改单元格的值时,脚本开始。并且它必须在以后的每个天单元格中以相同的值填充到特定单元格。可以说它必须停在红色字体的单元格上。因此,每次迭代时,脚本都必须获取单元字体的颜色。
...或者,当脚本获取表示特定日期的单元格时,迭代必须停止。因此,脚本的每次迭代都必须验证单元格重新设置的日期。要了解一个单元格代表什么日期,我可以从辅助单元格(标题)中获取值并使用getValue()。随便。
一切都是可以忍受的:循环遍历单元格,更改每个单元格中的值,获取辅助单元格(范围)。但!一旦将getValue()添加到给定的标头中,它就会开始缓慢地工作。甚至我只是得到字体颜色...迭代中包含的任何从“ get”开始的功能都会使工作缓慢得令人难以置信!
一个可以循环播放多达getRange(),setValue()的脚本可以在可容忍的时间内完成工作,但是只有一个getFontColor()或getValue可以在一个单元中同时运行此作业。
我是非法人还是Google? 是否有机会大大加快这项工作? 还是这样的工作应该完全不同?
function onEdit(evt) {
var aSheet = evt.source.getActiveSheet();
// veryfy which sheet
switch( aSheet.getName().toLowerCase() ) {
case "wage":
// get range - calendar grid
var wageGrid = aSheet.getParent().getRangeByName("wageGrid");
var editedCell = evt.range;
// loop exit flag
var weBreak = false;
editedCell.setFontColor("red");
// loop through rows
for(var rowIndex = editedCell.getRow(); rowIndex <= wageGrid.getLastRow(); rowIndex++) { if(weBreak) break;
// loop through columns
for(var collIndex = (rowIndex == editedCell.getRow())?editedCell.getColumn():wageGrid.getColumn(); collIndex <= wageGrid.getLastColumn(); collIndex++) {
// as many as you like
var currentLoopCell = aSheet.getRange(rowIndex, collIndex);
var dayHeaderCell = aSheet.getRange(rowIndex, 1);
var monthHeaderCell = aSheet.getRange(1, collIndex);
cell.setValue(evt.value);
// but getValue() or getSomeAttribute() will slow down the process
//var cellFontColor = cell.getFontColor();
//if(cellFontColor=="red") weBreak = true; break;
}
}
break;
case "nonexistentyet":
break;
default:
Logger.log("What was it?")
}
}
答案 0 :(得分:0)
您遇到的是正常行为。每次对工作表的调用(如getValue()和getFontColor())都花费相当长的时间,通常每次需要1到2秒。您应该避免循环调用这些函数。
当您要遍历一大组单元格并使用它们的值时,请使用getRange()定义整个范围,并改用getValues()和getFontColors()。这些函数将返回二维数组中整个范围的数据。您甚至可以使用getDataRange()引入工作表中的所有数据。
同样,最好也使用setValues()和setFontColors()编写块,而不是一一设置单元格上的值/颜色