在 Google 表格中隐藏行的最有效方法是什么?

What is the most efficient way to hide rows in Google Sheets?

我写了这个脚本,每晚都应该 运行,但问题是执行时间太长,所以服务器将其关闭。我们有一个电子表格,用作日历来组织我们的学校生产,我们希望它能自动隐藏过去的日子。我大约 8 个月前写了这个脚本,我花了大约 6-7 个小时才开始工作,并且在我们深入了解电子表格之前它工作了一段时间,以至于它花费的时间太长了。这是脚本:

function hidePastDays(){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getSheetByName("OVERVIEW");
  var s2 = ss.getSheetByName("settings");
  var rows = s.getMaxRows();
  var today = s2.getRange(3, 2).getValue();
  var allsheets = ss.getSheets();
  s.showRows(1, rows);
  var dates = s2.getRange(3,4,rows-2).getValues();
  for (var d=0; d < dates.length; d++){
    if (dates[d]<today-2){
      s.hideRows(d+3, 1);
      for (var g in allsheets){
        var sheet=allsheets[g];
        if (sheet.getSheetName() == "OVERVIEW" || sheet.getSheetName() == "settings"){}
        else {
          sheet.hideRows(d+3, 1);
        }
      }
    }
  }
}

我认为只向下扫描到正确的行然后将它们全部隐藏为一个范围一定更容易,因为我认为脚本一次只做一个。

感谢您提供的任何帮助。

下面是一个例程,用于查找表示比昨天早几天的行范围。它一次隐藏所有这些,我猜这比一次隐藏一个要快得多。当然,这假设您可以按日期顺序获取所有日期。

function hideYesterdays()
{
  var sht = SpreadsheetApp.getActiveSheet();
  var drng = sht.getDataRange();
  var drngA = drng.getValues();
  var rows = drng.getLastRow();
  var firstRow = 6; //the row where dates start
  var day = 86400000;
  var yesterday = new Date().getTime() - day;// 1 day is 86400000 milliseconds

  var rowcntr = 0;
  while(drngA[rowcntr + firstRow][0] < yesterday) //the zero comes from the fact that my dates were in row 1. 
  {
    rowcntr++;
  }
  sht.hideRows(firstRow, rowcntr);
}