谷歌脚本 - 超时和简化

时间:2017-03-26 23:12:11

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

我一直在使用Google脚本。当为hide / unhide选择下拉列表时,脚本的目的是取消隐藏或隐藏三个选项卡中的某些行。我可能有两件事我想解决,但在互联网上找不到任何有用的信息:

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

1 个答案:

答案 0 :(得分: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
      }
    }  
  }
}