Performance 谷歌电子表格脚本非常慢
我有一个脚本,我每天运行。它的速度非常慢,我不知道是什么让它慢下来的。有人有什么建议吗?我最初编写了一个函数来完成一个工作表,然后我添加了一个函数来循环并在每个工作表上调用它Performance 谷歌电子表格脚本非常慢,performance,google-apps-script,google-sheets,Performance,Google Apps Script,Google Sheets,我有一个脚本,我每天运行。它的速度非常慢,我不知道是什么让它慢下来的。有人有什么建议吗?我最初编写了一个函数来完成一个工作表,然后我添加了一个函数来循环并在每个工作表上调用它 function addAllLog() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var allSheets = ss.getSheets(); // build array of all sheets for (var i in a
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());
}
如果您有任何加快速度的建议,我们将不胜感激 此版本不要求您激活每张工作表,因此所需时间可能会少一点
function addAllLog() {
var ss=SpreadsheetApp.getActive();
var allSheets = ss.getSheets();
for (var i=1;i<allSheets.length;i++){
var shtname = allSheets[i].getName();
if (shtname == "Print Sheet"){
break; //stop at this tab
}else{
addLog(shtname);
}
}
}
function addLog (shtname) {
var sheet = SpreadsheetApp.getSheetByName(shtname);
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);
range.copyTo(sheet.getRange(numLastRow+1, 2,1,16));
sheet.getRange(numThisRow, 1).setValue(today);
sheet.getRange(numThisRow, 4).setValue('Log');
sheet.getRange(numThisRow, 5).setValue('');
sheet.getRange(numThisRow, 7).setValue('');
sheet.getRange(numThisRow, 6).setFormula('=GoogleFinance(C' + numThisRow + ',"price")');
}
函数addAllLog(){
var ss=SpreadsheetApp.getActive();
var allSheets=ss.getSheets();
对于(var i=1;i,每次直接在电子表格上设置一个范围内的值时,至少需要800毫秒才能完成,因此解决此问题的最佳方法是使用值创建一个Object[][]
,并使用sheet.getRange(range).setValues(Object[]])
,确保Object[][]
具有与范围相同的宽度和高度
在这篇文章中,谷歌解释了两者的区别
另外,一个有趣的解决方案是make an。我自己制作,基于这种方法,效果非常好。如果您想改进它,我会收到pull请求。我尝试使用数组,但许多单元格中都有公式。当我使用时,var data=range.getValues()
它只获取实际值,所以里面没有公式。我取出了大部分的设置值,这似乎不会影响速度。我将数据移到函数之外,所以它是一个全局变量,没有任何影响(不是我认为会发生的情况)。我只是不明白为什么每张纸需要30秒来复制行和更改几个单元格。b/c这需要很长时间,我无法将其设置为自动触发器。我做了一些小更改,可能会加快速度。你不希望在文件顶部有更新的值吗?我做了这些更改,其中有一行我没有做任何需要删除的操作。我把最新的数据放在最上面,但我真的不喜欢它,所以又返回了。看起来最慢的行实际上是范围。copyTo
行。必须有另一种方法来解决这个问题,复制公式和数据。如果你想复制公式和数据,copyTo是最好的方法。