Vous aussi, vous passez un temps fou à chercher vos factures dans votre boîte Gmail ? Vous téléchargez les PDF un par un pour les ranger (quand vous y pensez) dans un dossier Google Drive ? C’est une corvée, et on finit toujours par en oublier une.
Et si on arrêtait ça ? 😅
Aujourd’hui, je vous propose un article un peu technique, mais incroyablement puissant. Nous allons utiliser la magie de Google Apps Script pour créer un robot qui va, pour nous, lire nos e-mails, prendre les factures en PDF, et les classer automatiquement dans le bon dossier Drive.
Prêt à automatiser votre administratif ? C’est parti !
Pourquoi automatiser cette tâche ?
Avant de plonger dans le code, parlons de l’intérêt. Configurer ce script prend environ 10 minutes, mais il vous fera gagner des heures sur le long terme.
- Gain de temps : Plus besoin de traitement manuel. Le script tourne en arrière-plan.
- Centralisation : Toutes vos factures se retrouvent au même endroit, dans votre Drive, prêtes pour votre comptabilité ou vos archives.
- Fiabilité : Fini les oublis. Dès qu’une facture arrive (et qu’elle est marquée par un libellé), elle est traitée.
- Zéro désordre : Le script marque l’e-mail comme « lu » une fois la pièce jointe sauvegardée, gardant votre boîte de réception propre.
Mettre en place votre robot en 6 étapes
Pas besoin d’être un développeur chevronné pour suivre ce tutoriel. Je vais vous guider pas à pas.
Étape 1 : Préparer votre Gmail
Le script a besoin d’un moyen simple pour identifier les e-mails de factures. Le plus simple est d’utiliser un libellé.
- Dans Gmail, créez un nouveau libellé. Appelons-le « Facture ».
- Ensuite, créez des filtres pour que Gmail applique automatiquement ce libellé à vos e-mails entrants. Par exemple, tous les e-mails venant de
facturation@monfournisseur.comou contenant les mots"votre facture"peuvent recevoir ce libellé.

