,

Fatigué des filtres GMail limités ? Automatisez votre boîte de réception comme un pro avec ce script !

Nous connaissons tous cette situation. Votre boîte de réception GMail déborde. Vous avez beau créer des filtres, certains e-mails passent toujours entre les mailles du filet. Vous voulez classer tous les expéditeurs qui commencent par noreply@xxx, mais le filtre GMail standard n’est pas assez précis. Vous voulez gérer 30 règles complexes sans avoir à créer 30 filtres différents.

La solution ? Elle est gratuite, incroyablement puissante et déjà intégrée à votre compte Google : Google Apps Script.

Aujourd’hui, je vous partage un script qui va transformer votre GMail en un assistant personnel ultra-efficace. Il agit comme un « super-filtre » centralisé que vous pouvez configurer en quelques secondes.

Pourquoi les filtres GMail classiques ne suffisent pas ?

Les filtres intégrés de GMail sont parfaits pour les tâches simples (de:expediteur@exemple.com -> Appliquer le libellé: « Famille »). Mais ils montrent vite leurs limites :

  1. Manque de précision : Ils peinent avec les correspondances partielles. Demander de filtrer un expéditeur qui commence par grp_noreply est presque impossible, car GMail recherche le mot entier.
  2. Gestion fastidieuse : Si vous avez 20 règles, vous avez 20 filtres à gérer un par un dans les paramètres. C’est lourd.
  3. Organisation limitée : Ils ne peuvent pas créer dynamiquement des sous-libellés (par exemple, « Factures » > « 2024 » > « Orange ») à la volée.

Notre script résout ces trois problèmes.

La solution : Une « tour de contrôle » pour vos e-mails

L’intérêt de ce code est de fournir un seul endroit (un « tableau de bord ») pour gérer toutes vos règles de tri, même les plus complexes.

Voici ce que ce script vous permet de faire :

  • Filtrer par « commence par » : Idéal pour les noreply, alerte-, newsletter-, etc.
  • Filtrer par « contient » : Sur l’objet ou l’expéditeur.
  • Centraliser : Toutes vos règles sont dans un seul fichier, faciles à lire et à modifier.
  • Archiver et Marquer comme lu : Applique automatiquement des actions pour garder votre boîte de réception propre.
  • Créer des sous-libellés : Il gère parfaitement la création de libellés imbriqués, comme Automatique/Noreply.

Le guide d’installation en 5 minutes

Pas besoin d’être un développeur chevronné. Suivez le guide !

Étape 1 : Ouvrir Google Apps Script

Rendez-vous sur script.google.com. Si c’est votre première fois, vous verrez un écran de bienvenue. Cliquez sur Nouveau projet.

Étape 2 : Copier-coller le code

Effacez tout le contenu du fichier Code.gs (la fonction myFunction par défaut) et collez le code complet ci-dessous :

/**
 * =================================================================
 * PARAMÉTRAGE DU SCRIPT
 * =================================================================
 *
 * Modifiez uniquement cette section pour configurer vos filtres.
 */
const CONFIGURATION = [
  
  // EXEMPLE 1: Le cas de votre demande initiale
  {
    label: "Automatique/Noreply", // Sera créé comme "Automatique" > "Noreply"
    type: "from_startsWith",
    query: "noreply",
    actions: { archive: true, markRead: true }
  },

  // EXEMPLE 2: Toutes les factures dans un libellé "Factures"
  {
    label: "Dossiers/Factures", // Sera créé comme "Dossiers" > "Factures"
    type: "subject_contains",
    query: "facture",
    actions: { archive: true, markRead: false }
  },

  // EXEMPLE 3: E-mails d'un expéditeur spécifique
  {
    label: "Projets/Client X",
    type: "from_contains",
    query: "client-x.com",
    actions: { archive: false, markRead: false }
  },
  
  // EXEMPLE 4: Un libellé non-imbriqué
  {
    label: "Simple Libellé",
    type: "subject_contains",
    query: "newsletter",
    actions: { archive: true, markRead: false }
  },

  // EXEMPLE 5: (Avancé) Une recherche GMail complexe
  {
    label: "Urgent",
    type: "gmail_search",
    query: "subject:(urgent OR important) is:unread",
    actions: { archive: false, markRead: false }
  }

];

