Sauvegarder ses emails en PDF avec les pièces jointes



Qui n'a pas souhaité sauvegarder ses mails de façon automatique ? Le script ci-dessous va vous permettre d'enregistrer les conversations de Gmail au format PDF à l'aide du convertisseur PDF natif.

Le fonctionnement :

Le script lit le corps des conversations Gmail, supprime les images intégrées, enregistre la conversation en tant que fichier HTML, puis convertit le code HTML en PDF. S'il y a des pièces jointes dans la conversation, elles sont également enregistrées. Les liens de téléchargement des pièces jointes sont également ajoutés au fichier PDF en bas de page.

Pour cette démonstration, j'ai imaginé que les conversations à transformer en PDF seront positionnées avec le libellé PDF. Les fichiers générés seront placés dans le dossier Mon Gmail.

L'usage :

Lors du départ d'un salarié, ce script peut permettre de placer tous les mails (et pièces jointes) dans un dossier sous Drive. Ensuite, transférer la propriété du dossier.

L'installation du script :

  • Sous Drive, cliquer sur le bouton Nouveau puis Plus et Google Apps Script,
  • Copier le code ci dessous et copier dans Code.gs
  • Indiquer un titre à votre script (sauverGmailEnPDF par exemple)
  • Lancer le code en cliquant le bouton ▶️pour exécuter le script une première fois et valider les droits d'exécution.

Le déclencheur :

Afin que le script fonctionne "seul", imaginons que chaque heure le script sera exécuté. Vous pouvez bien entendu modifier la fréquence.

Le script : 


function sauverGmailEnPDF() { 
  
  var libelleGmail  = "PDF";  
  var dossierDrive  = "Mon Gmail";
  
  var conversations = GmailApp.search("in:" + libelleGmail, 0, 5);  
  
  if (conversations.length > 0) {
    
    /* Dossier Google Drive où les fichiers seront sauvegardés */
    var dossiers = DriveApp.getFoldersByName(dossierDrive);
    var dossier = dossiers.hasNext() ? 
        dossiers.next() : DriveApp.createFolder(dossierDrive);
    
    /* Libellé Gmail contenant les emails à sauver */
    var label = GmailApp.getUserLabelByName(libelleGmail) ?     
        GmailApp.getUserLabelByName(libelleGmail) : GmailApp.createLabel(dossierDrive);
    
    for (var t=0; t<conversations.length; t++) {
      
      conversations[t].removeLabel(label);
      var msgs = conversations[t].getMessages();
      
      var html = "";
      var piecesJointes = [];
      
      var sujet = conversations[t].getFirstMessageSubject();
      
      /* Ajout de toutes les conversations d'un message dans un document HTML */
      for (var m=0; m<msgs.length; m++) {
        
        var msg = msgs[m];
        
        html += "De: " + msg.getFrom() + "<br />";  
        html += "A: " + msg.getTo() + "<br />";
        html += "Date: " + msg.getDate() + "<br />";
        html += "Sujet: " + msg.getSubject() + "<br />"; 
        html += "<hr />";
        html += msg.getBody().replace(/<img[^>]*>/g,"");
        html += "<hr />";
        
        var atts = msg.getAttachments();
        for (var a=0; a<atts.length; a++) {
          piecesJointes.push(atts[a]);
        }
      }
      
      /* Sauvegarde des fichiers joints et création des liens dans le pied de page du document. */
      if (piecesJointes.length > 0) {
        var piedDePage = "<strong>Pièces jointes:</strong><ul>";
        for (var z=0; z<piecesJointes.length; z++) {
          var fichier = dossier.createFile(piecesJointes[z]);
          piedDePage += "<li><a href='" + fichier.getUrl() + "'>" + fichier.getName() + "</a></li>";
        }
        html += piedDePage + "</ul>";
      }
      
      /* Convertir les fils de discussion en fichier PDF */
      var fichierTemporaire = DriveApp.createFile("temp.html", html, "text/html");
      dossier.createFile(fichierTemporaire.getAs("application/pdf")).setName(sujet + ".pdf");
      fichierTemporaire.setTrashed(true);
      
    }
  }
 

Commentaires