如何在Google表格中正确显示“显示和隐藏行”脚本功能

问题描述 投票:1回答:2

我正在尝试在(Google工作表)工作表“Info Pull”中显示一个脚本,根据C列的内容显示/隐藏行。

目前我在C列中运行以下公式:

=if(or(len(H47)>0,len(I47)>0,len(J47)>0,len(K47)>0),"unhide","hide")

根据细胞H,I,J和K 47是否返回值,产生“隐藏”或“取消隐藏”。

如果任何上述单元格返回值,则如果所有单元格都没有返回任何值,则C列中的相应单元格将变为“取消隐藏”,反之亦然。

我一直试图让这个脚本根据C列的内容隐藏/取消隐藏行,但是,脚本只是部分运行。

如果我主动将“隐藏”键入C单元格,则该行将隐藏。但是,如果我将10行“隐藏”粘贴到10个C单元格中,则只会隐藏第一行。同样,脚本不会根据IF公式的变化结果重新评估和隐藏/取消隐藏。如果我将细胞H47减少,将C47转为隐藏,则细胞不会隐藏。

此外,如果我将单元格A1设置为“隐藏”并在C列的一组单元格中粘贴“= $ A $ 1”,则只有该组中的第一个单元格将隐藏,如果我将A1设置为“取消隐藏”,则不会取消隐藏。我认为这可能与我的触发器有关,但我对脚本相对较新,并且不确定。

function onEdit(e) {
  hideAndShowRows(e);
}

    function hideAndShowRows(e) {

  var sheetsToWatch = ['Info Pull'];
  var columnToWatch = 3;

  var sheet = e.range.getSheet();
  if (sheetsToWatch.indexOf(sheet.getName()) < 0)  {
    return;
  }
  var editedRow = e.range.getRow();
  var cellToWatch = sheet.getRange(editedRow, columnToWatch);
  if (cellToWatch.getValue().toLowerCase() === 'hide') {
    sheet.hideRows(editedRow);
  }
  if (cellToWatch.getValue().toLowerCase() === 'unhide') {
    sheet.showRows(editedRow);
  }
}

我想根据C列中的公式是否隐藏/取消隐藏来隐藏/取消隐藏单元格。

javascript google-apps-script google-sheets triggers
2个回答
0
投票

这是一个修改过的函数,可以解决一些问题:

function onEdit(e) {
  hideAndShowRows(e);
}

    function hideAndShowRows(e) {

  var sheetsToWatch = ['Setup'];
  var columnToWatch = 3;

  var sheet = e.range.getSheet();
  if (sheetsToWatch.indexOf(sheet.getName()) < 0)  {
    return;
  }
  var editedRow = e.range.getRow();
  var numOfRows = e.range.getNumRows()
  for (var i = 0; i<numOfRows ; i++){
  var cellToWatch = sheet.getRange(editedRow + i, columnToWatch);
  if (cellToWatch.getValue().toLowerCase() === 'hide') {
    sheet.hideRows(editedRow + i);
  }
  if (cellToWatch.getValue().toLowerCase() === 'unhide') {
    sheet.showRows(editedRow + i);
  }
  }
}

首先,您的代码仅适用于已编辑的行,它不会查找任何其他行进行更改。特别是这一行:

var editedRow = e.range.getRow()

e是传递给简单触发器的event object,其中包含在这种情况下编辑范围的信息。上面的函数getRow()获取了编辑范围中的第一行,因此当您编辑乘法行时,只有第一行被隐藏。要获取已编辑的所有行,您将使用getNumRows()并循环遍历其中每一行,如下所示:

var editedRow = e.range.getRow();
  var numOfRows = e.range.getNumRows()
  for (var i = 0; i<numOfRows ; i++){
  var cellToWatch = sheet.getRange(editedRow + i, columnToWatch);
  if (cellToWatch.getValue().toLowerCase() === 'hide') {
    sheet.hideRows(editedRow + i);
  }
  if (cellToWatch.getValue().toLowerCase() === 'unhide') {
    sheet.showRows(editedRow + i);
  }
  }

最后,当你将所有单元格指向A1并且只编辑行A(只是单元格A1)时,需要注意的是,程序只会查找该行中的更改,即行A.您可以找到更多资源here


1
投票

您的代码“失败”,因为它只获取编辑范围的左上角单元格的行号

var editedRow = e.range.getRow();

var cellToWatch = sheet.getRange(editedRow, columnToWatch);

您可以使用以下属性来获取范围尺寸

e.range.rowStart
e.range.columnStart
e.range.rowEnd
e.range.columnEnd

或获取编辑范围的参考

e.range.getA1Notation();

有关

© www.soinside.com 2019 - 2024. All rights reserved.