在Google Apps脚本中替代array.includes()?

时间:2018-08-09 11:07:07

标签: google-apps-script google-sheets

我正在使用range.getValues()在Google Apps脚本中加载数组。

var array = SpreadsheetApp.getActive().getActivesheet().getRange('E10:E30').getValues();
> array = [["val1"],["val2"],["val3"],["val4"]]

然后我想使用array.prototype.includes()遍历一个单独的列表,以查看其元素是否存在于数组中:

if(array.includes("val4")) {doSomething;}

像这样使用array.prototype.includes()不能工作有两个原因: 1),因为array中的每个元素本身都是数组,而 2),因为该方法在Google Apps脚本中不可用:

  

TypeError:找不到对象中包含的函数

然后想用array.prototype.flat()解决 1),但似乎isn't available in Google Apps Script either。我收到以下错误:

  

TypeError:在对象中找不到平面函数

这是我可以使用蛮力来做的事情,但是肯定有一种整齐的方法吗?

3 个答案:

答案 0 :(得分:7)

EDIT(2019-04-07):请注意。随着预期的App脚本V8升级(ECMAScript 2017),该语言将在不久的将来本地支持Array.prototype.includes和许多其他现代Javascript功能。


array.prototype.includes的最简单解决方案是在您的应用程序脚本项目中使用以下polyfill from MDN。只需创建一个脚本文件并粘贴以下代码-代码/ polyfill会将函数直接添加到Array原型对象:

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      // 1. Let O be ? ToObject(this value).
      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      function sameValueZero(x, y) {
        return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
      }

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        if (sameValueZero(o[k], searchElement)) {
          return true;
        }
        // c. Increase k by 1. 
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}

对于array.prototype.flat,MDN网站还提供了替代解决方案。其中一种利用了array.prototype.reducearray.prototype.concat

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat#Alternative

答案 1 :(得分:1)

按照评论中的建议与if(array.indexOf("val4") > -1) {doSomething};一起


我首先决定选择array.filter()

var test = array.filter(element => element == "val4");
if(test != null) {doSomething};

但是如下所述,箭头功能在Google Apps脚本中不起作用


但是在寻找答案时,我发现this解决了 1)

function flatten(arrayOfArrays){
  return [].concat.apply([], arrayOfArrays);
}

绝对比我想出的要好。

答案 2 :(得分:1)

.includes()替换为.indexOf()+1(如果不存在该元素,将产生0,否则将产生一个介于1和数组长度之间的整数)。它可以在Google脚本中使用。

if(array.indexOf("val4")+1) {doSomething;}