我正在使用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:在对象中找不到平面函数
这是我可以使用蛮力来做的事情,但是肯定有一种整齐的方法吗?
答案 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.reduce
和array.prototype.concat
:
答案 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;}