// =================================================================
// FIN DU PARAMÉTRAGE (Ne pas modifier le code ci-dessous)
// =================================================================

/**
 * Fonction principale à exécuter et à déclencher.
 */
function processEmails() {
  Logger.log("Démarrage du traitement des e-mails...");

  // 1. Traiter les filtres personnalisés (non-gmail_search)
  const inboxThreads = GmailApp.search("is:unread in:inbox");
  const customFilters = CONFIGURATION.filter(config => config.type !== "gmail_search");
  
  for (const thread of inboxThreads) {
    let threadActions = { appliedLabel: false, archive: false, markRead: false };
    
    for (const config of customFilters) {
      if (checkThread(thread, config)) {
        Logger.log(`Correspondance trouvée pour "${config.label}" (Sujet: ${thread.getFirstMessageSubject()})`);
        
        // Utilise la nouvelle fonction corrigée
        const label = getOrCreateNestedLabel(config.label);
        thread.addLabel(label);
        
        threadActions.appliedLabel = true;
        if (config.actions.archive) threadActions.archive = true;
        if (config.actions.markRead) threadActions.markRead = true;
      }
    }
    
    // Appliquer les actions groupées pour ce thread
    if (threadActions.appliedLabel) {
      if (threadActions.markRead) thread.markRead();
      if (threadActions.archive) thread.moveToArchive();
    }
  }

  // 2. Traiter les filtres de type "gmail_search" (avancé)
  const gmailSearchFilters = CONFIGURATION.filter(config => config.type === "gmail_search");
  
  for (const config of gmailSearchFilters) {
    Logger.log(`Exécution de la recherche GMail : "${config.query}"`);
    const threads = GmailApp.search(config.query);
    
    // Utilise la nouvelle fonction corrigée
    const label = getOrCreateNestedLabel(config.label);
    
    if (threads.length > 0) {
      Logger.log(` -> ${threads.length} conversation(s) trouvée(s) pour "${config.label}". Application des actions.`);
      applyActions(threads, label, config.actions);
    }
  }
  
  Logger.log("Traitement terminé.");
}

/**
 * Vérifie si un thread correspond à une configuration de filtre personnalisée.
 */
function checkThread(thread, config) {
  const message = thread.getMessages()[0]; // Vérifie uniquement le premier message
  const subject = message.getSubject().toLowerCase();
  const senderRaw = message.getFrom();
  const senderEmail = extractEmailAddress(senderRaw).toLowerCase();
  const query = config.query.toLowerCase();

  switch (config.type) {
    case "from_startsWith":
      return senderEmail.startsWith(query);
    case "from_contains":
      return senderEmail.includes(query);
    case "subject_contains":
      return subject.includes(query);
    case "subject_startsWith":
      return subject.startsWith(query);
    default:
      return false;
  }
}

/**
 * Applique les actions (archivage, marquer comme lu) à une liste de threads.
 */
function applyActions(threads, label, actions) {
  for (const thread of threads) {
    thread.addLabel(label);
    if (actions.markRead) {
      thread.markRead();
    }
    if (actions.archive) {
      thread.moveToArchive();
    }
  }
}

/**
 * ! =================================================
 * ! FONCTION MISE À JOUR (Gère les libellés imbriqués)
 * ! =================================================
 *
 * Récupère un libellé GMail par son nom, ou le crée (et ses parents) s'il n'existe pas.
 * @param {string} name Le nom complet du libellé (ex: "Parent/Enfant/PetitEnfant").
 * @return {GoogleAppsScript.Gmail.GmailLabel} L'objet libellé final.
 */