Étape 2 : Ouvrir Google Apps Script
C’est l’outil magique (et gratuit) caché dans votre compte Google.
- Rendez-vous sur script.google.com.
- Cliquez sur « Nouveau projet » en haut à gauche.
- Donnez un nom à votre projet (ex: « Automate Factures »).
Étape 3 : Copier-coller le script
Effacez la fonction myFunction qui s’affiche par défaut et collez le code suivant à la place :
/**
* TÂCHE PRINCIPALE
* Analyse les e-mails non lus avec un libellé spécifique (ex: "Facture"),
* extrait les pièces jointes PDF et les sauvegarde dans un
* dossier Google Drive dédié.
*/
function sauvegarderFacturesVersDrive() {
// --- Configuration ---
// Adaptez ces valeurs selon vos besoins
const libelleGmail = "Facture"; // Le libellé exact dans Gmail (ex: "Facture")
const nomDossierDrive = "Factures"; // Le nom du dossier de destination (ex: "Factures")
try {
// --- 1. Obtenir ou créer le dossier de destination ---
const dossierDestination = obtenirOuCreerDossierDrive(nomDossierDrive);
if (!dossierDestination) {
// Si la fonction utilitaire retourne null (erreur déjà loguée), on arrête.
return;
}
// --- 2. Rechercher les fils de discussion (threads) ---
// On recherche les e-mails non lus portant le libellé spécifié.
const requeteGmail = `label:${libelleGmail} is:unread`;
const filsDeDiscussion = GmailApp.search(requeteGmail);
if (filsDeDiscussion.length === 0) {
Logger.log("Aucun nouveau fil de discussion trouvé. Le script se termine.");
return; // Sortie propre si aucun e-mail ne correspond.
}
Logger.log(`[INFO] ${filsDeDiscussion.length} fil(s) de discussion à traiter.`);
// --- 3. Traitement de chaque fil et message ---
filsDeDiscussion.forEach((fil, indexFil) => {
Logger.log(`Traitement du fil ${indexFil + 1}/${filsDeDiscussion.length}...`);
const messages = fil.getMessages();
messages.forEach(message => {
// Vérification cruciale pour éviter de traiter plusieurs fois le même message
if (message.isUnread()) {
const piecesJointes = message.getAttachments();
piecesJointes.forEach(pieceJointe => {
// Sauvegarder uniquement les fichiers PDF
if (pieceJointe.getContentType() === 'application/pdf') {
// Gestion d'erreur locale (par fichier)
try {
// Utilise copyBlob() pour garantir une copie stable du fichier
const blob = pieceJointe.copyBlob();
dossierDestination.createFile(blob);
Logger.log(`[SUCCÈS] Fichier sauvegardé : ${pieceJointe.getName()} (Depuis: ${message.getSubject()})`);
} catch (erreurFichier) {
// Si la création d'UN fichier échoue, on log l'erreur et on continue
Logger.log(`[ERREUR FICHIER] Impossible de sauvegarder : ${pieceJointe.getName()}. Erreur : ${erreurFichier.message}`);
}
}
}); // Fin boucle piècesJointes
// Une fois toutes les PJ traitées, on marque le message comme lu.
message.markRead();
}
}); // Fin boucle messages
}); // Fin boucle filsDeDiscussion
Logger.log("[INFO] Traitement terminé avec succès.");
} catch (erreurGlobale) {
// --- 4. Gestion des erreurs critiques ---
// Capture les erreurs majeures (ex: accès Gmail refusé, DriveApp inaccessible, quota atteint)
Logger.log(`[ERREUR CRITIQUE] Le script a été interrompu. Erreur : ${erreurGlobale.message}`);
Logger.log(`Stack trace : ${erreurGlobale.stack}`);
}
}
/**
* FONCTION UTILITAIRE (HELPER)
* Recherche un dossier par son nom. S'il n'existe pas, il le crée.
* @param {string} nomDossier Le nom du dossier à rechercher ou créer.
* @returns {GoogleAppsScript.Drive.Folder | null} L'objet Dossier (Folder) ou null en cas d'erreur.
*/
function obtenirOuCreerDossierDrive(nomDossier) {
try {
const dossiersTrouves = DriveApp.getFoldersByName(nomDossier);
if (dossiersTrouves.hasNext()) {
// Le dossier existe, on le retourne
return dossiersTrouves.next();
} else {
// Le dossier n'existe pas, on le crée
const nouveauDossier = DriveApp.createFolder(nomDossier);
Logger.log(`[INFO] Dossier créé : ${nouveauDossier.getName()} (ID: ${nouveauDossier.getId()})`);
return nouveauDossier;
}
} catch (erreur) {
Logger.log(`[ERREUR CRITIQUE] Impossible d'accéder ou de créer le dossier Drive : ${nomDossier}. Erreur : ${erreur.message}`);
return null;
}
}
Étape 4 : Personnaliser le script
C’est l’étape la plus importante ! Vous devez dire au script quel libellé chercher et où sauvegarder les fichiers.
Regardez au début du script, dans la section // --- Configuration --- :
const libelleGmail = "Facture"; // Le libellé exact dans Gmail (ex: "Facture") const nomDossierDrive = "Factures"; // Le nom du dossier de destination (ex: "Factures")
libelleGmail: Mettez ici le nom exact de votre libellé Gmail (créé à l’étape 1). Si vous l’avez appelé « Compta », mettez « Compta ».nomDossierDrive: Mettez le nom du dossier Google Drive où les PDF doivent être sauvegardés. Vous n’avez pas besoin de créer ce dossier, le script le fera pour vous s’il n’existe pas !
Étape 5 : Lancer et autoriser
- Assurez-vous que la fonction
sauvegarderFacturesVersDriveest bien sélectionnée dans le menu déroulant en haut (à côté de « Déboguer »). - Cliquez sur l’icône « Exécuter » (le triangle ▶).
- La première fois, Google va vous demander une autorisation. C’est normal, vous donnez la permission à VOTRE script d’accéder à VOS données (Gmail et Drive).
- Cliquez sur « Examiner les autorisations ».
- Choisissez votre compte Google.
- Vous verrez un avertissement « Google n’a pas validé cette application ». Pas de panique ! C’est parce que c’est votre script, pas une application publique.
- Cliquez sur « Paramètres avancés », puis en bas sur « Accéder à [Nom de votre projet] (non sécurisé) ».
- Cliquez sur « Autoriser ».
Étape 6 : Vérifier le résultat
L’exécution peut prendre quelques secondes. Vous pouvez voir ce que fait le script dans le « Journal d’exécution » en bas.
Si tout s’est bien passé :
- Allez dans votre Google Drive : vous devriez y trouver un nouveau dossier (ex: « Factures ») rempli de vos PDF !
- Allez dans votre Gmail : les e-mails traités doivent maintenant être marqués comme « lus ».
La cerise sur le gâteau : L’automatisation totale
Pour l’instant, vous devez cliquer sur « Exécuter » pour lancer le script. Pour le rendre 100% automatique, nous allons créer un déclencheur.
- Dans votre projet Apps Script, cliquez sur l’icône « Horloge » (Déclencheurs) dans le menu de gauche.
- Cliquez sur « Ajouter un déclencheur » en bas à droite.
- Configurez-le comme suit :
- Fonction à exécuter :
sauvegarderFacturesVersDrive - Type d’événement : Minuteur
- Type de minuteur : Basé sur une heure
- Fréquence : Toutes les heures (ou tous les jours, selon vos besoins).
- Fonction à exécuter :
- Cliquez sur « Enregistrer ».
Et voilà ! Désormais, toutes les heures, le script se lancera tout seul, vérifiera votre boîte de réception, et archivera vos nouvelles factures. Vous n’avez plus rien à faire !
J’espère que ce tutoriel vous sera aussi utile qu’à moi ! C’est un exemple parfait de la puissance de Google Workspace quand on combine les outils.
N’hésitez pas à poser vos questions dans les commentaires ! Avez-vous réussi à le mettre en place ? Quelles autres tâches aimeriez-vous automatiser dans Google Workspace ?