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