2017-03-04 175 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

相關問題