gri*_*ies 0 javascript google-sheets google-apps-script
我正在尝试使用可变数量(0 到 3)的本身动态的过滤条件来过滤数组。例如,一个过滤条件基于用户从 Google 表格上的下拉列表中选择的名称。如果过滤条件不是动态的(例如名称是硬编码的),则它可以工作。请参阅下面的行。
const filterFn1 = "x => x[0] === 'John Doe'";
Run Code Online (Sandbox Code Playgroud)
我尝试过这个,但 Google Apps 脚本似乎无法识别new Function
const filterFn1 = new Function("x => x[0] === '" + name + "'");
Run Code Online (Sandbox Code Playgroud)
完整代码:
function myFilter() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const shtDash = ss.getSheetByName('Dashboard');
const shtDB = ss.getSheetByName('Database');
const lastDBRow = shtDB.getLastRow();
const arrData = shtDB.getRange(2,1,lastDBRow-1,4).getValues();
let arr = [];
const name = shtDash.getRange('B1').getValue();
if (name !== '') {
const filterFn1 = "x => x[0] === '" + name + "'";
arr.push(filterFn1);
}
const category = shtDash.getRange('B2').getValue();
if (category !== '') {
const filterFn2 = "x => x[1] === '" + category + "'";
arr.push(filterFn2);
}
const software = shtDash.getRange('B3').getValue();
if (software !== '') {
const filterFn3 = "x => x[2] === '" + software + "'";
arr.push(filterFn3);
}
const filtered = arrData.filter(x => arr.every(f => f(x)));
}
Run Code Online (Sandbox Code Playgroud)
function myFilter() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const shtDash = ss.getSheetByName('Dashboard');
const shtDB = ss.getSheetByName('Database');
let arrData = shtDB.getRange(2, 1, shtDB.getLastRow()-1, 4).getValues()
const filters = shtDash.getRange(`B1:B3`).getValues().flat()
filters.forEach((filter, index) => {
if (filter.length) arrData = arrData.filter(row => row[index] === filter)
})
return arrData
}
Run Code Online (Sandbox Code Playgroud)
这将检查该filter值是否不为空,然后将按每行的每个arrData值进行过滤。indexfilterindex
例如,如果第一个过滤器是X,arrData则将过滤包含X索引处的所有行0。如果第二个过滤器是Y,arrData将过滤包含Y索引处的所有行1等。
如果您需要更多解释或修改,请告诉我!
function myFilter() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const shtDash = ss.getSheetByName('Dashboard');
const shtDB = ss.getSheetByName('Database');
let arrData = shtDB.getRange(2, 1, shtDB.getLastRow()-1, 4).getValues()
const filters = shtDash.getRange(`B1:B3`).getValues().flat()
filters.forEach(filter => {
if (filter.length) arrData = arrData.filter(row => row.includes(filter))
})
return arrData
}
Run Code Online (Sandbox Code Playgroud)
了解更多: