[app script] Synchroniser les notes de reMarkable sur Google Drive via un alias Gmail

Voici un script inspiré de celui fait Google app script.org : Fetch Gmail Attachment to Google Drive using Google Apps Script. Je l’ai modifié pour qu’il corresponde aux besoins des utilisateurs de reMarkable.


Ce script permet de récupérer les pièces jointes envoyées vers un alias Gmail et les stocker sur Google Drive


Il utilise les APIs de Gmail & Google Drive. Je n’aurai pas la main sur vos comptes car le script est à installer vous-même sur votre espace personnel sur script.google.com. C’est un manière semi-automatique de synchroniser les notes car c’est à vous d’envoyer régulièrement vos notes vers votre alias Gmail. Ensuite, le script s’occupe de les mettre sur Google Drive à intervalle régulière.

1- Créez un nouveau project sur script.google.com

2- Dans l’Editor, copiez/collez mon script

from this
to this

3- Il y a certaines choses à customiser avant de lancer le script.

Ligne 9. Votre alias Gmail. Créez un alias Gmail pour envoyer uniquement vos notes remarkable sur cette adresse. Cela permet au script de lire uniquement les messages envoyés à cette adresse, au lieu d’analyser toute votre boîte email. L’exécution se fera plus rapidement ainsi. Apprenez à créer un alias Gmail ici. Votre alias aura une forme similaire à : janedoe+rmk@gmail.com (après le +, vous mettez ce que vous voulez)

var yourMail = 'YOUR_GMAIL_ALIAS_HERE';

Vous pouvez modifier le type de fichiers que vous voulez synchroniser sur Google Drive. Par défaut, cela inclut tous les formats disponibles sur reMarkable, à savoir PDF, SVG, et PNG. Ligne 12.

var fileTypesToExtract = ['pdf', 'svg', 'png'];

Ligne 14. Nom du dossier Google Drive où vous trouverez le fichier. Ne vous inquiétez pas, si ce dossier n’existe pas encore, le script va le créer automatiquement pour vous.

var folderName = 'reMarkabletoDrive';

Ligne 16. Nom du libellé qui sera appliqué sur les messages traités par le script. Ne vous inquiétez pas, si le libellé n’existe pas encore, le script va le créer automatiquement pour vous.

var labelName = 'fetchedToDrive';

4- Renommez votre script. Save puis Debug.

5- Donnez les autorisations nécessaires pour l’accès à Gmail et Google Drive.

cliquez sur « advanced »

continuez

Allow

6- Sur le menu à gauche, cliquez sur « Triggers »

Pour que le script fonctionne bien et synchronise régulièrement le contenu de votre Gmail et Google Drive, il faut le lancer toutes les 15 minutes. Choisissez aussi de recevoir une alerte si quelque chose ne marche pas.

7- Si vous êtes impatient de voir le script à l’oeuvre, après avoir configuré tout ça, revenez dans l’éditeur et cliquez sur « run »

/*
 * This script is based on Apps Script Development's script : http://www.googleappsscript.org/home/fetch-gmail-attachment-to-google-drive-using-google-apps-script
 * It has been edited by nomadbento.com to match reMarkable users' needs
 */

// GLOBALS
//Enter your customized reMarkable alias gmail 
/*****************COMPULSORY********************/
var yourMail = 'YOUR_GMAIL_ALIAS_HERE';
/*****************THANK YOU********************/
//Array of file extension which you would like to extract to Drive
var fileTypesToExtract = ['pdf', 'svg', 'jpg'];
//Name of the folder in google drive in which files will be put
var folderName = 'reMarkabletoDrive';
//Name of the label which will be applied after processing the mail message
var labelName = 'fetchedToDrive';


function GmailToDrive(){
  //build query to search emails
  var query = '';
  //filename:pdf OR filename:svg OR filename:jpg 
  for(var i in fileTypesToExtract){
 query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
  }
  query = 'in:inbox has:attachment to:'+yourMail+' '+ query;
  var threads = GmailApp.search(query);
  var label = getGmailLabel_(labelName);
  var parentFolder;
  if(threads.length > 0){
    parentFolder = getFolder_(folderName);
  }
  var root = DriveApp.getRootFolder();
  for(var i in threads){
    var mesgs = threads[i].getMessages();
    var threadlabels = threads[i].getLabels();
    if (checkIfContainsLabel(threadlabels)=="ok"){
      for(var j in mesgs){
          // get the names of the labels attached to the message
          var recipient = mesgs[j].getTo();
          //check email address
          if (checkRecipient(recipient)=="ok"){
              //get attachments
              var attachments = mesgs[j].getAttachments();
            for(var k in attachments){
              var attachment = attachments[k];
              //check attachements extension
              var isDefinedType = checkIfDefinedType_(attachment);
              if(isDefinedType){
                var attachmentBlob = attachment.copyBlob();
                    var file = DriveApp.createFile(attachmentBlob);
                    parentFolder.addFile(file);
                    root.removeFile(file);
              }
            }
          }  
      }
      threads[i].addLabel(label);
    }
 
  }
}

//This function will get the parent folder in Google drive
function getFolder_(folderName){
  var folder;
  var fi = DriveApp.getFoldersByName(folderName);
  if(fi.hasNext()){
    folder = fi.next();
  }
  else{
    folder = DriveApp.createFolder(folderName);
  }
  return folder;
}


function getGmailLabel_(name){
  var label = GmailApp.getUserLabelByName(name);
  if(!label){
 label = GmailApp.createLabel(name);
  }
  return label;
}

//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
  else return false;
}


function checkIfContainsLabel(allLabels){
  var check = "ok"; 
  for (var index = 0; index < allLabels.length; index++) {  
    var messageLabel = allLabels[index].getName();
    var temp = messageLabel.split('/');
    for (var l = 0; l < temp.length; l++){
      var nameLabel = temp[l];
      if (nameLabel.indexOf(labelName) == 0) {
        check = "nok";
      }
    }
  }
  return check;

}


function checkRecipient(allRecipients){
    var check = "nok";
    var temp = allRecipients.split(',');
    for (var m = 0; m < temp.length; m++){
      var emailRecipient = temp[m].toLowerCase();
      if (emailRecipient.indexOf(yourMail.toLowerCase()) != -1){
        check = "ok";
      }
    }

  return check;  
}