影响程度取决于您的阅读和写作量。如果当前使用大量增量数据传输,那么改变您的方法可以产生巨大的好处。
对电子表格 API 的调用通常需要 0.01 秒或更长时间才能完成。导入/导出数据或调用子函数的调用将花费更长的时间(例如getDataRange、getValue(s)、setValue(s))。 Apps 脚本足够聪明,可以优化一些连续调用,但如果您是交替读取和写入,那么 Google 端将无法为您提供帮助。
您可以在View -> Execution Transcript 菜单上查看此计时数据。
我的建议是将任何现有的基于单元格的验证公式移动到脚本函数中,这些函数对传递的员工姓名、员工与他们已经“工作”的班次之间的对象映射以及提议的上班班次进行操作。然后,您可以使用 1 个调用来导入员工 - 日可用性列表,并且对于每一天,对于每个班次,验证随机选择的可用员工是否可以工作,因为他们在调度期间之前的班次。最后,您将对象写回工作表。
定时脚本(由于连续读取而被谷歌内部优化)
function writeRand_(rows, cols)
{
var datasheet = SpreadsheetApp.openById(ssid).getSheetByName('Sheet1');
datasheet.getDataRange().clearContent();
var rand = [];
for(var row = 0; row < rows; ++row)
{
var data = [];
for(var col = 0; col < cols; ++col)
data.push(Math.random());
rand.push(data);
}
datasheet.getRange(1, 1, rand.length, rand[0].length).setValues(rand);
return datasheet;
}
function readAndTime()
{
var rows = 50, cols = 8;
var datasheet = writeRand_(rows, cols);
// sum one-by-one
var sum1 = 0;
var startRangeSum = new Date().getTime();
for(var row = 1; row <= rows; ++row)
for(var col = 1; col <= cols; ++col)
sum1 += datasheet.getRange(row, col).getValue()-0;
var endRangeSum = new Date().getTime();
// Read all, then sum.
var sum2 = 0;
var startArraySum = new Date().getTime();
var inputs = datasheet.getDataRange().getValues();
for(var row = 0; row < inputs.length; ++row)
for(var col = 0; col < inputs[0].length; ++col)
sum2 += inputs[row][col]-0;
var endArraySum = new Date().getTime();
Logger.log("Value count: " + rows * cols);
Logger.log("Range sum: " + (endRangeSum - startRangeSum)/1000 + " sec. " + sum1);
Logger.log("Array sum: " + (endArraySum - startArraySum)/1000 + " sec. " + sum2);
}
上面给出了 ~.8s 的范围和 .2s 的数组 - 而 .2s 基本上都是由于调用 getDataRange() 以使 inputs 所需的时间