Используйте Google App Script для вставки нового представления фильтра, содержащего пользовательскую формулу - PullRequest
0 голосов
/ 28 января 2020

См. Пример изображения ниже.

enter image description here

Я хотел бы использовать редактор скриптов Google Sheets для добавления представления фильтра в ячейке B3, которая фильтрует по пользовательской формуле =(B4=$B$1).

. Планируется добавить функцию onEdit, которая проверяет, изменилось ли значение в ячейке B1, и, если это так, сбросить фильтр просмотра в ячейке B3.

Это ломает мне мозг! Кажется, я не могу найти способ автоматического обновления / обновления sh фильтра, как только мое значение в B1 изменилось.

Мой код в настоящее время выглядит так, но это не добавляет заново пользовательская формула. Он просто показывает мне все непустые строки.

function onEdit(e){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheetname = "Lactation";
  var sheet = ss.getSheetByName(sheetname);
  var erow = e.range.getRow();
  //Logger.log("DEBUG: row = "+erow);
  var ecolumn = e.range.getColumn();
  //Logger.log("DEBUG: column = "+ecolumn);
  if (erow == 1 & ecolumn == 2 ){
    // there is a match so the cell is B2
    //Logger.log("DEBUG: the cell is B2");
    updatefilter();
  }
  else
  {
    // there is no match so the cell is NOT I3
    //Logger.log("DEBUG: the cell is not I3");
  }

}

function updatefilter() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B3').activate();
  var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['', 'No'])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(2, criteria);
};

1 Ответ

2 голосов
/ 29 января 2020
  • Вы хотите изменить базовый c фильтр ячеек "B3: B" при редактировании ячейки "B1" на листе Lactation.
    • В этом случае вы хотите использовать триггер события OnEdit.
  • Вы хотите использовать =(B4=$B$1), которая является пользовательской формулой, в качестве условия фильтра.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Очки модификации:

  • Вы можете использовать объект события как e из onEdit(e).
  • Чтобы использовать пользовательскую функцию для фильтра basi c, вы можете использовать whenFormulaSatisfied.

Модифицированный скрипт:

Чтобы запустить скрипт, отредактируйте ячейку B1 на листе Lactation.

function onEdit(e){
  var sheetName = "Lactation";
  var editCell = "B1";

  var range = e.range;
  var sheet = range.getSheet();
  if (range.getA1Notation() == editCell && sheet.getSheetName() == sheetName) {
    updatefilter(sheet);
  } else {
    // do something
  }
}

function updatefilter(sheet) {
  sheet.getRange('B3').activate();
  var criteria = SpreadsheetApp.newFilterCriteria().whenFormulaSatisfied("=(B4=$B$1)").build();
  var filter = sheet.getFilter();
  if (!filter) {
    filter = sheet.getRange("B3:B").createFilter();
  }
  filter.setColumnFilterCriteria(2, criteria);
};
  • В этом сценарии, когда ячейка "B1" на листе Lactation отредактирована, функция updatefilter запускается триггером события OnEdit. И когда фильтр basi c существует, он обновляется. Если фильтр не существует, фильтр устанавливается как новый фильтр. Диапазон фильтра "B3: B". В качестве критерия используется пользовательская функция =(B4=$B$1).

Примечание:

  • В приведенном выше сценарии можно использовать простой триггер. Но если вы используете методы, требующие авторизации, при возникновении ошибки попробуйте использовать устанавливаемые триггеры.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

...