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

时间:2017-03-04 23:43:12

标签: google-apps-script google-sheets spreadsheet

我编写了这个应该每晚都运行的脚本,但问题是执行时间过长会导致服务器关闭它。我们有一个电子表格,我们将其用作日历来组织我们的学校制作,我们希望它能够自动隐藏已经过去的日子。我在大约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);
        }
      }
    }
  }
}

我认为只扫描到正确的行然后将所有这些作为范围隐藏起来必须更容易,因为我认为脚本一次只执行一次。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一个例程,用于查找代表比昨天更早的天数的行范围。它同时隐藏了所有这些,我猜测它比一次做一个快得多。当然,这假设您可以按日期顺序获取所有日期。

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);
}