根据单元格值隐藏 google sheet 中的多行 - 性能问题

Hiding multiple rows in google sheet based on cell value - perfromance issue

我在 google sheet 中有一个简单的数据集,占据了几个列 (A:N) 和大约 100 行。每行代表一个任务,任务可能处于打开或关闭状态。状态值在 M 列中。

默认情况下,所有任务都具有状态 "OPEN",但是,当用户关闭任务并选择状态 "CLOSED" 时,我想隐藏该任务所在的行。 尽管下面的代码可以按预期工作(初始版本 1),但感觉滞后和缓慢。

为了寻找解决方案,我已将代码缩短为版本 2,但结果相同,因此我认为此脚本的工作方式一定有一些基本原理。

我也检查了这个 (Google sheets Script to Hide Rows in Batch.) 解决方案,但在我的情况下它根本不起作用,即速度并没有真正改变那么多。 使用他们的示例,我生成了代码的版本 3。

如果对这段代码有任何改进,我将不胜感激。

谢谢。

PS。 在下面的代码(版本 1)中,我正在测试第二列 (B),因此 getRange(1,2,lastRow,1)

// Version 1
function hideClosed_ver1() {

  var sheet = SpreadsheetApp.getActive().getSheetByName("Hide"); 
  var lastRow =  sheet.getLastRow();
  var arr = sheet.getRange(1,2,lastRow,1).getValues();

  for(var i = 0; i < arr.length; i++)
  {
    if(arr[i][0]==='Closed')
    {
      sheet.hideRows(i + 1);
    }
  }
}

// Version 2

function hideClosed_ver2() {

  var app = SpreadsheetApp.getActive().getSheetByName('Hide');
  app.getRange('B:B').getValues().forEach(function (r, i) {
    if (r[0] == "Closed")
      app.hideRows(i + 1)
      });   
}

// Version 3

function hideClosed_ver3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Hide");
  var currentRange = ss.getRangeByName("Status");
  var rangeStart = currentRange.getRow();
  var values = currentRange.getValues();

  var index = 0, rows = 1;
  var show = !(values[0][1] == "Closed" );

  for (var i = 1, length = values.length; i < length; i++) {
    if (values[i][0] == "Closed" ) {
      if (show) {
        sheet.showRows(rangeStart + index, rows);
        show = false;
        index = i;
        rows = 1;
      } else
        rows++;
    } else {
      if (show)
        rows++;
      else {
        sheet.hideRows(rangeStart + index, rows);
        show = true;
        index = i;
        rows = 1;
      }
    }
  }

  if (show)
    sheet.showRows(rangeStart + index, rows);
  else
    sheet.hideRows(rangeStart + index, rows);
}
  • 当 "B" 列中有 "Closed" 的值时,您想隐藏行。
  • 您想运行以上,成本低。

如果我的理解是正确的,使用表格 API 怎么样?使用Sheets API的batchUpdate方法时,一次API调用可以隐藏多行。

当您使用表格 API 时,请在高级 Google 服务和 API 控制台中启用表格 API。您可以在 .

了解如何启用表格 API

修改后的脚本:

请复制并粘贴以下脚本和运行。

function sample() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
  var sheet = ss.getSheetByName("Hide"); // Modified

  var lastRow =  sheet.getLastRow();
  var rng = sheet.getRange(1,2,lastRow,1);
  var arr = rng.getValues();

  // Following script was added.
  var sheetId = sheet.getSheetId();
  var reqs = arr.reduce(function(ar, e, i) {
    if (e[0] === 'Closed') {
      var req = {"updateDimensionProperties": {
        "properties": {"hiddenByUser": true},
        "range": {"dimension": "ROWS", "startIndex": i, "endIndex": i + 1, "sheetId": sheetId},
        "fields": "hiddenByUser",
      }};
      ar.push(req);
    }
    return ar;
  }, []);
  Sheets.Spreadsheets.batchUpdate({"requests": reqs}, ss.getId());
}

参考文献:

如果这不是您想要的结果,请告诉我。我想修改一下。