Numeriblog Google Workspace Gmail, le coeur du réacteur Google Apps Script : importer automatiquement un CSV depuis une pièce jointe de Gmail vers un Google Sheets

Google Apps Script : importer automatiquement un CSV depuis une pièce jointe de Gmail vers un Google Sheets

Vous recevez tous les jours un fichier CSV en pièce jointe de la part d’un de vos collègues. Ce fichier contient des données que vous souhaitez importer dans un Google Sheets. Et bien pourquoi ne […]

personnes ont consulté cet article

5 minutes

Rédigé par Ghislain SANJUAN - il y a 2 ans

Ce que vous allez découvrir

  • Fonction de récupération dans un tableau Sheets des données d’une pièce jointe de type CSV située dans le dernier email d’un destinataire donné
  • Fonction d'insertion des données dans un Google Sheets
  • Appel des deux fonctions précédentes dans une seule et même fonction MAIN()
  • Planifier l’appel de la fonction MAIN()

Google Apps Script : importer automatiquement un CSV depuis une pièce jointe de Gmail vers un Google Sheets

Vous recevez tous les jours un fichier CSV en pièce jointe de la part d’un de vos collègues. Ce fichier contient des données que vous souhaitez importer dans un Google Sheets. Et bien pourquoi ne pas automatiser cette tâche chronophage avec un peu de code ? 

Google Apps Script est là pour vous ! 

Avant toute chose posons un contexte : 

Olivier travaille dans une usine de production d’arbres à came et vilebrequins pour moteurs de camions. Il est en charge de la qualité et donc de la gestion des rebuts. Ces derniers sont répertoriés par le chef de production dans un logiciel. Le chef de production, appelons-le Ghislain, extrait quotidiennement ces données du logiciel sous format CSV (Comma Separator Value : fichier de données séparées par une virgule) et envoie tous les jours à 9h00 un fichier en pièce jointe d’un mail à Olivier. 

Olivier doit donc manuellement :

Vérifier si Ghislain a envoyé un mail concernant les rebutsOuvrir le mail reçu de GhislainEnregistrer le CSV dans le driveOuvrir le CSV avec Google SheetsCopier les données du Google SheetsColler ces données dans un autre Google Sheets à la suite des anciennes donnéesSupprimer le fichier CSV du drive

Beaucoup d’étapes pour un simple transfert de données !

Le contexte est posé, voyons comment automatiser tout ceci avec Google Apps Script, la plateforme de développement de Google  :

Fonction de récupération dans un tableau Sheets d

Veuillez créer un compte pour lire la suite de cette ressource

L’accès à cette ressource se fait gratuitement en créant un compte Numerifan. Les abonnements payants donnent également accès aux cours gratuits.

Paywall image

Cet article est réservé aux abonnés. Pourquoi ?

Fournir tout ce contenu nous demande beaucoup de temps, des ressources et une veille permanente. Accédez à ce contenu en rejoignant notre super communauté, pour tous nous remercier 💪

Besoin d'un peu plus d'aide sur Sheets ?

Des formateurs sont disponibles toute l'année pour vous accompagner et optimiser votre utilisation de Sheets, que ce soit pour votre entreprise ou pour vos besoins personnels !

Découvrir nos formations Sheets

Rédacteur

S’abonner
Notification pour
guest
21 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Elisa B

Bonjour,
Si j’ai bien vu, dans la function du second script :
function IMPORT_DATA(csvData) {
la parenthèse n’est pas fermée.
Il faut donc ajouter } en FIN de la fonction.
Elisa

Cet avis vous a été utile ?

Éditeur
Répondre à  Elisa B
2 années il y a

Merci Elisa pour la remarque ! Ghislain a corrigé.

Cet avis vous a été utile ?

PROSPA

Bonjour , Question bête: faut il forcément être avec G suite?
Merci ?

Cet avis vous a été utile ?

Anne-Sophie
Anne-Sophie

Bonjour,
Dans la fonction MAIN, il faut renommer IMPORT_AVEC_FILTRE_ID(RECUP_CSV_PIECE_JOINTE(mail)) en
IMPORT_DATA(RECUP_CSV_PIECE_JOINTE(mail)) sinon ça ne fonctionne pas 😉
Merci pour ce script, il va bien me servir !!

Cet avis vous a été utile ?

