Как заставить мой скрипт «Показывать и скрывать строки» правильно работать в Google Sheets - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь, чтобы скрипт (листы Google) (листы 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 превращается в «unhide» и наоборот, если все ячейки не возвращают значения.

Я пытался заставить этот скрипт скрывать / показывать строки, основанные на содержимом столбца C, однако скрипт работает только частично.

Если я активно наберу 'hide' в ячейку C, строка будет скрыта.Однако, если я вставлю 10 рядов 'hide' в ячейки 10 C, будет скрываться только первый ряд.Аналогично, сценарий не переоценивает и скрывает / скрывает на основании изменяющихся результатов формулы IF.Если я депопулирую ячейку H47, поворачивая C47, чтобы скрыть, ячейка не скрывается.

Кроме того, если я установлю для ячейки A1 значение 'hide' и вставлю '= $ 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 возвращает скрыть / показать.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вот модифицированная функция, которая решит несколько проблем:

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. Вы можете найти больше ресурсов здесь .

0 голосов
/ 26 января 2019

Ваш код "терпит неудачу", потому что он получает только номер строки в верхней левой ячейке отредактированного диапазона

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

Related

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...