如何将数组从两列过滤到非空对?

时间:2018-01-13 15:04:31

标签: javascript google-apps-script google-sheets

使用下面的代码,我有一个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为空。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

确实,[["", ""], ["", ""]].filter(String)返回整个数组。要了解原因,请将filter替换为map

[["", ""], ["", ""]].map(String)  //  [",", ","]

这些是真正的字符串,带有逗号。

通过范围第一列的无效来过滤文本的正确方法是

range.getValues().filter(function(row) {return row[0]})

(关于0值为假的常见警告适用,但看起来你不会遇到数字0,列是文本。字符串" 0"是真的。)

(另外," null"这里不是正确的术语,Apps脚本返回空字符串""表示空单元格,与null不同)