Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 谷歌电子表格脚本非常慢_Performance_Google Apps Script_Google Sheets - Fatal编程技术网

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是最好的方法。