,

Envoyer un email automatiquement pour les tâches à priorité haute

Dans la gestion des tâches ou des projets, il est courant de devoir réagir rapidement aux éléments les plus urgents. Et si votre feuille Google Sheets pouvait vous alerter automatiquement dès qu’une tâche est marquée comme priorité haute ? Grâce à Google Apps Script, c’est non seulement possible, mais aussi facile à mettre en place.

Dans cet article, je vous propose un script personnalisable qui surveille les modifications dans une feuille et envoie une notification par email lorsqu’une tâche passe en priorité “Haute”.

Objectif

À chaque fois qu’une ligne de votre feuille de calcul est modifiée et que la colonne “Priorité” est mise à jour avec la valeur “Haute”, un email est envoyé automatiquement à l’adresse spécifiée dans la colonne dédiée. Parfait pour ne pas manquer une urgence !

Fonctionnalités principales

  • Surveille uniquement la colonne “Priorité”
  • Ignorance de la casse pour plus de souplesse (haute, HAUTE, Haute, etc.)
  • Envoie un email structuré au format HTML
  • Configuration centralisée via un objet CONFIG
  • Compatible avec un déclencheur onEdit installable

Structure du script

Le script est découpé de manière claire et maintenable :

1. Configuration centralisée

Toutes les variables de personnalisation (nom de la feuille, numéro de colonne, valeur cible, etc.) sont regroupées dans un objet CONFIG :

const CONFIG = {
  nomFeuille: 'Tâches',
  colonnePriorite: 6,
  valeurPriorite: 'Haute',
  colonneEmail: 7,
};

2. Fonction principale : envoyerNotificationPrioriteHaute

Cette fonction est appelée lors de chaque édition dans le tableur. Elle vérifie plusieurs conditions avant d’envoyer un email :

  • La bonne feuille est modifiée
  • La bonne colonne (Priorité)
  • La bonne valeur (“Haute”)
  • L’adresse email est présente

Si tous les voyants sont au vert, un email est envoyé.

3. Email HTML structuré

La fonction creerCorpsEmailHtml génère dynamiquement un tableau HTML à partir des en-têtes et des données de la ligne concernée. Cela donne un rendu propre et professionnel dans la boîte mail du destinataire.

Exemple d’utilisation

Imaginons une feuille nommée “Tâches” avec les colonnes suivantes :

TâcheResponsableÉchéanceStatutCommentairesPrioritéEmail
Relancer client XAlice20/06/2025En coursImportantHautealice@exemple.com

Lorsqu’on change la cellule “Priorité” en “Haute”, un email est automatiquement déclenché, avec tous les détails de la ligne.

Permissions & déclencheur

Le script nécessite un déclencheur installable onEdit, car l’envoi d’email n’est pas autorisé avec les déclencheurs simples. Pour cela :

  1. Ouvrez l’éditeur Apps Script.
  2. Allez dans Déclencheurs > Ajouter un déclencheur.
  3. Ciblez la fonction envoyerNotificationPrioriteHaute.
  4. Type d’événement : À la modification.
  5. Source : Feuille de calcul.

Bonus : Gestion des erreurs

En cas de problème (valeur manquante, email absent, etc.), le script ne plante pas : il journalise les erreurs dans les Logs via Logger.log, ce qui est très utile pour le débogage.

Pourquoi c’est utile ?

  • Gain de temps : vous n’avez plus besoin de vérifier manuellement votre feuille.
  • Réactivité : les responsables sont immédiatement alertés.
  • Adaptabilité : le script est facilement réutilisable dans d’autres contextes (suivi d’incidents, support client, etc.).

Conclusion

Ce script est un excellent point de départ pour automatiser la gestion de vos données critiques dans Google Sheets. N’hésitez pas à l’adapter pour d’autres types de priorités, d’autres actions (notifications Slack, ajout dans une base de données, etc.), ou même intégrer des workflows plus complexes via Apps Script.

💡 Besoin d’aide pour aller plus loin ? Je suis à votre écoute pour vous accompagner dans la personnalisation de vos automatisations Google Workspace.

/**
 * @OnlyCurrentDoc
 * Développeur: Fabrice FAUCHEUX
 * Description: Ce script envoie une notification par email lorsqu'une ligne est marquée avec une priorité haute.
 */

// --- CONFIGURATION ---
// Regroupez ici toutes les variables de configuration pour une maintenance facile.
const CONFIG = {
  nomFeuille: 'Tâches', // Remplacez par le nom de votre feuille. Laissez vide ('') pour cibler n'importe quelle feuille.
  colonnePriorite: 6,      // Numéro de la colonne pour la priorité (F = 6)
  valeurPriorite: 'Haute',   // La valeur qui déclenche l'email (insensible à la casse)
  colonneEmail: 7,        // Numéro de la colonne contenant les adresses email (G = 7)
};

