Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 基于单元格值在google工作表中隐藏多行-性能问题_Google Apps Script_Google Sheets_Row_Show Hide_Google Sheets Api - Fatal编程技术网

Google apps script 基于单元格值在google工作表中隐藏多行-性能问题

Google apps script 基于单元格值在google工作表中隐藏多行-性能问题,google-apps-script,google-sheets,row,show-hide,google-sheets-api,Google Apps Script,Google Sheets,Row,Show Hide,Google Sheets Api,我在一张谷歌表中有一个简单的数据集,占据了几个列(a:N),向下大约100行。每行代表一个任务,任务可能处于打开或关闭状态。状态值在M列中 默认情况下,所有任务的状态都为“打开”,但是,当用户关闭任务并选择状态“关闭”时,我想隐藏该任务的行。 虽然下面的代码可以按预期工作(初始版本1),但它感觉很慢 为了寻找解决方案,我将代码缩短到版本2,但是结果相同,因此我认为这个脚本的工作方式一定有一些基本的东西 我还检查了这个(.)解决方案,但在我的情况下,它根本不起作用,即速度变化不大。 通过使用他们的

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

默认情况下,所有任务的状态都为“打开”,但是,当用户关闭任务并选择状态“关闭”时,我想隐藏该任务的行。 虽然下面的代码可以按预期工作(初始版本1),但它感觉很慢

为了寻找解决方案,我将代码缩短到版本2,但是结果相同,因此我认为这个脚本的工作方式一定有一些基本的东西

我还检查了这个(.)解决方案,但在我的情况下,它根本不起作用,即速度变化不大。 通过使用他们的示例,我生成了代码的第3版

我将感谢任何改进此代码请

多谢各位

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

//版本3
函数hideClosed_ver3(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“隐藏”);
var currentRange=ss.getRangeByName(“状态”);
var rangeStart=currentRange.getRow();
var values=currentRange.getValues();
var指数=0,行数=1;
变量显示=!(值[0][1]=“已关闭”);
对于(变量i=1,长度=values.length;i
  • 当“B”列中有“Closed”值时,您希望隐藏行
  • 你们想以低成本跑在上面
如果我的理解是正确的,那么使用Sheets API如何?使用Sheets API的batchUpdate方法时,一次API调用可以隐藏多行

使用Sheets API时,请在高级Google服务和API控制台启用Sheets 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());
}
参考资料:
如果这不是你想要的结果,请告诉我。我想修改它。

  • 当“B”列中有“Closed”值时,您希望隐藏行
  • 你们想以低成本跑在上面
如果我的理解是正确的,那么使用Sheets API如何?使用Sheets API的batchUpdate方法时,一次API调用可以隐藏多行

使用Sheets API时,请在高级Google服务和API控制台启用Sheets 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());
}
参考资料:

如果这不是你想要的结果,请告诉我。我想修改它。

这是如何执行的?考虑床单API@tehhowch. 最初我计划为一行行运行脚本,但现在我认为最好在每次选择状态“CLOSED”时隐藏单个行。这是如何执行的?考虑床单API@tehhowch. 最初我打算为一行行运行脚本,但现在我认为最好在每次选择状态“CLOSED”时隐藏单个行。谢谢您的提示。很遗憾,无法启动API。。。但是,我认为每次用户选择“关闭”状态时,我都应该运行OneEdit(e),并单独隐藏每一行。@AlexShevyakov感谢您提供的其他信息。谢谢您的提示。很遗憾,无法启动API。。。但是,我认为每次用户选择“关闭”状态时,我都应该运行OneEdit(e),并单独隐藏每一行。@AlexShevyakov感谢您提供的其他信息。
// 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);
}
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());
}