我有一个每天都要运行的脚本,但它运行得非常慢,而且我无法找出是什么导致了它的速度缓慢。有没有人能提出建议?我最初编写了一个函数来处理一个工作表,随后添加了一个循环调用每个工作表的函数。
function addAllLog() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var allSheets = ss.getSheets();
// build array of all sheets
for (var i in allSheets) {
if (i == 0) { continue;} // skip first sheet
var tmpName = allSheets[i].getName();
if (tmpName == "Print Sheet") break; //stop at this tab
var tmpName = ss.getSheetByName(allSheets[i].getName());
ss.setActiveSheet(ss.getSheetByName(allSheets[i].getName()));
addLog();
}
}
function addLog () {
var sheet = SpreadsheetApp.getActiveSheet();
var numLastRow = sheet.getLastRow();
var numThisRow = numLastRow+1;
today = new Date();
today.setDate(today.getDate()-1);
today = Utilities.formatDate(today,"EDT","MM/DD/YYYY");
if (sheet.getMaxRows() == numLastRow) sheet.insertRowAfter(numLastRow);
var range = sheet.getRange(numLastRow,2,1,16); // last row, column b, 1 row of 16 columns
var data = range.getValues();
range.copyTo(sheet.getRange(numLastRow+1, 2,1,16)); //you will need to define the size of the copied data see getRange()
sheet.getRange(numThisRow, 1).setValue(today);
sheet.getRange(numThisRow, 4).setValue('Log');
sheet.getRange(numThisRow, 5).setValue(''); //erase copied value if there was anything there
sheet.getRange(numThisRow, 7).setValue(''); //erase copied value if there was anything there
sheet.getRange(numThisRow, 6).setValue('=GoogleFinance(C' + numThisRow + ',"price")');
sheet.getRange(numThisRow, 6).setValues(sheet.getRange(numThisRow,6).getValues());
}
任何有关加速它的建议都将不胜感激!
var data = range.getValues();
时,它只获取实际值,因此其中没有公式。我删除了大部分的setValues
,但速度似乎没有受到影响。我将数据移动到函数外面,作为全局变量,但也没有影响(虽然我并不认为会有影响)。我只是不明白为什么复制该行并更改几个单元格需要30秒钟每张表格。由于时间太长,我无法将其设置为自动触发器。 - Cactus Duderange.copyTo
的代码。必须有其他方法来复制公式和数据。 - Cactus Dude