, ,

Boîte Gmail saturée ? Le tuto Google Apps Script pour créer votre filtre anti-publicité

Votre boîte de réception Gmail déborde de newsletters, d’offres promotionnelles et de notifications que vous n’avez pas le temps de lire ? Vous n’êtes pas seul. Ce « graymail » (ces emails auxquels vous vous êtes inscrits, mais qui ne sont pas urgents) est le principal ennemi de la productivité.

Les filtres classiques de Gmail, basés sur l’expéditeur, sont utiles, mais demandent une maintenance constante. Aujourd’hui, je vous propose une solution bien plus puissante : un script Google Apps Script qui analyse le contenu de vos emails pour trier automatiquement tout ce qui ressemble à de la publicité ou à une newsletter.

Prêt à reprendre le contrôle ? Allons-y !

L’objectif : Un trieur automatique « intelligent »

L’idée est simple : au lieu de créer 100 filtres (un pour « Promo-Du-Jour », un pour « Newsletter-Super », etc.), nous allons créer un seul script qui :

  1. Surveille votre boîte de réception pour les nouveaux emails non lus.
  2. Analyse le sujet et le corps de chaque email à la recherche de mots-clés suspects (ex: « promotion », « offre spéciale », « webinar », « désinscription »).
  3. Applique un libellé spécifique (par exemple _À Vérifier Publicité) à ces emails.
  4. Marque ces emails comme lus pour qu’ils ne « polluent » plus votre compteur de messages non lus.

Ainsi, votre boîte de réception principale reste propre, et vous pouvez consulter votre dossier _À Vérifier Publicité quand vous avez du temps.

Mettre en place votre filtre (5 minutes chrono)

Ne vous inquiétez pas si vous n’avez jamais codé. Il vous suffit de suivre ces étapes « copier-coller ».

Étape 1 : Ouvrir l’éditeur de scripts

Le moyen le plus simple est de vous rendre directement sur script.google.com.

  1. Allez sur script.google.com.
  2. Cliquez sur « Nouveau projet » en haut à gauche.
  3. Donnez un nom à votre projet (ex: « Filtre Publicité Gmail »).

Étape 2 : Coller le code

L’éditeur affiche une fonction vide (function myFunction() {}). Effacez tout ce contenu et collez le code ci-dessous à la place.

JavaScript

/**
 * @name Filtre Publicité Gmail
 * @description Analyse la boîte de réception Gmail, identifie les emails publicitaires 
 * (basés sur des mots-clés) et les classe automatiquement 
 * sous un libellé dédié. Optimisé pour la performance (RegExp) 
 * et la gestion des quotas (batching).
 * @version 1.5 - Mots-clés enrichis
 * @author Fabrice Faucheux (adapté pour le blog)
 * @license MIT
 * @NotOnlyCurrentDoc
 */

// --- CONFIGURATION ---

const NOM_LIBELLE_CIBLE = "_À Vérifier Publicité";
const MAX_CONVERSATIONS_A_TRAITER = 200;

/**
 * 2. Définir les mots-clés à rechercher.
 * Liste enrichie basée sur les journaux d'exécution.
 */
const MOTS_CLES = [
  "devis", "offre spéciale", "promotion", "réduction", "dernières nouvelles",
  "téléchargez maintenant", "gratuit", "inscrivez-vous", "opportunité",
  "économisez", "demandez", "en savoir plus",
  "webinar", // Pour 'TechBytes webinars'
  "webinars",
  "Téléchargez",
  "Version en ligne",
  "Si vous n’arrivez pas à visualiser cet email,",
  "Merci encore pour votre participation !",
  "Inscrivez-vous",
  "course",  // Pour 'Introducing my brand-new course'
  "bonus",   // Pour 'your free Apps Script bonus'
  "discover",// Pour 'Discover AI'
  "newsletter",
  "astuce",  // Pour 'Sheets Tip'
  "tip",
  "tips",
  "ends tonight" // Pour les offres urgentes
];

// --- FONCTION PRINCIPALE ---

const analyserEtDeplacerSpam = () => {
  Logger.log(`Démarrage de l'analyse des emails (max ${MAX_CONVERSATIONS_A_TRAITER} conversations)...`);

  try {
    const libelleCible = obtenirOuCreerLibelle(NOM_LIBELLE_CIBLE);
    if (!libelleCible) {
      Logger.log("Erreur critique : Impossible d'obtenir le libellé cible. Arrêt.");
      return;
    }

    const requete = 'is:inbox is:unread';
    const conversations = GmailApp.search(requete, 0, MAX_CONVERSATIONS_A_TRAITER);

    if (conversations.length === 0) {
      Logger.log("Aucune nouvelle conversation non lue trouvée.");
      return;
    }

    Logger.log(`${conversations.length} conversation(s) non lue(s) à analyser.`);

    const motsClesEchappes = MOTS_CLES.map(echapperRegExp);
    const regexMotsCles = new RegExp(motsClesEchappes.join('|'), 'i');

    let compteurTraites = 0;

    for (const conversation of conversations) {
      try {
        const messages = conversation.getMessages();
        let estIndesirable = false;

        for (const message of messages) {
          const sujet = message.getSubject();
          const corps = message.getPlainBody();
          const contenuComplet = sujet + " " + corps;

          // Test unique (rapide)
          if (regexMotsCles.test(contenuComplet)) {
            Logger.log(`[ACTION] Mot-clé(s) trouvé(s) dans l'email (Sujet: '${sujet}'). Déplacement.`);
            estIndesirable = true;
            break; 
          }
        }
        
        if (estIndesirable) {
          conversation.addLabel(libelleCible);
          conversation.markRead();
          compteurTraites++;
        }
        // Le log [IGNORÉ] a été supprimé pour ne pas polluer les journaux
        
      } catch (erreurConversation) {
        Logger.log(`Erreur lors du traitement d'une conversation (ID: ${conversation.getId()}): ${erreurConversation.message}. Passage à la suivante.`);
      }
    } 

    Logger.log(`Processus terminé. ${compteurTraites} conversation(s) déplacée(s) vers "${NOM_LIBELLE_CIBLE}".`);
    
    if (conversations.length === MAX_CONVERSATIONS_A_TRAITER) {
      Logger.log(`Limite de ${MAX_CONVERSATIONS_A_TRAITER} atteinte. D'autres emails seront traités au prochain tour.`);
    }

  } catch (erreurGlobale) {
    Logger.log(`Une erreur globale est survenue durant l'exécution: ${erreurGlobale.message}`);
  }
};


