2017-03-04 171 views
1

我已经编写了这个应该每天晚上运行的脚本,但问题是执行时间太长,服务器会关闭它。我们有一个电子表格作为日历来组织我们的学校制作,我们希望它能自动隐藏已经过去的日子。我在大约8个月前编写了这个脚本,花了大约6-7个小时才开始工作,并在电子表格足够长之前花费了很长时间。下面是该脚本:在Google表格中隐藏行的最有效方法是什么?

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

我想这一定是容易只是上下扫描到正确的行,然后隐藏所有的为范围,因为我觉得剧本做它一次一个。

感谢您提供的任何帮助。

+0

按日期排序的行是?如果代码找到具有第一个当前日期的行,如果代码隐藏所有从3行到该行减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); 
} 
+0

谢谢!这是一个很大的帮助。日期都是为了顺序,但是如果有一天有多个活动,它只会添加一个没有日期的空行(因为它写在上面的行中)。所以我需要通过将'var rowcntr = 0;'更改为'var rowcntr = -1;'这给我前两天实际上是我想要的。 :) –

+0

其实我在之前的评论中犯了一个错误。我不得不加倍“天”的价值,以及有两个前几天。 –

+0

听起来像你有问题的处理。玩的开心。 – Cooper

相关问题