2017-03-26 52 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