2017-03-26 53 views
1

我一直在使用谷歌腳本一段時間了。該腳本的目的是在隱藏/取消隱藏選擇下拉列表時隱藏或隱藏三個選項卡中的某些行。我可能有兩件事我想解決,並找不到任何有用的信息在那裏interwebs:谷歌腳本 - 超時和簡化

1)我認爲腳本按操作的順序運行。所以當選擇一個下拉選項卡時,它會立即產生結果,因爲這是腳本的第一個「層」。第二個選項卡比較慢,因爲它是腳本的第二個「圖層」,第三個選項卡需要相當長的一段時間,因爲它是第三個「圖層」。有沒有一種方法來簡化這個腳本,使製表符的功能一樣快?

2)在第三個標籤上,好像腳本會超時。所有的行都會取消隱藏,但是當你進入隱藏它們時,它會停在某一行。但是,如果您轉到腳本並手動運行腳本,它將完全正常工作。下面是我一直使用的腳本(我刪了很多行下面,否則這將是相當長的):

function onEdit(e) { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = ss.getSheetByName("TX MD 2017");   
    var row = s.getRange('C2').getValues();       
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    { s.hideRows(5); 
     s.hideRows(7); 
     s.hideRows(9);} 

    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
}  
s = ss.getSheetByName("DC MD 2017");   
    row = s.getRange('C2').getValues();       
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    { s.hideRows(6); 
     s.hideRows(7); 
     s.hideRows(9); }       
    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
           } 
s = ss.getSheetByName("ATL MD 2017");   
row = s.getRange('C2').getValues(); 
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    {s.hideRows(6); 
     s.hideRows(7); 
     s.hideRows(9);}       
    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
           } 
} 
+0

由於'c2'是單細胞,我覺得'for'是沒有必要的。你也調用過'ss.getDataRange()'三次,但它的值不會改變。 –

回答

1

這條線:

s.unhideRow(ss.getDataRange()); 

應該是:

s.showRows(1, s.getLastRow()); 

使用s.unhideRow(ss.getDataRange())您將獲得整個電子表格的數據範圍。
文檔狀態:

在電子表格中

這可能是爲什麼代碼運行很慢,包括所有的數據的範圍。

的代碼可被合併到:

function onEdit(e) { 
    var arrayOfRowsToHide,i,j,k,L,objectOfSettings,row,s,ss; 

    ss = SpreadsheetApp.getActiveSpreadsheet();      

    objectOfSettings = { 
    "TX MD 2017":[5,7,9], 
    "DC MD 2017":[6,7,9], 
    "ATL MD 2017":[6,7,9] 
    } 

    for (k in objectOfSettings) {//Loop through all settings 
    s.showRows(1); 
    s = ss.getSheetByName(k);//get this sheet by name 
    row = s.getRange('C2').getValues(); 
    Logger.log('row: ' + row) 
    L = row.length;//The number of rows to check 

    arrayOfRowsToHide = objectOfSettings[k];//Get array of row numbers 

    for (i=0; i<L; i++) {//Loop through all rows in the data from getValues() 
     if(row[i] === 'hide') { 
     for (j=0;j<arrayOfRowsToHide.length;j++) {//hide all rows 
      s.hideRows(arrayOfRowsToHide[j]); 
     } 
     break;//If this row has a status of "hide" then hide rows and quit 
     } else if (row[i] === 'unhide') { 
     s.showRows(1, s.getLastRow());//show all rows in the sheet 
     break;//continue to next sheet 
     } 
    } 
    } 
} 
+0

感謝您的回覆。我放置了s.showRows(1,s.getLastRow()),它似乎會更快。我將努力實施整合,但可能需要一點時間來克服學習曲線。再次感謝。 – davecut85