Как я могу использовать несколько критериев при настройке фильтра

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

У меня есть следующий код для установки фильтра с помощью скрипта Google Apps в таблице Google. Что я действительно хочу в качестве фильтра, так это когда дата предшествует сегодняшнему дню или равна сегодняшнему дню, или если ячейка пуста. Как я могу настроить такую логику OR?

   var newCriteria = SpreadsheetApp.newFilterCriteria()
     .whenDateBefore(SpreadsheetApp.RelativeDate.TODAY)
     .build();  
  dataSheet.getFilter().setColumnFilterCriteria(3, newCriteria);
  

Комментарии:

1. Я не уверен, что понимаю. Мне нужен такой фильтр, screencast.com/t/EqkIkgBkhk @Marios

Ответ №1:

Используйте встроенную формулу с .whenFormulaSatisfied() :

 const formula = '=OR(C2<=TODAY(),C2="")';//only needs to refer to the first non header row. Rest will be applied automatically
const newCriteria = SpreadsheetApp.newFilterCriteria()
 .whenFormulaSatisfied(formula)
 .build(); 
  

Комментарии:

1. Я попробовал тот же подход, но вместо этого использовал arrayformulas, потому что думал, что мы должны передать все значения, и это не удалось. Хорошее решение 🙂

Ответ №2:

Решение:

Хотя другое решение намного элегантнее, вот мой подход, который использует другой метод:

 function filterDates() {
  
  const dataSheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  
  if(dataSheet.getFilter() != null) {
     dataSheet.getFilter().remove();
}
  
  const dates=dataSheet.getRange(2,3,dataSheet.getLastRow(),1).getValues().flat();
  const dates_str=dataSheet.getRange(2,3,dataSheet.getLastRow(),1).getDisplayValues().flat();
  const h_dates=[];
  
  dates.forEach((d,index)=>{
   if(d>new Date()){h_dates.push(dates_str[index]);}});
  
  const criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(h_dates)
  .build();
  dataSheet.getDataRange().createFilter().setColumnFilterCriteria(3, criteria);
  
}
  

Метод:

  • Я нахожу даты в виде строк, которые удовлетворяют желаемым условиям,

  • затем я отфильтровываю эти значения, используя: .setHiddenValues()