![](/img/trans.png)
[英]How can I run my hide/show columns script on multiple ranges of columns in one google sheets spreadsheet?
[英]How to make my 'Show and hide rows' script function properly in Google Sheets
我試圖在(谷歌表格)工作表“信息拉取”中使用一個腳本,根據 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 設置為“隱藏”並將“=$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();
有關的
這是一個修改后的函數,可以解決幾個問題:
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 行)中的更改。您可以在此處找到更多資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.