function getOrCreateNestedLabel(name) {
  // S'il n'y a pas de '/', on utilise l'ancienne méthode (plus rapide)
  if (name.indexOf('/') === -1) {
    let label = GmailApp.getUserLabelByName(name);
    if (!label) {
      label = GmailApp.createLabel(name);
    }
    return label;
  }

  // S'il y a un '/', on construit la hiérarchie
  let parts = name.split('/');
  let currentPath = "";
  let lastLabel = null;

  for (const part of parts) {
    // Construit le chemin complet (ex: "Parent", puis "Parent/Enfant")
    currentPath = (currentPath === "") ? part : currentPath + "/" + part;

    let label = GmailApp.getUserLabelByName(currentPath);
    if (!label) {
      Logger.log(`Création du libellé manquant : ${currentPath}`);
      label = GmailApp.createLabel(currentPath);
    }
    lastLabel = label;
  }
  
  // Retourne le dernier libellé de la chaîne (le plus imbriqué)
  return lastLabel;
}

/**
 * Extrait l'adresse e-mail pure d'un champ "From".
 */
function extractEmailAddress(sender) {
  const emailMatch = sender.match(/<([^>]+)>/);
  if (emailMatch) {
    return emailMatch[1]; // Prend ce qu'il y a entre < >
  }
  return sender; // Au cas où l'expéditeur est juste l'e-mail
}

Étape 3 : Personnaliser vos règles

C’est la partie la plus importante ! Remontez tout en haut du script, dans la section const CONFIGURATION = [ … ].

C’est ici que vous définissez vos règles. J’ai inclus 5 exemples. Vous pouvez les supprimer ou les modifier. Pour ajouter une règle, copiez-collez simplement un bloc {…}, à l’intérieur des crochets […].

Chaque règle a 4 propriétés :

  • label: Le libellé que vous voulez appliquer. Utilisez / pour les sous-libellés (ex: « Dossiers/Factures »).
  • type: La méthode de détection :
    • from_startsWith: L’e-mail de l’expéditeur commence par
    • from_contains: L’e-mail de l’expéditeur contient
    • subject_contains: L’objet contient
    • subject_startsWith: L’objet commence par
    • gmail_search: (Avancé) Utilise une recherche GMail complète.
  • query: Le texte que vous recherchez.
  • actions: Ce que vous voulez faire. archive: true pour le retirer de la boîte de réception, markRead: true pour le marquer comme lu.

Étape 4 : Exécuter et autoriser

  1. Enregistrez votre projet (icône disquette 💾).
  2. Assurez-vous que la fonction processEmails est sélectionnée dans le menu déroulant en haut, puis cliquez sur Exécuter.
  3. Autorisation requise : Google va vous demander la permission.
    • Cliquez sur « Examiner les autorisations » et choisissez votre compte.
    • Vous verrez un avertissement « Google n’a pas validé cette application ». C’est normal. C’est votre propre script, pas une application tierce.
    • Cliquez sur « Paramètres avancés », puis sur « Accéder à [Nom de votre projet] (non sécurisé) ».
    • Cliquez sur « Autoriser ».

Le script va s’exécuter une première fois sur votre boîte de réception.

Étape 5 : Automatiser le script

Pour que ce script s’exécute tout seul (par exemple, toutes les 10 minutes) :

  1. Dans le menu de gauche de l’éditeur, cliquez sur l’icône Déclencheurs (un réveil ⏰).
  2. Cliquez sur Ajouter un déclencheur en bas à droite.
  3. Configurez-le comme suit :
    • Fonction à exécuter : processEmails
    • Source de l’événement : Minuteur
    • Type de minuteur : Minuteur (en minutes)
    • Intervalle : Toutes les 10 minutes (ou 15, ou toutes les heures).
  4. Cliquez sur Enregistrer.

Conclusion

Et voilà ! Vous avez maintenant un robot personnel qui trie vos e-mails avec une précision que GMail seul ne peut pas offrir. Le véritable intérêt de ce code est la centralisation et la précision. Vous passez de 20 filtres compliqués à gérer à un seul tableau de bord clair et lisible.

Vous gagnez du temps, de la clarté et une boîte de réception enfin maîtrisée.


Et vous ? Quelles sont les règles de filtrage les plus folles que vous aimeriez mettre en place ? Partagez vos idées de configuration dans les commentaires !