【问题标题】:Google Script for a spreadsheet is very slow用于电子表格的 Google 脚本非常慢
【发布时间】:2018-03-05 14:09:12
【问题描述】:

我不是专业人士,但我的电子表格需要这个 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);
    }
  } 
}

【问题讨论】:

  • 您应该获取数组中的所有值,然后在循环中遍历它们,而不是一次获取一个值。它会明显更快。

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

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

数组索引比行号和列号少一,因此您必须保持正确,但您一次获取所有数据,然后循环运行得更快,因为您读取数组而不是访问每个值的电子表格。

【讨论】:

    【解决方案2】:

    getValues() 方法返回一个二维数组,因此您应该改用getValue(),它返回您定位的单元格的内容。我重写了您发布的 sn-p 以获得更好的语法/格式,因为通过 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);
      }
    }
    

    这应该可以完成您正在尝试做的事情。如果您有任何问题或疑问,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多