// --- FONCTIONS UTILITAIRES ---
// (Déclarées avec "function" pour être "hoistées" et disponibles partout)

function obtenirOuCreerLibelle(nomLibelle) {
  try {
    let libelle = GmailApp.getUserLabelByName(nomLibelle);
    
    if (!libelle) {
      Logger.log(`Libellé "${nomLibelle}" non trouvé. Tentative de création...`);
      libelle = GmailApp.createLabel(nomLibelle);
    }
    return libelle;
  } catch (erreur) {
    Logger.log(`Erreur critique lors de la gestion (get/create) du libellé "${nomLibelle}": ${erreur}`);
    return null;
  }
}

function configurerDeclencheurHoraire() {
  const nomFonction = 'analyserEtDeplacerSpam';
  
  try {
    ScriptApp.getProjectTriggers().forEach(declencheur => {
      if (declencheur.getHandlerFunction() === nomFonction) {
        ScriptApp.deleteTrigger(declencheur);
      }
    });
    
    ScriptApp.newTrigger(nomFonction)
        .timeBased()
        .everyHours(1)
        .create();
        
    Logger.log(`Déclencheur horaire configuré avec succès pour '${nomFonction}'.`);
  
  } catch (erreur) {
    Logger.log(`Échec de la configuration du déclencheur horaire: ${erreur}`);
  }
}

function supprimerDeclencheurs() {
  const nomFonction = 'analyserEtDeplacerSpam';
  
  try {
    ScriptApp.getProjectTriggers().forEach(declencheur => {
      if (declencheur.getHandlerFunction() === nomFonction) {
        ScriptApp.deleteTrigger(declencheur);
      }
    });
    Logger.log(`Tous les déclencheurs pour '${nomFonction}' ont été supprimés.`);
  } catch (erreur) {
     Logger.log(`Échec de la suppression des déclencheurs: ${erreur}`);
  }
}

function echapperRegExp(chaine) {
  return chaine.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 
}

Étape 3 : Configurer l’automatisation (Le Déclencheur)

Nous n’allons pas lancer le script manuellement. Nous allons dire à Google de le lancer toutes les heures pour nous.

  1. Dans la barre d’outils de l’éditeur, au-dessus du code, trouvez le menu déroulant « Sélectionner une fonction ».
  2. Choisissez la fonction configurerDeclencheurHoraire.
  3. Cliquez sur le bouton « Exécuter » juste à côté.

Étape 4 : Autoriser le script

La première fois que vous exécutez le script, Google va vous demander la permission. C’est normal, car vous donnez à ce script l’accès à votre Gmail.

  1. Une fenêtre « Autorisation requise » va s’ouvrir. Cliquez sur « Examiner les autorisations ».
  2. Choisissez votre compte Google.
  3. Vous verrez un avertissement « Google n’a pas validé cette application ». Pas de panique ! C’est parce que c’est votre propre script, il n’a pas été soumis à Google pour validation.
  4. Cliquez sur « Paramètres avancés » (ou « Advanced »).
  5. Cliquez sur « Accéder à [Nom de votre projet] (non sécurisé) ».
  6. Enfin, cliquez sur « Autoriser » pour donner au script la permission de lire et gérer vos emails.

Une fois l’autorisation terminée, la fonction configurerDeclencheurHoraire s’exécute. C’est fait ! Votre script est maintenant programmé pour s’exécuter toutes les heures, pour toujours.

Pour les utilisateurs avancés : Personnaliser le script

La beauté de ce script réside dans sa personnalisation. Ouvrez à nouveau votre projet Apps Script et regardez les premières lignes :

  • const NOM_LIBELLE_CIBLE = « _À Vérifier Publicité »;Vous n’aimez pas ce nom ? Changez-le ici ! Le script créera automatiquement le libellé pour vous. J’utilise le _ au début pour qu’il apparaisse en haut de ma liste de libellés.
  • const MOTS_CLES = [ … ];C’est le cœur du réacteur ! Si vous remarquez que des emails publicitaires passent encore au travers, ouvrez-les et regardez quels mots reviennent souvent. « Dernière chance », « Black Friday », « Nouveautés » ? Ajoutez-les simplement à cette liste ! (N’oubliez pas la virgule entre chaque terme).

Conclusion

Et voilà ! Vous avez transformé votre Gmail passif en un assistant proactif qui travaille pour vous 24h/24. Votre boîte de réception principale est désormais réservée à ce qui compte vraiment.

J’aimerais beaucoup avoir vos retours !

  • Ce script vous a-t-il été utile ?
  • Quels mots-clés avez-vous ajoutés à votre liste pour la rendre encore plus efficace ?
  • Avez-vous des questions sur l’installation ?

Laissez un commentaire ci-dessous !