【问题标题】:How to hide a column if all cells in a range are blank?如果一个范围内的所有单元格都是空白的,如何隐藏一列?
【发布时间】:2020-10-02 06:28:43
【问题描述】:

简单地说,我正在编写一个脚本,它将检查每隔一列包含的值的数量,特别是该列中第 3 行和第 53 行之间的值的数量。如果搜索中的所有单元格都是空白的,我想隐藏该列及其左侧的列。同样,如果搜索找到具有一个或多个值的隐藏列,我想取消隐藏该列以及它之前的列。

我一直在研究如何去做。我正在使用 for 循环来获取每隔一列的整数值。然后我使用这些值来设置我的范围并使用 .getValues 和 .length 来计算范围内的值的数量。现在,我从未从头开始创建 if/else 语句,但我的想法是将 .length 的输出与数字 0 进行比较,如果长度等于 0,则隐藏列,但如果有其他情况,则取消隐藏列。

这是我写的脚本。

function Hide()  {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Coach");
  var maxRow = sheet.getMaxRows();
  var maxCol = sheet.getMaxColumns();
  var startCol = 5;
  var startRow = 3;
  var endRow = 53;
  for (col = startCol; col <= maxCol-4; col = +2)  {
    var range = sheet.getRange(startRow,col,endRow-startRow+1,1);
    var l = range.getValues().length;
    if (l == 0)  {
      sheet.hideColumns(col);
      sheet.hideColumns(col-1);
    }
    else  {
      sheet.showColumns(col);
      sheet.showColumns(col-1);
    }
  }
}

我的脚本有三个问题:

  • 脚本只会取消隐藏列。
  • 该脚本仅影响我的搜索条件中的第一个范围。
  • 脚本会运行,但永远不会结束。

关于第一个问题,getValues 似乎列出了范围内的所有单元格值,包括空白单元格。因此, .length 有效地计算范围内的所有单元格,而不仅仅是空白单元格。此外,搜索条件中的每个单元格都由一个公式填充,因此这也可能是第一个问题的一部分。不过,我不确定如何正确计算非空白值的数量。

我相信其他两个问题与我如何设置 if/else 语句有关。我以前从未从头开始创建过,但我读过如果创建不正确,if 语句会大大减慢脚本的运行时间。

我将非常感谢任何人能给我的任何帮助。谢谢!

【问题讨论】:

  • 每个帖子只关注 1 个问题。

标签: google-apps-script google-sheets


【解决方案1】:

修改点:

  • 在您的脚本中,当for (col = startCol; col &lt;= maxCol-4; col = +2) { 运行时,col 不会被col = +2 更改。至此,循环并未结束。
    • 我认为这可能是您问题The script only affects the first range in my search criteria.The script will run, but never end. 的原因。
  • 而且,在var l = range.getValues().length; 的情况下,l 始终不为0。因为range.getValues() 是二维数组。
    • 我认为这可能是您发出The script will only unhide columns. 问题的原因。

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

从:
for (col = startCol; col <= maxCol-4; col = +2)  {
  var range = sheet.getRange(startRow,col,endRow-startRow+1,1);
  var l = range.getValues().length;
  if (l == 0)  {
    sheet.hideColumns(col);
    sheet.hideColumns(col-1);
  }
  else  {
    sheet.showColumns(col);
    sheet.showColumns(col-1);
  }
}
至:
for (var col = startCol; col <= maxCol-4; col += 2) {  // Modified
  var range = sheet.getRange(startRow,col,endRow-startRow+1,1);
  var l = range.getValues().filter(([v]) => v.toString() != "").length;  // Modified
  if (l == 0)  {
    sheet.hideColumns(col);
    sheet.hideColumns(col-1);
  }
  else  {
    sheet.showColumns(col);
    sheet.showColumns(col-1);
  }
}

注意:

  • 我认为修改后的脚本可以正常运行。但我不确定脚本的结果是你想要做的。因此,如果这不是您期望的结果,请告诉我。我想修改它。届时能否提供您期望的样本输入输出情况?借此,我想确认一下。

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2018-02-28
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多