Apps Script : Délégation par WebApp

Avec Apps Script, il est possible de créer de nombreux scripts pour enrichir les outils de Google Workspace, notamment avec des fonctionnalités qui vont réaliser des actions à la place de l’utilisateur, comme copier un […]

personnes ont consulté cet article

4 minutes

Rédigé par Quentin Garcia - il y a 2 jours et modifié le 17/01/2025 à 15:06

Ce que vous allez découvrir

  • Un problème d’accès
  • La délégation par application web
  • Aller plus loin

Apps Script : Délégation par WebApp

Avec Apps Script, il est possible de créer de nombreux scripts pour enrichir les outils de Google Workspace, notamment avec des fonctionnalités qui vont réaliser des actions à la place de l’utilisateur, comme copier un modèle, faire du traitement de données, etc. Toutefois, un problème épineux peut parfois se poser : comment faire pour que le script ne soit pas exécuté par l’utilisateur, mais par un autre compte ?

Un problème d’accès

Le souci peut paraître peu clair de prime abord. Prenons un cas concret !

Imaginons que, pour une raison quelconque, je possède un fichier Google Sheets qui n’est accessible que par moi-même, car il contient des données sensibles ou que je ne souhaite pas qu’il soit modifié. Toutefois, je souhaite que mes collaborateurs puissent, dans un fichier commun à toute l’équipe, faire une copie partielle d’une des feuilles afin de pouvoir travailler dessus s’ils le souhaitent. En d’autres termes, un accès partiel, limité et à un instant précis.

Partons d’un fichier contenant une liste de clients avec le montant facturé :

Un fichier Sheets contenant un tableau avec les colonnes Client, Adresse, Contact et Montant facturé

J’aimerais, dans un autre classeur, créer un script qui fait une copie de cette feuille spécifique, mais sans inclure le montant facturé. Je crée donc un script simple :

function onOpen() {

  // On crée un menu personnalisé à l’ouverture du fichier

  SpreadsheetApp.getUi()

    .createMenu(« Menu personnalisé »)

    .addItem(« Récupérer les clients », « getCustomersList »)

    .addToUi();

}

function getCustomersList(){

  // Constantes : identifiant de notre fichier source, nom de la feuille à copier

  const sourceId = « ID_À_REMPLACER »;

  const customersSheetName = « Clients »;

  // On récupère nos données dans la feuille Clients du fichier source, en retirant la dernière colonne (contenant nos données)

  const customersSheet = SpreadsheetApp.openById(sourceId).getSheetByName(customersSheetName);

  const customersData = customersSheet.getRange(1, 1, customersSheet.getLastRow(), customersSheet.getLastColumn() – 1).getValues();

  // On récupère la date et l’heure pour créer une nouvelle feuille avec un timestamp dans le nom

  const timestamp = new Date().toLocaleTimeString();

  const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(`${customersSheetName} – ${timestamp}`);

  // On insère nos données dans la nouvelle feuille

  newSheet.getRange(1, 1, customersData.length, customersData[0].length).setValues(customersData);

}

Et si je l’exécute avec mon compte, il n’y a bien entendu aucun souci :

Toutefois, lorsque je demande à un collègue qui n’a pas accès au fichier original d’exécuter le script, plus rien ne fonctionne !

La raison est simple : lorsqu’un utilisateur exécute un script, c’est avec son compte que sont effectuées toutes les actions. Or, comme l’utilisateur en question n’a pas accès à mon fichier original, lorsqu’il essaye d’y accéder par le script, cela échoue !

Vient alors la question fatidique : comment faire pour que le script, lorsqu’il s’exécute, passe plutôt par mon compte ?

La délégation par application web

Par défaut, tout script exécuté par Apps Script utilisera le compte qui l’exécute, sauf dans un cas particulier : les applications web ! Lorsque vous déployez une application web, vous avez la possibilité de choisir le mode d’accès, et notamment de choisir si le script s’exécute en votre nom ou avec le compte de l’utilisateur. Vous pouvez même choisir qui a accès à l’application :

Mais vous allez me dire : « D’accord Quentin, mais je ne vais pas créer une application web complète pour faire ma copie de script ? ». Et non, je ne vous dis pas de créer un site complet avec interface, mais de créer une application web simple qui n’acceptera que des requêtes et ne renverra que quelques lignes de code contenant la donnée demandée. Pour cela, nous allons utiliser spécifiquement la fonction doPost, même si doGet fonctionnerait tout aussi bien dans l’idée.

Le but est de créer une sorte d’API : avec doPost, nous récupérons la requête de l’utilisateur, que nous attendons ici sous la forme d’un JSON. Comme nous construisons nous-mêmes l’API, nous pouvons déterminer quelle forme doit avoir le JSON. Afin de fonctionner correctement, nous allons présumer que le fichier dans lequel la copie doit être faite est partagé à notre compte (pour ne pas avoir le problème inverse : ne pas arriver à créer la copie dans le fichier cible ). Si ce n’était pas le cas, il suffirait que notre script initial partage temporairement l’accès, mais n’allons pas complexifier tout ceci pour rien.

Voyons donc comment écrire une mini-API dans Apps Script ! Créez d’abord un script stand-alone, qui servira de base pour notre API. Voilà le code que j’ai construit pour répondre à notre besoin :

/**

 * Point d’entrée pour notre API. L’objet e contient de nombreuses informations sur la requête, comme explicité dans la documentation :

 * https://developers.google.com/apps-script/guides/web

 *

 */

