, ,

Créez un « robot » Google Apps Script pour classer vos factures Gmail dans Drive

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é.

  1. Dans Gmail, créez un nouveau libellé. Appelons-le « Facture ».
  2. 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.com ou contenant les mots "votre facture" peuvent recevoir ce libellé.
capture d’écran 2025 11 15 à 20.19.44
Création du libellé

Étape 2 : Ouvrir Google Apps Script

C’est l’outil magique (et gratuit) caché dans votre compte Google.

  1. Rendez-vous sur script.google.com.
  2. Cliquez sur « Nouveau projet » en haut à gauche.
  3. 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

  1. Assurez-vous que la fonction sauvegarderFacturesVersDrive est bien sélectionnée dans le menu déroulant en haut (à côté de « Déboguer »).
  2. Cliquez sur l’icône « Exécuter » (le triangle ▶).
  3. 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).
  4. Cliquez sur « Examiner les autorisations ».
  5. Choisissez votre compte Google.
  6. 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.
  7. Cliquez sur « Paramètres avancés », puis en bas sur « Accéder à [Nom de votre projet] (non sécurisé) ».
  8. 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.

  1. Dans votre projet Apps Script, cliquez sur l’icône « Horloge » (Déclencheurs) dans le menu de gauche.
  2. Cliquez sur « Ajouter un déclencheur » en bas à droite.
  3. 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).
  4. 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 ?