如何让我的"显示和隐藏行"脚本在 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单元格中键入"hide",则该行将隐藏。但是,如果我将10行"隐藏"粘贴到10个C单元格中,则只有第一行会隐藏。同样,脚本不会根据IF公式的变化结果重新评估和隐藏/取消隐藏。如果我减少细胞H47的数量,将C47转为隐藏,则细胞不会隐藏。

此外,如果我将单元格A1设置为"隐藏"并将"=$A$1"粘贴到列C中的一组单元格中,则只有该组中的第一个单元格将隐藏,如果我设置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列中的公式是否返回隐藏/取消隐藏来隐藏/取消显示单元格。

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

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

相关

  • 基于单元格内容隐藏行-onEdit问题-
  • 我们在哪里可以找到Google Objects的未记录属性
  • 满足条件时隐藏行

这里有一个修改后的函数,可以解决几个问题:

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是一个传递给简单触发器的事件对象,其中包含的信息类似于在本例中编辑的范围。上面的函数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)中的更改。您可以在此处找到更多资源。

最新更新