Ich benutze range.getValues()
, um ein Array in Google Apps Script zu laden.
var array = SpreadsheetApp.getActive().getActivesheet().getRange('E10:E30').getValues();
> array = [["val1"],["val2"],["val3"],["val4"]]
Dann möchte ich eine separate Liste durchlaufen, um zu sehen, ob die Elemente im Array vorhanden sind, und zwar mit array.prototype.includes ():
if(array.includes("val4")) {doSomething;}
Die Verwendung von array.prototype.includes () funktioniert aus zwei Gründen nicht: 1), da jedes Element in array
ein Array in sich ist und 2), weil die Methode dies nicht ist verfügbar in Google Apps Script:
TypeError: Kann Funktionsbausteine im Objekt nicht finden
Wollte dann array.prototype.flat () verwenden, um 1) zu lösen, aber es scheint, dass es nicht in Google Apps Script verfügbar ist . Ich erhalte folgende Fehlermeldung:
TypeError: Funktion kann im Objekt nicht flach gefunden werden
Dies ist etwas, was ich mit brachialer Gewalt tun könnte, aber es gibt doch einen ordentlichen Weg, das zu tun?
Die einfachste Lösung für array.prototype.includes
ist die Verwendung des folgenden polyfill von MDN in Ihrem Apps-Skriptprojekt. Erstellen Sie einfach eine Skriptdatei und fügen Sie den folgenden Code ein. Der Code/Polyfill fügt die Funktion direkt dem Array-Prototypobjekt hinzu:
// 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;
}
});
}
Für array.prototype.flat
bietet die MDN-Site auch alternative Lösungen. Einer davon nutzt array.prototype.reduce
und array.prototype.concat
:
Ging mit if(array.indexOf("val4") > -1) {doSomething};
, wie in den Kommentaren vorgeschlagen
Ich entschied mich zuerst für array.filter () :
var test = array.filter(element => element == "val4");
if(test != null) {doSomething};
Wie unten angegeben, funktionieren die Pfeilfunktionen jedoch nicht in Google Apps Script
Auf der Suche nach einer Antwort fand ich this1) zu lösen:
function flatten(arrayOfArrays){
return [].concat.apply([], arrayOfArrays);
}
Auf jeden Fall besser als ich es mir hätte einfallen lassen können.
Ersetzen Sie .includes()
durch .indexOf()+1
(es wird 0
ausgegeben, wenn das Element nicht vorhanden ist. Andernfalls wird eine ganze Zahl zwischen 1 und der Länge Ihres Arrays ermittelt). Es funktioniert in Google Script.
if(array.indexOf("val4")+1) {doSomething;}