Raphaël Lamontagne
Raphaël Lamontagne

Bonjour!
Un tour grand merci pour ce script, il pourra en effet m’aider dans bon nombre de cas 🙂
Google script indique qu’il ne sait pas lire la fonction
var dernier_email= fil_email.getMessage()[fil_mail.getMessages().length-1]
il me retourne cette erreur:
TypeError: fil_email.getMessage is not a function (line 5, file « Code »)
Un tout grand merci

Cet avis vous a été utile ?

Yann
Yann
Répondre à  Raphaël Lamontagne
2 années il y a

idem, tu as trouvé une solution ?

Cet avis vous a été utile ?

Vénon
Vénon
Répondre à  Yann
1 année il y a

Pareil, vous avez une solution ?

Cet avis vous a été utile ?

Ghislain Sanjuan
Ghislain Sanjuan
Répondre à  Vénon
1 année il y a

Bonjour,
Attention c’est la fonction getMessages (avec un s à la fin)
Il y a une coquille dans le dernier script de l’article.

Cet avis vous a été utile ?

Laurie
Laurie

Bonjour,
Merci pour cet article 🙂
Je voudrais importer automatiquement un fichier Excel depuis une piece jointe de gmail vers un dossier sur mon PC.
C’est faisable ?

Cet avis vous a été utile ?

Ghislain Sanjuan
Ghislain Sanjuan
Répondre à  Laurie
1 année il y a

