首页 > 解决方案 > 有没有办法在谷歌应用脚​​本中过滤字符串数组?

问题描述

我正在尝试过滤由 NaN 和一个字符串元素组成的数组“employee_name”,以排除字符串以外的任何元素。上下文是我有一个包含员工出生日期的电子表格,并且我正在发送电子邮件通知,以防从今天起两天后有生日。我的变量如下所示:

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Employees');
  var range = ss.getRange(2, 1, ss.getLastRow()-1, 1); // column containing the birth dates
  var birthdates = range.getValues(); // get the `values` of birth date column
  var today = new Date ();
  var today = new Date(today.getTime());
  var secondDate = new Date(today.getTime() + 48 * 60 * 60 * 1000);
  var employee_name = new Array(birthdates.length-1);

和循环:

for (var i=0;i<=birthdates.length-1;i=i+1){

    var fDate = new Date(birthdates[i][0]);
if (fDate.getDate() == secondDate.getDate() && 
        fDate.getMonth() == secondDate.getMonth()){

        //define variables for outgoing email

        for (var j=0; j<=birthdates.length-1;j=j+1){
          employee_name[j] = [NaN];
        } 
        employee_name[i] = ss.getRange(i+2,6);
        employee_name[i] = employee_name[i].getValues();
}
}

之后有问题的数组看起来像这样

Logger.log(employee_name);

[[[Mia-Angelica]], [NaN], [NaN], [NaN], ..., [NaN]] 我已经尝试过过滤器(布尔值),但这不起作用:

employee_name_filtered = employee_name.filter(Boolean);
Logger.log(employee_name_filtered);

返回 [[[Mia-Angelica]]、[NaN]、[NaN]、[NaN]、...、[NaN]]。我也尝试用数值(而不是 NaN)填充非字符串数组条目,然后应用

employee_name_filtered = employee_name.filter(isFinite);
Logger.log(employee_name_filtered);

返回 [[1.0], [2.0], [3.0], ..., [72.0]],所以这个过滤器方法是有效的,但是我需要它的“逆”,因为我想保留字符串。

我需要数组中的数组将值存储在满足条件的计数器变量的位置(类似于如何在 Google 应用程序脚本中使用 For 循环将数据存储在数组中 - 按值传递数组)。

这是我第一次在 SO 上发布问题,所以如果我忽略了任何关于发布的“规则”,请告诉我,我会提供更多信息。任何帮助将不胜感激!

编辑:

最后我想收到的只是[[Mia-Angelica]]。

标签: arraysgoogle-apps-scriptfilterboolean

解决方案


您正在使用二维数组的数组 - 这意味着它是一个数组数组,因此filter您使用的方法不能以相同的方式应用。

为此,我建议您尝试以下代码段。

function cleanArray() {
    var initialArray = [
        ['Mia-Angelica'],
        ['Space'],
        ['2'],
        [NaN],
        [NaN],
        [NaN],
        [NaN]
    ];
    var finalArray = [];
    for (let i = 0; i < initialArray.length; i++) {
        var midArray = initialArray[i].filter(item => (Number.isFinite(item) && item.id !== 0) || !Object.is(item, NaN));
        finalArray.push(midArray);
    }
    console.log(finalArray.filter(item => item != ''));
}

笔记

请记住,这getValues将返回一个Object[][]二维值数组。

参考


推荐阅读