【发布时间】:2019-04-01 21:15:06
【问题描述】:
在我的脚本中,我遍历单元格,每个单元格代表日历网格上的一天。所以它从较早的日期(从用户更改的单元格)到较晚的日期。从上到下,从左到右。
脚本在用户更改单元格的值时启动。并且它必须以相同的值填充每个后续天的单元格,直到某个单元格。可以说它必须停在带有红色字体的单元格上。因此,脚本每次迭代都必须获取单元格字体颜色。
...或者,当脚本获取代表某个日期的单元格时,迭代必须停止。因此,脚本每次迭代都必须验证单元格重新设置的日期。要了解单元格代表的日期,我从辅助单元格(标题)中获取值并使用 getValue()。随便。
一切都是可以忍受的:循环单元格,更改每个单元格中的值,获取辅助单元格(范围)。但!一旦我将 getValue() 添加到给定的标头中,它就开始以令人难以置信的缓慢速度工作。甚至我只是得到字体颜色......从迭代中包含的“get”开始的任何函数都会使工作变得难以置信地缓慢!
一个循环尽可能多的脚本 getRange(), setValue() 在可容忍的时间内工作,但只有一个 getFontColor() 或 getValue 这个作业只在一个单元格上同时运行。
要么我做一些非法的事情或谷歌? 是否有机会显着加快这项工作? 或者像这样的工作应该以完全不同的方式完成?
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?")
}
}
【问题讨论】:
标签: google-apps-script google-sheets google-sheets-api