Please use this script if you want:
- Create a new filter
- Create a new filter based on the existing filter and preserve criteria
- Create a filter with default bounds: row 1, column 1, last row, last column

The Script
/**
* Creates/Updates filter
* Preserves previously filtered data
*
* Parameters are optional
*
* @param {string} sheet (active)
* @param {integer} row1 (1)
* @param {integer} row2 (last)
* @param {integer} column1 (1)
* @param {integer} column2 (last)
*/
function createFilter_(sets) {
// sheet
var ss = SpreadsheetApp.getActive();
var s;
if (sets.sheet) {
s = ss.getSheetByName(sets.sheet);
} else {
s = ss.getActiveSheet();
}
// existing filter?
var filter = s.getFilter();
// finding range boundaries 4 filter
var columns = [], criterias = [], criteria;
var column1, column2, row1;
var row2 = sets.row2 || s.getMaxRows();
if (filter) {
// remember criterias
var r = filter.getRange();
row1 = r.getRow();
if (!sets.row1 || row1 === sets.row1) {
// use old filter boundaries
column1 = r.getColumn();
column2 = r.getWidth() + column1 - 1;
for (var i = column1; i <= column2; i++) {
columns.push(i);
criteria = filter.getColumnFilterCriteria(i);
criterias.push(criteria);
}
} else {
row1 = sets.row1
column1 = sets.column1 || 1;
column2 = sets.column2 || s.getMaxColumns();
}
// remove filter
filter.remove();
} else {
// create new filter
column1 = sets.column1 || 1;
column2 = sets.column2 || s.getMaxColumns();
row1 = sets.row1 || 1;
}
// range
var range = s.getRange(
row1,
column1,
row2 - row1 + 1,
column2 - column1 + 1
);
// create filter
var newfilter = range.createFilter();
// adjust criterias if needed
for (var i = 0; i < columns.length; i++) {
if (criterias[i]) {
newfilter.setColumnFilterCriteria(
columns[I],
criterias[I]);
}
}
return '✔️ filter for range ' + range.getA1Notation();
}
Usage
function createNewFilter() {
var sets = {
sheet: 'Sheet2',
row1: 5,
row2: 50,
column1: 2,
column2: 8
}
var result = createFilter_(sets);
console.log(result);
}
Update existing filter:
function updateExistingFilter() {
var sets = {
sheet: 'Sheet1'
}
var result = createFilter_(sets);
console.log(result);
}