/**
 * @name envoyerNotificationPrioriteHaute
 * @description Déclencheur installable qui s'exécute lors de l'édition de la feuille.
 * Envoie un email lorsque la colonne Priorité est modifiée à la valeur définie dans CONFIG.
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e - L'objet d'événement fourni par le déclencheur onEdit.
 */
function envoyerNotificationPrioriteHaute(e) {
  try {
    // --- Initialisation et vérifications initiales ---
    const { range, value, source } = e;
    const feuille = range.getSheet();
    const ligneModifiee = range.getRow();

    // Vérifie si l'édition a eu lieu dans la bonne feuille (si un nom est spécifié)
    // et sur la bonne colonne.
    if ((CONFIG.nomFeuille && feuille.getName() !== CONFIG.nomFeuille) || range.getColumn() !== CONFIG.colonnePriorite) {
      return;
    }

    // Vérifie si la cellule a été mise à jour avec la bonne valeur (ignorant la casse).
    // Le 'value' de l'objet événement est plus efficace que range.getValue().
    if (!value || value.toLowerCase() !== CONFIG.valeurPriorite.toLowerCase()) {
      return;
    }

    // --- Récupération des données ---
    // Récupère toutes les données de la ligne modifiée et les en-têtes en une seule fois pour optimiser.
    const derniereColonne = feuille.getLastColumn();
    const enTetes = feuille.getRange(1, 1, 1, derniereColonne).getValues()[0];
    const donneesLigne = feuille.getRange(ligneModifiee, 1, 1, derniereColonne).getValues()[0];
    
    // Récupère l'adresse email depuis les données déjà chargées.
    // L'index est le numéro de colonne - 1.
    const emailsDestinataires = donneesLigne[CONFIG.colonneEmail - 1];

    if (!emailsDestinataires || emailsDestinataires.trim() === '') {
      Logger.log(`Aucune adresse email trouvée à la ligne ${ligneModifiee}. Le script est interrompu.`);
      return;
    }

    // --- Préparation et envoi de l'email ---
    const sujet = `Alerte Priorité Haute : Tâche modifiée`;
    const corpsHtml = creerCorpsEmailHtml(enTetes, donneesLigne);
    
    // Envoie l'email à toutes les adresses en une seule fois.
    MailApp.sendEmail({
      to: emailsDestinataires,
      subject: sujet,
      htmlBody: corpsHtml,
    });
    
    Logger.log(`Email de notification envoyé avec succès à : ${emailsDestinataires}`);

  } catch (erreur) {
    // --- Gestion des erreurs ---
    Logger.log(`Une erreur est survenue dans envoyerNotificationPrioriteHaute: ${erreur.message}\nStack: ${erreur.stack}`);
  }
}

/**
 * @name creerCorpsEmailHtml
 * @description Crée le corps de l'email au format HTML pour une meilleure lisibilité.
 * @param {Array<string>} enTetes - Le tableau des en-têtes de colonnes.
 * @param {Array<any>} donneesLigne - Le tableau des valeurs de la ligne modifiée.
 * @returns {string} Le corps de l'email au format HTML.
 */
function creerCorpsEmailHtml(enTetes, donneesLigne) {
  // Crée une table HTML pour présenter les données de manière structurée.
  let tableRows = '';
  enTetes.forEach((enTete, index) => {
    // Affiche la date dans un format lisible si c'est un objet Date
    let valeur = (donneesLigne[index] instanceof Date) 
                 ? Utilities.formatDate(donneesLigne[index], Session.getScriptTimeZone(), 'dd/MM/yyyy HH:mm')
                 : donneesLigne[index];
    if(valeur) { // N'ajoute la ligne au tableau que si la cellule n'est pas vide
       tableRows += `<tr>
                      <td style="background-color: #f2f2f2; padding: 8px; font-weight: bold;">${enTete}</td>
                      <td style="padding: 8px;">${valeur}</td>
                    </tr>`;
    }
  });

  return `
    <html>
      <body>
        <p>Bonjour,</p>
        <p>Une tâche a été marquée avec une priorité <strong>haute</strong>. Voici les détails :</p>
        <table style="border-collapse: collapse; width: 100%; border: 1px solid #ddd;">
          ${tableRows}
        </table>
        <p>Cet email a été envoyé automatiquement depuis Google Sheets.</p>
      </body>
    </html>
  `;
}