Скрипт Google Sheets для скрытия строки, если установлен флажок - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь найти рабочий код, который будет автоматически скрывать строку, если установлен флажок в столбце F этой строки.

Я перепробовал все найденные мной сценарии, и, похоже, ничего не работает.К сожалению, я не разбираюсь в коде и не могу найти проблему.

Это то, что у меня сейчас есть:

function onOpen() {
  var s = SpreadsheetApp.getActive().getSheetByName("Checklists");
  s.showRows(1, s.getMaxRows());

  s.getRange('F2:F200')
    .getValues()
    .forEach( function (r, i) {
    if (r[0] == "TRUE") 
      s.hideRows(i + 1);
    });
}

Лист, над которым я работаю, это «Контрольные списки», а столбец, содержащий флажок, равен F. Значение флажка равно ИСТИНА.или ЛОЖЬ.Если значение TRUE, я хочу, чтобы эта строка была скрыта.

Может кто-нибудь помочь, пожалуйста !!!

1 Ответ

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

Быстрый тест, который я смог запустить, состоял в том, чтобы установить столбец флажков в столбце F, а затем создать функцию, которая перехватывает каждое событие редактирования на листе.Это сразу же поймет, когда пользователь установит флажок, а затем скроет эту строку.

Хитрость в использовании события onEdit заключается в определении, какая ячейка была фактически изменена.В вашем случае вы хотите полностью следовать своей логике, только если изменение происходит с флажком в столбце F. В моем коде я использовал функцию, чтобы убедиться, что изменение находится в желаемом диапазоне.Функция выглядит следующим образом:

function isInRange(checkRange, targetCell) {
  //--- check the target cell's row and column against the given
  //    checkrange area and return True if the target cell is
  //    inside that range
  var targetRow = targetCell.getRow();
  if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;

  var targetColumn = targetCell.getColumn();
  if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;

  //--- the target cell is in the range!
  return true;
}

Итак, все, что нужно сделать вашей функции onEdit, - это сделать быстрый вызов при запуске события редактирования, чтобы увидеть, попадает ли изменение в диапазон, в котором вы находитесь.находясь в поиске.В этом случае я установил переменную с моим диапазоном для проверки:

var thisSheet = SpreadsheetApp.getActiveSheet();
var checkRange = thisSheet.getRange("F2:F200");  
if (isInRange(checkRange, eventObj.range)) {

После этого нужно просто выбрать номер строки и скрыть или показать.Вот полный пример решения:

function isInRange(checkRange, targetCell) {
  //--- check the target cell's row and column against the given
  //    checkrange area and return True if the target cell is
  //    inside that range
  var targetRow = targetCell.getRow();
  if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;

  var targetColumn = targetCell.getColumn();
  if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;

  //--- the target cell is in the range!
  return true;
}

function onEdit(eventObj) {
  //--- you could set up a dynamic named range for this area to make it easier
  var thisSheet = SpreadsheetApp.getActiveSheet();
  var checkRange = thisSheet.getRange("F2:F200");  
  if (isInRange(checkRange, eventObj.range)) {
    //--- so one of the checkboxes has changed its value, so hide or show
    //    that row
    var checkbox = eventObj.range;
    var rowIndex = checkbox.getRow();
    Logger.log('detected change in checkbox at ' + checkbox.getA1Notation() + ', value is now ' + checkbox.getValue());
    if (checkbox.getValue() == true) {
      Logger.log('hiding the row');
      thisSheet.hideRows(rowIndex, 1);
    } else {
      Logger.log('showing the row');
      thisSheet.showRows(rowIndex, 1);
    }
  }
}
...