我希望我只是错过了一些简单的东西,但我一生都看不出为什么这不起作用:
// GET ALL SHEET NAMES FROM THE SPREADSHEET AND PUT INTO AN ARRAY
function sheetNames() {
var out = new Array()
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheets.length ; i++) {
out.push( [ checkSheetName(sheets[i].getName()) ] )
}
Logger.log("before : " + out);
var listOfsheets = out.filter(function(x){ return (x !== (undefined || null || '')); });
Logger.log("after : " + listOfsheets);
return listOfsheets ;
}
// SEARCH ALL SHEETS AND ONLY SELECT THEM IF THEY HAVE THE TEXT "REPORT_" IN THE NAME
function checkSheetName(sheetName) {
var checkFor = 'Report_'
if (sheetName.indexOf(checkFor) >= 0) {
return sheetName;
} else {
sheetName = '';
return sheetName;
}
我的记录器在通过过滤器之前和之后显示完全相同的结果。错误会很棒,但运行正常...只是似乎什么也没做。
我想另一个问题是,我可以在最初的 getSheets(( 中放一些东西,以便它只得到我需要的东西吗?但即使这是可能的,我仍然很好奇为什么我的过滤器不起作用
x
是一个数组而不是数组项字符串,让它
out.push( checkSheetName(sheets[i].getName()) ); //observe that array wrapping is removed
你可以通过做来缩短你的代码(假设工作表是类似数组的,而不是直接数组(
return Array.from( sheets ).filter( x => !!checkSheetName( x.getName() ) );
如果sheets
是一个数组,则使其
return sheets.filter( x => !!checkSheetName( x.getName() ) );
甚至没有checkSheetName
return sheets.filter( x => !!( x.getName().indexOf( "Report_" ) != -1 ) );
out.filter(function(x){ return (x !== (undefined || null || '')); });
您的过滤功能减少到
out.filter(function (x) { return (x !== ''); });
因为引擎会查看括号内部并从左到右解析:
(x !== (undefined || null || ''))
// undefined is falsy, replace with expression on the right
(x !== (null || ''))
// null is falsy, replace with expression on the right
(x !== '')
现在看看你正在过滤的内容:
out.push( [ checkSheetName(sheets[i].getName()) ] )
在这里,您将一个带有一个元素的新数组推送到out
数组上。删除方括号以仅推送名称。
由于x
始终是一个数组,因此它永远不会是空字符串,并且您的过滤器不会过滤掉任何内容。即使你去掉括号,使x
数组,如果x
是null
或undefined
,它仍然会通过你的过滤器。将过滤器替换为
out.filter(Boolean);
这会将您的数组值强制为布尔值。空字符串、null
和 undefined
都是假的,返回false
。其他字符串是真实的,并返回true
,您需要的确切过滤。