【问题标题】:Increase my script performance Google Sheets Script提高我的脚本性能 Google Sheets 脚本
【发布时间】:2017-08-29 21:21:07
【问题描述】:

我创建了一个函数,每当我运行 AppendRow 脚本时,在 AY 列中没有点 (".") 的每一行,一个包含我想要的每个信息/列的数组该表将被转移到我的主表中,该表有大约 13k 行 atm。

通常每天约有 20-40 行粘贴到第一张表中,此脚本会自动将列重新排列到我的主表中。

问题: 问题是附加到我的主工作表的每一行大约需要 8-15 秒才能转移,有时我会收到这个“超过最大执行时间”的错误,这真的很烦人。 p>

有什么方法可以让我的代码运行得更快,或者只是让脚本运行超过 5 分钟?

function AppendRow() {

  var app = SpreadsheetApp;
  var Sheet = app.getActiveSpreadsheet().getSheetByName("Sheet1");

  var ss2017 = SpreadsheetApp.openById("");
  var sheet2017 = ss2017.getSheetByName("2017");

  var lastSourceRow = Sheet.getLastRow();
  var lastSourceCol = Sheet.getLastColumn();

  var sourceRange = Sheet.getRange(1, 1, lastSourceRow, lastSourceCol);
  var sourceData = sourceRange.getValues();
  var lenght = sourceData.length;
  //Logger.log(lenght);

  var time = new Date();
  time = Utilities.formatDate(time, "GMT+01:00", "dd/MM/yy, HH:mm:ss");


      for(i=5326;i<=lenght;i++) 
//my i=5326 is just cuz I had already
// information on my sheet that was transfered before this script existed
      {

        var columnAY = Sheet.getRange(i,51).getValue();
        var checkReservation = Sheet.getRange(i,2).getValue();

           if(columnAY == ".")
           {
       }
       else
       {
      var B = Sheet.getRange(i,2).getValue();
      var F = Sheet.getRange(i,6).getValue();
      var E = Sheet.getRange(i,5).getValue();
      var K = Sheet.getRange(i,11).getValue();
      var L = Sheet.getRange(i,12).getValue();
      var V = Sheet.getRange(i,22).getValue();
      var O = Sheet.getRange(i,15).getValue();
      var P = Sheet.getRange(i,16).getValue();
      var Q = Sheet.getRange(i,17).getValue();
      var AF = Sheet.getRange(i,32).getValue();
      var AG = Sheet.getRange(i,33).getValue();
      var N = Sheet.getRange(i,14).getValue();
      var AI = Sheet.getRange(i,35).getValue();
      var AB = Sheet.getRange(i,28).getValue();
      var AC = Sheet.getRange(i,29).getValue();   



      var array = ["",B,F,E,K,L,"",V,O,P,Q,AF,AG,"","",N,N,AI,"","",AB,AC,"","","","",time];

      sheet2017.appendRow(array);


       Sheet.getRange(i,51).setValue(".");


       }
  }
}

p.s.:我的电子表格中还有一个菜单,可以在每次我不确定这是否与问题相关时运行脚本:P

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('My Menu')
      .addItem('Copy to 2017', 'AppendRow')
      .addToUi();

感谢每条评论! :)

【问题讨论】:

  • 对于想要了解 Google Apps 脚本中性能瓶颈是如何发生的用户,值得阅读来自 Google 的 Best Practices Guide

标签: arrays performance google-apps-script google-sheets


【解决方案1】:

我必须承认在弄清楚我的 i 与您的 i 的协调方式方面存在一些问题,但我认为我的专栏是正确的。所以检查一下,但这应该运行得更快一些。

function AppendRow() 
{
  var ss0=SpreadsheetApp.getActive();
  var sh0=ss.getSheetByName('Sheet1');
  var rg0=sh0.getDataRange();
  var vA0=rg0.getValues();
  var ss1=SpreadsheetApp.openById(id);
  var sh1=ss1.getSheetByName('2017');
  var TimeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yy HH:mm:ss");
  for(i=5326;i<vA0.length;i++)
  {
    var columnAY=vA0[i][50];
    var checkReservation=vA0[i][1];
    if(vA0[i][50]!='.')
    {
      var B = vA0[i][1];//Sheet.getRange(i,2).getValue();
      var F = vA0[i][5];//Sheet.getRange(i,6).getValue();
      var E = vA0[i][4];//Sheet.getRange(i,5).getValue();
      var K = vA0[i][10];//Sheet.getRange(i,11).getValue();
      var L = vA0[i][11];//Sheet.getRange(i,12).getValue();
      var V = vA0[i][21];//Sheet.getRange(i,22).getValue();
      var O = vA0[i][14];//Sheet.getRange(i,15).getValue();
      var P = vA0[i][15];//Sheet.getRange(i,16).getValue();
      var Q = vA0[i][16];//Sheet.getRange(i,17).getValue();
      var AF = vA0[i][31];//Sheet.getRange(i,32).getValue();
      var AG = vA0[i][32];//Sheet.getRange(i,33).getValue();
      var N = vA0[i][13];//Sheet.getRange(i,14).getValue();
      var AI = vA0[i][34];//Sheet.getRange(i,35).getValue();
      var AB = vA0[i][27];//Sheet.getRange(i,28).getValue();
      var AC = vA0[i][28];//Sheet.getRange(i,29).getValue();   
      var array = ["",B,F,E,K,L,"",V,O,P,Q,AF,AG,"","",N,N,AI,"","",AB,AC,"","","","",TimeStamp];
      sh1.appendRow(array);
      sh0.getRange(i+1,51).setValue(".");
    }
  }
}

【讨论】:

  • 您的解决方案非常有用,现在每行需要 4-8 秒。谢谢,我真的需要学习你是如何做到这一点的 :) 如果有可能让它更快,但我已经对这个很满意了!
  • 基本思想是避免使用 setValue 和 getValue,而是使用 getValues() 并从数组中执行尽可能多的操作。有些是不可避免的,所以尽可能减少。
猜你喜欢
  • 2010-11-09
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多