簡體   English   中英

如何使我的“顯示和隱藏行”腳本在 Google 表格中正常運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM