J'utilise range.getValues()
pour charger un tableau dans le script Google Apps.
var array = SpreadsheetApp.getActive().getActivesheet().getRange('E10:E30').getValues();
> array = [["val1"],["val2"],["val3"],["val4"]]
Je veux ensuite parcourir une liste séparée pour voir si ses éléments existent dans le tableau, en utilisant array.prototype.includes ():
if(array.includes("val4")) {doSomething;}
Utiliser array.prototype.includes () comme ceci ne fonctionne pas pour deux raisons: 1) puisque chaque élément de array
est un tableau en lui-même et 2) car la méthode n'est pas disponible dans le script Google Apps:
TypeError: Impossible de trouver la fonction comprend dans l'objet
Ensuite, je voulais utiliser array.prototype.flat () pour résoudre 1), mais il semblerait que ne soit pas disponible dans le script Google Apps . Je reçois l'erreur suivante:
TypeError: Impossible de trouver la fonction à plat dans l'objet
C’est quelque chose que je pourrais faire en utilisant la force brute, mais il ya sûrement une façon élégante de le faire?
La solution la plus simple pour array.prototype.includes
consiste à utiliser le polyfill suivant de MDN dans votre projet de script d’applications. Créez simplement un fichier de script et collez le code suivant: le code/polyfill ajoutera la fonction directement à l'objet prototype 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;
}
});
}
Pour array.prototype.flat
, le site MDN fournit également des solutions alternatives. L'un d'eux utilise array.prototype.reduce
et array.prototype.concat
:
Est allé avec if(array.indexOf("val4") > -1) {doSomething};
comme suggéré dans les commentaires
J'ai d'abord décidé d'aller avec array.filter () :
var test = array.filter(element => element == "val4");
if(test != null) {doSomething};
Mais comme indiqué ci-dessous, les fonctions de flèche ne fonctionnent pas dans Google Apps Script.
Mais en cherchant une réponse, j'ai trouvé ceci à résoudre 1):
function flatten(arrayOfArrays){
return [].concat.apply([], arrayOfArrays);
}
Certainement mieux que ce que j'aurais pu trouver.
Remplacez .includes()
par .indexOf()+1
(il produira 0
si l'élément n'est pas présent, sinon il générera un entier compris entre 1 et la longueur de votre tableau). Cela fonctionne dans Google Script.
if(array.indexOf("val4")+1) {doSomething;}