通过下面的代码,我有一个 Google 表格,并且我正在尝试从不同部分创建数组。
function onFormSubmitTest(e) {
//Open spreadsheet based on URL
var ss = SpreadsheetApp.openByUrl('sheetnamehere');
//Set as Active
SpreadsheetApp.setActiveSpreadsheet(ss);
//Set Tabs as Variables
var Rsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Emailer");
var Lsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Unique Databases");
//----Set last Rows as Variables----
// Gets Values from different sections
var formResponses = Rsheet.getRange("N3:N").getValues();
var databaseNames = Lsheet.getRange("A2:B").getValues();
var developerNames = Lsheet.getRange("F2:F").getValues();
// Filters to ranges that have values, ignores null
var lastRvalues = formResponses.filter(String);
var lastLvalues = databaseNames.filter(String);
var lastDvalues = developerNames.filter(String);
// Sorts arrays for faster indexing
var lastR = lastRvalues.sort();
var lastL = lastLvalues.sort();
var lastD = lastDvalues.sort();
// Unique Databases
var currentDatabases = lastL;
// Current Developers
var currentDevelopers = lastD
在“唯一数据库”选项卡上,工作表上有 100 行,其中只有 28 行有数据。如果我有下面的代码,我可以看到它只有预期的 28 个值:
var databaseNames = Lsheet.getRange("A2:A").getValues();
但是,当我添加另一列时,我得到 100 个值,其中绝大多数是 ["", ""]。需要注意的是,这 28 个值是键 > 值对,因此如果 A:A 中有一个值,B:B 中也会有一个值。如果 A:A 中为 null,则 B:B 为 null。
我做错了什么?
最佳答案
事实上,[["", ""], ["", ""]].filter(String)
返回整个数组。要了解原因,请将 filter
替换为 map
:
[["", ""], ["", ""]].map(String) // [",", ","]
这些是真实的字符串,带有逗号。
通过范围第一列的非空性来过滤文本的正确方法是
range.getValues().filter(function(row) {return row[0]})
(关于 0 值是假值的常见警告适用,但看起来您不会在那里遇到数字 0,该列是文本。字符串“0”是真值。)
(此外,“null”在这里不是正确的术语,Apps 脚本为空单元格返回空字符串“”,这与 null
不同)
关于javascript - 如何将数组从两列过滤为非空对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241122/