电子表格的Google脚本非常慢

时间:2017-09-24 14:25:38

标签: google-apps-script google-sheets

我不是专业人士,但我的电子表格需要这个Google脚本。我正在寻找拼图来构建我的代码。最后它工作但很慢。有人能帮我吗?我可以在慢动作中看到代码是如何工作的。 : - (

我的电子表格或工作表有很多条目,但有些行是空的(超过1000行)。使用过滤功能,我可以非常快速地隐藏这些行,只需几秒钟。我不是电子表格的用户而只是创作者。普通用户真的不是专家,使用过滤功能是他们的挑战。我以为我可以将脚本中的所有步骤组合在一起,并使其可以通过按钮使用。一部分是隐藏空行。

脚本在N列检查是否有1或0.如果有0,则该行应隐藏。该脚本从第7行开始到1150年。隐藏一行需要每秒一秒!这真的很慢。如果我的代码是垃圾,是否可以通过脚本激活过滤器功能?

function hideRows() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("Order"));
  var sheet = SpreadsheetApp.getActiveSheet();
  var column = 14;
  var cell = 0;
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();

  for (var row = 7; row < lastRow; row++) {
    cell = sheet.getRange(row, column).getValues();
    if (cell == 0){
      sheet.hideRows(row);
    }
    else {
      sheet.showRows(row);
    }
  } 
}

2 个答案:

答案 0 :(得分:0)

试试这个:

function hideRows() 
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1').activate();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  for (var i=6;i<vA.length-1;i++)//vA.length-1 stops before last row i=6 is row 7
  {
    if (vA[i][13] == 0)
    {
      sh.hideRows(i+1);
    }
    else 
    {
      sh.showRows(i+1);
    }
  } 
}

数组索引比行数和列数少一个,所以你必须保持这一直,但你一次得到所有数据然后循环运行得快得多,因为你读取数组而不是必须访问每个值的电子表格。

答案 1 :(得分:0)

getValues()方法返回一个2D数组,因此您应该使用getValue()代替,它将返回您定位的单元格的内容。我重写了你发布的片段以获得更好的语法/格式,因为通过2D数组递增要比递增单元格/范围快得多:

function hideRows() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Order"); //get sheet
  var nRows = sheet.getLastRow() - 7; //# of rows to search

  var values = sheet.getRange(7, 14, nRows, 1).getValues(); //Get 2D array of values [[],[],...]
  //increment through the full index range of values (0-7)
  for (var i in values) {
    if (values[i][0] == 0) sheet.hideRows(i+7); //i+7 is the rowIndex (7-14)
    else sheet.showRows(i+7);
  }
}

那应该完成你想要做的事情。如果您有任何问题或疑问,请告诉我。