Bonjour Laurie, oui cela est possible mais il faut enregistrer le fichier XLS puis le convertir en Google Sheets. Pour cela voici un extrait de code qui permet la conversion ( Attention : cette méthode nécessite l’ajout de l’API DRIVE dans les services de l’interface Google Apps Script : https://developers.google.com/drive/api/v3/reference)
//Enregistrement du fichier dans le dossier
var fichier = dossier.createFile(piece_jointe_blob)
//Conversion du fichier xls en Google Sheet
//Nécessite l’ajout du service Drive API (voir barre latérale de gauche en bas)
var newFile = { title: fichier.getName() + ‘_converted’ };
file = Drive.Files.insert(newFile, piece_jointe_blob, { convert: true });

Cet avis vous a été utile ?

Doudou
Doudou

Bonjour
Est il possible de faire l’import sans la première ligne du CSV qui est l’entête dans mon cas ?

Cet avis vous a été utile ?

Sanjuan Ghislain
Sanjuan Ghislain
Répondre à  Doudou
1 année il y a

Bonjour,
Vous pouvez couper le tableau avec la fonction splice. Ce qui donnerait :
//Découpe du tableau en enlevant la 1ere ligne:
csvData=csvData.splice(0,1)
//Copie du tableau dans le Google Sheets
REBUTS.getRange(REBUTS.getLastRow()+1, 2, csvData.length, csvData[0].length).setValues(csvData)

Cet avis vous a été utile ?

Bnehrouma
Bnehrouma

Bonjour,
Merci pour ce script !
Par contre j’ai un message d’erreur suivant :
Erreur
ReferenceError: email is not defined
RECUP_CSV_PIECE_JOINTE Code.gs:3
Avez vous une solution ?

Cet avis vous a été utile ?

Ghislain Sanjuan
Ghislain Sanjuan
Répondre à  Bnehrouma
1 année il y a

Bonjour,
Il semblerait que votre variable email ne soit pas définie dans l’utilisation du script, d’après le message d’erreur. Il faut donc vérifier que vous n’ayez pas utiliser mail au lieu de email comme nom de variable

Cet avis vous a été utile ?

Bnehrouma
Bnehrouma

Dans mon cas je reçois un mail tous les mois avec des données CSV appelé VITESSE DE FACTURATION, je souhaite déposer les données automatiquement dans un sheet intitulé FACTURATION dans l’onglet DFMED.
J’arrive à la saturation, j’ai des erreurs à tous les niveaux !
Je précise je débute dans le langage script !

Cet avis vous a été utile ?

jérémy DEBRAY
jérémy DEBRAY

bonjour
j’ai une erreur de ce type que je n’arrive pa a résoudre
Erreur
Exception: Gmail operation not allowed. : Mail service not enabled
RECUP_CSV_PIECE_JOINTE Code.gs:3
et j’ai 2 question sur cette ligne
var fil_email=GmailApp.search(‘from:’+mail +’ filename:csv’ ,0,1)[0]
– à l’emplacemment « +mail + » je doit préciser l’adresse de l’expéditeur ? j’ai fait plusieurs tentative mais a partir de «  » la ligne devient erronée »
-« gmailapp.search » est applicable seulement au adresse gmail ou pas ? si je doit utiliser une adresse hotmail je doit changer la variable ?
merci d’avance pour les réponses

Cet avis vous a été utile ?

Sanjuan Ghislain
Sanjuan Ghislain
Répondre à  jérémy DEBRAY
1 année il y a

Bonjour Jérémy,
Il semble que l’API (la boite à outil) de Gmail ne semble pas active dans votre code.
Normalement, les API s’activent lors de la première exécution du code. Cependant cela peut parfois ne pas s’activer.
Pour vérifier cela, il faut regarder dans la présentation du projet (via le menu en haut à gauche).
Dans la liste, des champs OAuth, vous devriez avoir la ligne avec https://www.googleapis.com/auth/script.send_mail.
Si ce n’est pas le cas : recréer une même fonction avec un autre nom et tentez de lancer la nouvelle fonction créée
Si c’est le cas : supprimez votre script et fichier Sheets et le recréer

Cet avis vous a été utile ?

Achraf SAHLI
Achraf SAHLI

Bonjour,
Tout d’abord merci à Mr Sunjuan pour ce code,
J’ai rectifié quelque point dans le code pour l’adapter à mon besoin et maintenant le code est bien fonctionnel:
La variable déclarée dans la fonction main est : « mail » => il faut changer dans la ligne 4 « email » en « mail ».
Pour la ligne 10, j’ai comme séparateur dans le fichier csv « ; ». alors je doit changer replace(/ »/g, ‘ ‘) par replace(/;/g, » « ). (il faut faire la différence entre ‘ ‘ et  » « ).
En fin, pour la ligne , il faut chager  » parseCsv(txt, » « )  » et  » parseCsv(txt, » « )  » et n’oublier pas l’espace entre  » « .
Le code complet :
function RECUP_CSV_PIECE_JOINTE(mail){
// Recherche les messages venant de l’adresse “email” et qui ont une piece jointe au format CSV
var fil_email=GmailApp.search(‘from:’+mail +’ filename:csv’ ,0,1)[0]
// Prends le dernier message
var dernier_email=fil_email.getMessages()[fil_email.getMessages().length-1]
//Recupère la première pièce jointe
var piece_jointe=dernier_email.getAttachments()[0]
//Mise en forme des données et transformation en texte
var txt=piece_jointe.getDataAsString().replace(/;/g, » « )
//Séparation des données pour renvoyer un tableau
var csvData = Utilities.parseCsv(txt, » « )
//Renvoie le tableau de données
return csvData
}
function IMPORT_DATA(csvData){
//Récupère l’onglet GESTION REBUTS
var REBUTS=SpreadsheetApp.getActive().getSheetByName(« alarmes »)
//Vérification que le tableau possède des données
if(csvData.length>0){
//Insertion des données
REBUTS.getRange(REBUTS.getLastRow()+1, 2, csvData.length, csvData[0].length).setValues(csvData)
Logger.log(« Import terminé »)
}
else{
Logger.log(« Aucune données dans le csv »)
}
}
function MAIN(){
//L’email de Ghislain, le chef de production
var mail= »achraf.sahli@sudac.fr »
//L’appel des deux fonctions
IMPORT_DATA(RECUP_CSV_PIECE_JOINTE(mail))
}

Cet avis vous a été utile ?

Richard
Richard

Bonjour et merci pour ce script.
De mon coté j’ai corrigé le script mais je me retrouve avec cet erreur :
Journal d’exécution
14:38:28 Avis Exécution démarrée
14:38:29 Erreur
TypeError: Cannot read property ‘getMessages’ of undefined
RECUP_CSV_PIECE_JOINTE Code.gs:5
MAIN Code.gs:41
Je ne comprends pas d’où cela peut venir…
Quelqu’un a eu le même soucis ?

Cet avis vous a été utile ?

Odile
Odile
Répondre à  Richard
10 mois il y a

Bonjour Richard,
J’ai la même erreur, je cherche encore une solution. …

Cet avis vous a été utile ?