Cours Apps Script : tableaux avancés (suite)

Nous allons maintenant aborder des méthodes associées aux tableaux qui sont particulièrement pratiques et efficaces (bien que parfois difficiles à appréhender au début), telles que sort, filter, map, forEach, etc.

Les fonctions fléchées que nous avons vu précédemment seront ici très utiles.


ForEach

Commençons avec un exemple de boucle for qui va afficher un message dans la console pour chaque valeur du tableau :

function exemple() {

  const tableau = [10, 20, 30, 40, 50];

  for (let i = 0; i < tableau.length; i++) {
    console.log('Valeur = ' + tableau[i]);
  }
}

Il est possible de simplifier ce code en utilisant la méthode forEach qui va parcourir chaque valeur du tableau et exécuter la ou les instructions de la fonction fléchée :

function exemple() {

  const tableau = [10, 20, 30, 40, 50];

  tableau.forEach(valeur => console.log('Valeur = ' + valeur));
}

Pour vous aider à mieux visualiser la fonction fléchée (par rapport à ce qui avait été vu précédemment), voici une autre version avec la fonction affectée à une constante :

function exemple() {

  const tableau = [10, 20, 30, 40, 50];

  const afficherMessage = valeur => console.log('Valeur = ' + valeur);

  tableau.forEach(afficherMessage);
}

Mais à moins d'avoir besoin d'utiliser plusieurs fois la même fonction, il n'est pas utile de l'affecter à une constante.

Si vous avez besoin de connaître l'indice, ajoutez un second argument (et des {} lorsqu'il y a plusieurs instructions) :

function exemple() {

  const tableau = [10, 20, 30, 40, 50];

  tableau.forEach((valeur, i) => {
    console.log('Indice = ' + i);
    console.log('Valeur = ' + valeur);
  });
}

Filter

La méthode filter permet de filtrer un tableau en fonction d'une ou de plusieurs conditions et retourne un nouveau tableau avec les données filtrées :

function exemple() {

  let tableau = [10, 20, 30, 40, 50];

  tableau = tableau.filter(valeur => valeur <= 30);

  console.log(tableau); // Affiche : [ 10, 20, 30 ]
}

Voici un autre exemple avec un tableau qui correspond aux valeurs d'une plage de cellules récupérée avec getValues (soit un tableau qui contient un tableau de valeurs pour chaque ligne de la plage).

Ici, les lignes de la plage sont conservées uniquement si la première valeur de la ligne (donc à l'indice 0) est plus grande que 5 :

function exemple() {

  const plageValeurs = [
    [1, 1234],
    [7, 7654],
    [4, 4567],
    [8, 8765],
    [6, 6543]
  ];

  const plageFiltree = plageValeurs.filter(ligne => ligne[0] > 5);

  console.log(plageFiltree); // Affiche : [ [ 7, 7654 ], [ 8, 8765 ], [ 6, 6543 ] ]
}

Sort

La méthode sort permet de trier un tableau et retourne un nouveau tableau avec les données triées.

Si vous n'entrez pas d'argument, sort effectuera un tri alphabétique croissant :

function exemple() {

  let tableau = [2, 50, 5, 30, 4];

  tableau = tableau.sort();

  console.log(tableau); // Affiche : [ 2, 30, 4, 5, 50 ]
}

Pour effectuer un tri numérique croissant, ajoutez la fonction fléchée suivante :

function exemple() {

  let tableau = [2, 50, 5, 30, 4];

  tableau = tableau.sort((a, b) => a - b);

  console.log(tableau); // Affiche : [ 2, 4, 5, 30, 50 ]
}

Ou pour un tri numérique décroissant :

function exemple() {

  let tableau = [2, 50, 5, 30, 4];

  tableau = tableau.sort((a, b) => b - a);

  console.log(tableau); // Affiche : [ 50, 30, 5, 4, 2 ]
}

Un autre exemple avec un tri numérique croissant d'une plage de valeurs en fonction de la seconde valeur de chaque ligne :

function exemple() {

  let tableau = [
    [12, 421],
    [7, 987],
    [4, 1234],
    [18, 95],
    [6, 371]
  ];

  tableau = tableau.sort((a, b) => a[1] - b[1]);

  console.log(tableau); // Affiche : [ [ 18, 95 ], [ 6, 371 ], [ 12, 421 ], [ 7, 987 ], [ 4, 1234 ] ]
}

Map

La méthode map applique une fonction à chaque valeur d'un tableau et retourne un nouveau tableau avec ces valeurs (l'équivalent de la fonction Google Sheets MAP).

