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 :
- 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.
- Gestion fastidieuse : Si vous avez 20 règles, vous avez 20 filtres à gérer un par un dans les paramètres. C’est lourd.
- 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
- Enregistrez votre projet (icône disquette 💾).
- Assurez-vous que la fonction processEmails est sélectionnée dans le menu déroulant en haut, puis cliquez sur Exécuter.
- 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) :
- Dans le menu de gauche de l’éditeur, cliquez sur l’icône Déclencheurs (un réveil ⏰).
- Cliquez sur Ajouter un déclencheur en bas à droite.
- 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).
- 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 !