Cours Apps Script : les menus

Vous avez la possibilité de créer des menus personnalisés pour votre document Google Sheets.

Puis, lorsque vous cliquerez sur l'une des options du menu, la fonction correspondante sera alors exécutée.


Création d'un menu

La fonction qui va créer et afficher le menu n'a besoin d'être exécutée qu'une seule fois à l'ouverture du document, vous pouvez donc la placer dans la fonction onOpen pour utiliser ce déclencheur.

Dans cet exemple l'objectif sera de créer un menu qui va regrouper des fonctions de texte (ici pour convertir des cellules en majuscules ou en minuscules) :

function onOpen() {

  SpreadsheetApp.getUi()
    .createMenu('Texte')
    .addItem('Convertir en majuscules', 'majuscules')
    .addItem('Convertir en minuscules', 'minuscules')
    .addToUi();
}

Dans createMenu, entrez le nom du menu à afficher :

.createMenu('Texte')

Et ajoutez un ou plusieurs choix dans le menu avec addItem (la première valeur est le nom du choix et la seconde le nom de la fonction à exécuter) :

.addItem('Convertir en majuscules', 'majuscules')

Exécutez ensuite la fonction onOpen pour afficher le menu :

google sheets menu personnalise png menus

Vous pouvez voir que le menu a bien été ajouté.

Il reste encore à ajouter les fonctions majuscules et minuscules qui auront pour but de convertir la cellule sélectionnée en majuscules ou en minuscules :

function majuscules() {

  const celluleActive = SpreadsheetApp.getActiveSheet().getActiveCell();

  celluleActive.setValue(celluleActive.getValue().toUpperCase());
}

function minuscules() {

  const celluleActive = SpreadsheetApp.getActiveSheet().getActiveCell();
  
  celluleActive.setValue(celluleActive.getValue().toLowerCase());
}

Après avoir enregistré les modifications, vous pourrez utiliser le menu ajouté pour convertir la valeur de la cellule active en majuscules ou en minuscules.

Pour aller un peu plus loin et rendre ces fonctions plus pratiques, il est possible d'appliquer ces modifications à une plage entière en récupérant les valeurs de la plage active et en utilisant la méthode map sur chaque ligne puis sur chaque valeur de la ligne :

function majuscules() {

  const plageActive = SpreadsheetApp.getActiveSheet().getActiveRange();

  plageActive.setValues(plageActive.getValues().map(ligne => ligne.map(valeur => valeur.toUpperCase())));
}

function minuscules() {

  const plageActive = SpreadsheetApp.getActiveSheet().getActiveRange();

  plageActive.setValues(plageActive.getValues().map(ligne => ligne.map(valeur => valeur.toLowerCase())));
}

Si vous n'êtes pas à l'aise avec les méthodes de tableau, vous pouvez également le faire avec des boucles for. En voici un exemple équivalent pour la fonction majuscules :

function majuscules() {

  const plageActive = SpreadsheetApp.getActiveSheet().getActiveRange();
  const valeursPlageActive = plageActive.getValues();
  const nbLignes = valeursPlageActive.length;
  const nbColonnes = valeursPlageActive[0].length;

  for (let ligne = 0; ligne < nbLignes; ligne++) {
    for (let colonne = 0; colonne < nbColonnes; colonne++) {
      valeursPlageActive[ligne][colonne] = valeursPlageActive[ligne][colonne].toUpperCase();
    }
  }

  plageActive.setValues(valeursPlageActive);
}

Ajout d'un sous-menu

Vous pouvez également ajouter des sous-menus en entrant addSubMenu puis le menu en argument.

En voici un exemple :

function onOpen() {

  const ui = SpreadsheetApp.getUi();
  
  ui.createMenu('Texte')
    .addItem('Autre', 'autre')
    .addSubMenu(ui.createMenu('Majuscules / minuscules')
      .addItem('Convertir en majuscules', 'majuscules')
      .addItem('Convertir en minuscules', 'minuscules'))
    .addItem('Divers', 'divers')
    .addToUi();
}

Ce qui nous donne ici :

google sheets sous menu personnalise png menus

Ajout d'un séparateur

Vous pouvez aussi ajouter des séparateurs pour séparer par exemple des groupes de fonctions avec addSeparator :

function onOpen() {

  SpreadsheetApp.getUi()
    .createMenu('Texte')
    .addItem('Convertir en majuscules', 'majuscules')
    .addItem('Convertir en minuscules', 'minuscules')
    .addSeparator()
    .addItem('Diviser en tableau', 'diviser')
    .addItem('Joindre un tableau', 'joindre')
    .addToUi();
}

Le menu :

google sheets menu personnalise apps script png menus

Ajouter une icône

Si vous le souhaitez, vous pouvez ajouter un caractère spécial tel qu'un emoji directement dans le texte :

function onOpen() {

  SpreadsheetApp.getUi()
    .createMenu('Texte')
    .addItem('🔺 Convertir en majuscules', 'majuscules')
    .addItem('🔻 Convertir en minuscules', 'minuscules')
    .addToUi();
}

Le menu :

google sheets menu personnalise icone png menus

L'affichage de ce type de caractères peut varier selon le navigateur utilisé.