Voici un exemple qui convertit des valeurs au format texte en nombres :

function exemple() {

  let tableau = ['10', '20', '30', '40', '50'];

  tableau = tableau.map(valeur => Number(valeur));

  console.log(tableau); // Affiche : [ 10, 20, 30, 40, 50 ]
}

Reduce

La méthode reduce réduit un tableau à un résultat cumulé en appliquant une fonction (l'équivalent de la fonction Google Sheets REDUCE).

Voici un exemple qui effectue la somme de tous les nombres du tableau :

function exemple() {

  const tableau = [10, 20, 30, 40, 50];

  const somme = tableau.reduce((total, valeur) => total + valeur, 0); // 0 = valeur initiale de "total"

  console.log(somme); // Affiche : 150
}

Every

La méthode every vérifie si toutes les valeurs d'un tableau répondent à une condition et renvoie ensuite true ou false.

Voici un exemple qui vérifie si toutes les valeurs du tableau sont des nombres (y compris ceux au format texte) :

function exemple() {

  const tableau = [10, '20', 30, '40', 50];

  if (tableau.every(valeur => !isNaN(valeur))) {
    console.log('OUI'); // Affiché
  }
}

Some

La méthode some vérifie si au moins une valeur d'un tableau répond à une condition et renvoie ensuite true ou false.

Voici un exemple qui vérifie s'il y a une valeur avec 8 caractères dans le tableau :

function exemple() {

  const tableau = ['Sheets', '-', 'Pratique', '.', 'com'];

  if (tableau.some(valeur => valeur.length === 8)) {
    console.log('OUI'); // Affiché
  }
}
Ces différentes méthodes sont très pratiques et puissantes dès lors qu'on sait les utiliser ... Mais sachez que si vous n'êtes pas à l'aise avec ces méthodes, vous pouvez très bien utiliser une boucle for pour parcourir un tableau et effectuer les différentes actions souhaitées.

Exercice

Dans une nouvelle feuille, entrez dans la plage A1:E20 des valeurs quelconques dans quelques cellules choisies au hasard.

Ecrivez ensuite une fonction qui va récupérer les valeurs de cette plage (dans un unique tableau, en utilisant la méthode flat), filtrez les données pour retirer les valeurs vides, triez ces données par ordre alphabétique et affichez le résultat dans la console.

function donneesNonVides() {

  // A compléter ...

}

Complétez la fonction "donneesNonVides" avant de passer à la solution un peu plus bas ...

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Une solution commentée :

function donneesNonVides() {

  // Plage de cellules
  const plage = SpreadsheetApp.getActiveSheet().getRange('A1:E20');

  // Tableau des valeurs
  let tabValeurs = plage.getValues();

  // Tableau "aplati"
  tabValeurs = tabValeurs.flat();

  // Filtrer les valeurs non vides
  tabValeurs = tabValeurs.filter(valeur => valeur !== '');

  // Trier par ordre alphabétique
  tabValeurs = tabValeurs.sort();

  console.log(tabValeurs);
}

Puisque chaque méthode retourne ici un tableau, il est possible de les ajouter à la suite.

Bien que moins lisible, cette fonction aurait aussi pu s'écrire comme ceci :

function donneesNonVides() {
  console.log(SpreadsheetApp.getActiveSheet().getRange('A1:E20').getValues().flat().filter(v => v !== '').sort());
}