function doPost(e) {

  // On récupère notre payload (les paramètres de la demande), qui contient la demande faite par l’utilisateur

  // Le payload doit contenir au moins une propriété : action. Celle-ci va déterminer ce que fait notre API.

  const payload = JSON.parse(e.postData.contents);

  // On prépare une variable de retour pour notre réponse à l’utilisateur

  let output;

  // On choisit d’agir en fonction de l’action donnée

  switch (payload.action) {

    case « getCustomersList »:

      // On effectue l’action et on récupère le résultat pour le renvoyer à l’utilisateur

      output = ContentService.createTextOutput(JSON.stringify(getCustomersList(payload)));

      output.setMimeType(ContentService.MimeType.JSON);

      return output;

    default:

      // L’action n’est pas reconnue, on renvoie une erreur

      output = ContentService.createTextOutput(JSON.stringify({ error: true, errorMsg: « Unrecognized action. », success: false }));

      output.setMimeType(ContentService.MimeType.JSON);

      return output;

  }

}

/**

 * Avec un objet payload donné, qui possède au moins la propriété spreadsheetId, cette fonction ouvre le classeur cible et y insère les données client.

 */

function getCustomersList(payload) {

  try {

    // Constantes : identifiant de notre fichier source, nom de la feuille à copier

    const sourceId = « ID_À_REMPLACER »;

    const customersSheetName = « Clients »;

    // On récupère nos données dans la feuille Clients du fichier source, en retirant la dernière colonne (contenant nos données)

    const customersSheet = SpreadsheetApp.openById(sourceId).getSheetByName(customersSheetName);

    const customersData = customersSheet.getRange(1, 1, customersSheet.getLastRow(), customersSheet.getLastColumn() – 1).getValues();

    // On récupère la date et l’heure pour créer une nouvelle feuille avec un timestamp dans le nom

    const timestamp = new Date().toLocaleTimeString();

    const newSheet = SpreadsheetApp.openById(payload.spreadsheetId).insertSheet(`${customersSheetName} – ${timestamp}`);

    // On insère nos données dans la nouvelle feuille

    newSheet.getRange(1, 1, customersData.length, customersData[0].length).setValues(customersData);

    return {

      error: false,

      errorMsg: «  »,

      success: true

    }

  } catch (err) {

    return {

      error: true,

      errorMsg: `${err}`,

      success: false

    }

  }

}

Comme on peut le voir, le code écrit plus haut a été transféré dans l’API, qui se chargera de faire le travail. Le seul changement consiste à ouvrir désormais notre classeur cible, notre script n’y étant pas lié.

Une fois ce script mis en place, il ne reste qu’à le déployer. Rendez-vous en haut à droite et cliquez sur le bouton Déployer. Cliquez sur la roue crantée à côté de Sélectionnez le type, et choisissez bien Application web. Dans la configuration, laissez Exécuter en tant que Moi, mais pour l’accès, changez en ce qui est le plus approprié (usuellement, Tous les utilisateurs du domaine pour un script interne à votre entreprise). Si vous le souhaitez, donnez un nom à votre déploiement, puis cliquez sur Déployer. Une fois le déploiement effectué, copiez le lien de déploiement, nous allons en avoir besoin immédiatement.

Du côté de notre script initial, on change le code ainsi :

function onOpen() {

  // On crée un menu personnalisé à l’ouverture du fichier

  SpreadsheetApp.getUi()

    .createMenu(« Menu personnalisé »)

    .addItem(« Récupérer les clients », « getCustomersList »)

    .addToUi();

}

function getCustomersList() {

  // Cette ligne, bien que commentée, force le scope https://www.googleapis.com/auth/drive à être ajouté à notre script, nécessaire pour avoir les autorisations pour accéder à la web app.

  // DriveApp.getFiles()

  // On fait notre requête, en utilisant les paramètres avancés pour cela.

  const reponse = UrlFetchApp.fetch(« LIEN_DU_DÉPLOIEMENT », {

    headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` },

    method: « post »,

    contentType: « application/json »,

    payload: JSON.stringify({

      action: « getCustomersList »,

      spreadsheetId: SpreadsheetApp.getActiveSpreadsheet().getId()

    })

  });

  console.log(reponse.getContentText());

}

Pensez à changer LIEN_DU_DÉPLOIEMENT avec le vôtre que vous venez de récupérer. Et si vous déclenchez le script… Tout fonctionne pour tout le monde !

Aller plus loin

Vous noterez qu’à partir du code de notre script stand-alone, vous pouvez aisément rajouter d’autres actions, d’autres fonctions… En bref, vous pouvez créer une réelle API interne pour répondre à vos besoins ! Bien entendu, cette API resterait limitée par les quotas Apps Script, mais tant que vous en gardez conscience, cela peut vite transformer vos scripts en ouvrant encore plus de possibilités, notamment en gardant la confidentialité des données.

Si tout cela vous a donné des idées mais que vous ne savez pas comment les exécuter, contactez-nous pour tout besoin de développement, qu’il soit lié à Google Apps Script, Google Cloud ou toute autre technologie web ! Nous serons toujours ravis de vous aider et de trouver avec vous le meilleur moyen de vous accompagner.

Besoin d'un peu plus d'aide sur Apps Script ?

Des formateurs sont disponibles toute l'année pour vous accompagner et optimiser votre utilisation de Apps Script, que ce soit pour votre entreprise ou pour vos besoins personnels !

Découvrir nos formations Apps Script

Articles similaires

  • Articles connexes
  • Plus de l'auteur

Rédacteur

Photo de profil de l'auteur
Quentin Garcia

Quentin est avant tout un développeur, spécialisé dans les technologies du web, mais il lui arrive parfois d’écrire des articles sur les aspects les plus techniques de Google Workspace, généralement sur des sujets liés à ses activités. Il adore aussi le métahumour et parler de lui à la troisième personne.

S’abonner
Notification pour
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires