Numeriblog Google Workspace Google Sheets, le tableur surpuissant Google Apps Script et Google Sheets : créer, stocker, récupérer le lien d’un PDF depuis une feuille de calcul en un clic

Google Apps Script et Google Sheets : créer, stocker, récupérer le lien d’un PDF depuis une feuille de calcul en un clic

Vous construisez vos documents (devis, factures…) depuis Google Sheets. Une fois le document créé, il faut télécharger le fichier au format PDF, le nommer, le placer dans le bon dossier Drive, récupérer le lien de […]

5(7)
personnes ont consulté cet article

4 minutes

Rédigé par Antoine MARTIN - il y a 4 ans et modifié le 22/05/2024 à 10:46

Ce que vous allez découvrir

  • Associer un script à votre feuille de calcul
  • Ajouter un bouton dans la barre de menus de Sheets
  • Créer la fonction "savePDF"
  • Créer une URL du PDF
  • Créer le nom du document
  • Transformer l'URL en document PDF
  • Copier le PDF dans le bon dossier
  • Récupérer le lien et l'enregistrer
  • Afficher un message de réussite
  • Code complet
  • Résultat final !

Google Apps Script et Google Sheets : créer, stocker, récupérer le lien d’un PDF depuis une feuille de calcul en un clic

Vous construisez vos documents (devis, factures…) depuis Google Sheets. Une fois le document créé, il faut télécharger le fichier au format PDF, le nommer, le placer dans le bon dossier Drive, récupérer le lien de partage pour l’envoyer aux personnes concernées… pff.
Autant de tâches laborieuses et sources d’erreur si elles sont confiées à un humain !
Cet article vous présente une solution d’automatisation des procédures de gestion de documents.


Contexte :

L’agence de graphisme 10Zaïne sait déjà créer des devis avec Sheets (voir l’article suivant).

Vous devez créer le PDF et le stocker dans le dossier des devis.

Créons ensemble un script afin d’automatiser les tâches : Suivez le guide.

10Zaïne, la fameuse agence de graphisme !

Associer un script à votre feuille de calcul

Voici une table de données de devis et la génération du document en fonction de sa référence (voir l’article suivant pour suivre la construction de ces feuilles de calcul.)

Cliquez-ici pour obtenir une copie de cette Google Sheet.

Ouvrez l’éditeur de script depuis cette feuille :

Ajouter un bouton dans la barre de menus de Sheets

La fonction « onOpen » (respectez la casse !) se déclenche à chaque ouverture du fichier. Utilisons-la pour créer un menu spécial !

Cette fonction permet de créer un bouton qui appellera la fonction « savePDF » :

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu("GED");
  menu.addItem("Enregistrer le PDF ↓ ","savePDF");
  menu.addToUi();
}

Pour éviter de recharger la page, exécutez le script directement.

Créer la fonction « savePDF »

function savePDF()
{
// Suivez le guide pour remplir cette fonction au fur et à mesure.
}

Créer une URL du PDF

Afin de créer le PDF de la feuille sélectionnée, il faut générer une URL qui contient l’ensemble des paramètres d’impression :

 // SÉLECTIONNER LA FEUILLE A SAUVEGARDER
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
//URL de SS ?
    var ssUrl = ss.getUrl();
    var sheetId= sheet.getSheetId();
// Créer l'URL du document
    var url = ssUrl.replace(/\/edit.*$/,'')
      + '/export?exportformat=pdf&format=pdf'
      + '&size=LETTER'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=0.50'
      + '&bottom_margin=0.50'
      + '&left_margin=0.50'
      + '&right_margin=0.50'
      + '&sheetnames=false'
      + '&printtitle="TEST"'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'
      + '&gid='+sheetId;

Vous pouvez modifier les paramètres, comme les tailles des marges (top_margin, bottom_margin, left_margin, right_margin…) par exemple.

Créer le nom du document

Le PDF doit être nommé correctement, par exemple :

2020-003_DEVIS_10Zaine_NOM-DU-CLIENT_DATE.PDF

Image de référence

Pour obtenir ce nom il faut récupérer les informations présentes dans le devis.

// RÉCOLTER LES INFORMATIONS DANS LE SHEET POUR COMPOSER LE NOM DU DOCUMENT
  var docId = sheet.getRange('B2').getValue();
  var clientName =  sheet.getRange('C3').getValue();
  var docDate = sheet.getRange('D2').getValue();
  //mise en forme de la date : mois-annee
  var docDateMMYY = (docDate.getMonth()+1)+"-"+docDate.getFullYear();
  // Concaténons le tout
  var docName = docId+"_DEVIS_10Zaine_"+clientName+"_"+docDateMMYY ;

Il faut bien évidemment adapter le code à l’emplacement de vos données :

Transformer l’URL en document PDF

Pour exécuter la méthode qui transforme l’URL en document il est utile de récupérer une autorisation. Sinon le document affichera la fenêtre d’identification au compte Google.

// CRÉER LE PDF A PARTIR DE L'URL
  var token = ScriptApp.getOAuthToken();
  var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' +  token } });
  var pdf = docurl.getAs('application/pdf').setName(docName);;
  var file = DriveApp.createFile(pdf);

Copier le PDF dans le bon dossier

La méthode « createFile » crée un document à la racine de votre Drive, il faut donc le déplacer dans le bon dossier.

En amont, vous devez créer un dossier qui rassemblera tous les devis de l’agence et récupérer son « ID », dans son URL par exemple :

Créez un dossier et récupérez son ID
 //COPIER LE PDF DANS LE DOSSIER
 /*
   ATTENTION IL FAUT ADAPTER LE CODE AVEC L'ID DU FOLDER DE DESTINATION
  */
  var folder = DriveApp.getFolderById("ID_DU_FOLDER_A_RENSEIGNER");
  var finalfile = file.moveTo(folder);
  

Récupérer le lien et l’enregistrer

Créez une nouvelle feuille de calcul « GED » (Gestion Electronique des Documents) dans le même classeur. A chaque création de PDF, une nouvelle ligne s’ajoutera contenant toutes les informations d’accès au document.

 //RÉCUPÉRER LE LIEN
     var docUrl = finalFile.getUrl();
//ajouter l'UrL dans la GED.
    var sheetGed = ss.getSheetByName('GED');
    sheetGed.appendRow([new Date(),docId,docUrl,docName]);
    

Afficher un message de réussite

Ajoutez une boite de dialogue « Alert » qui annonce le bon déroulement de l’opération !

// ANNONCER LA RÉUSSITE DE CRÉATION DU DOCUMENT
 var ui = SpreadsheetApp.getUi();
 ui.alert('Well done\n\nLe devis '+ docId +' a bien été créé\nIl porte le nom : '+docName+'\n\nLe lien a été ajouté dans la GED.');

Code complet

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu("GED");
   menu.addItem("Enregistrer le PDF ↓ ","savePDF");
   menu.addToUi();
}
function savePDF()
{
 // SÉLECTIONNER LA FEUILLE A SAUVEGARDER
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
//URL de SS ?
    var ssUrl = ss.getUrl();
    var sheetId= sheet.getSheetId();
    var url = ssUrl.replace(/\/edit.*$/,'')
      + '/export?exportformat=pdf&format=pdf'
      + '&size=LETTER'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=0.50'
      + '&bottom_margin=0.50'
      + '&left_margin=0.50'
      + '&right_margin=0.50'
      + '&sheetnames=false'
      + '&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'
      + '&gid='+sheetId;
// RÉCOLTER LES INFORMATIONS DANS LE SHEET POUR COMPOSER LE NOM DU DOCUMENT
  var docId = sheet.getRange('B2').getValue();
  var clientName =  sheet.getRange('C3').getValue();
  var docDate = sheet.getRange('D2').getValue();
  //mise en forme de la date : mois-annee
  var docDateMMYY = (docDate.getMonth()+1)+"-"+docDate.getFullYear();
  // Concaténons le tout
  var docName = docId+"_DEVIS_10Zaine_"+clientName+"_"+docDateMMYY ;
// CRÉER LE PDF A PARTIR DE L'URL
  var token = ScriptApp.getOAuthToken();
  var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' +  token } });
  var pdf = docurl.getAs('application/pdf').setName(docName);
  var file = DriveApp.createFile(pdf);
//  DEPLACER LE PDF DANS LE BON DOSSIER
 /*
   ATTENTION IL FAUT ADAPTER LE CODE AVEC L'ID DU FOLDER DE DESTINATION
   https://drive.google.com/open?id=XXXXXXXXXXXXXXXXXXXXXXXXXXX
  */
  var folder = DriveApp.getFolderById("XXXXXXXXXXXXXXXXXXXXXXXXXXX");
  var finalFile = file.moveTo(folder);
  //RÉCUPÉRER LE LIEN
     var docUrl = finalFile.getUrl();
//ajouter l'urL dans la GED.
    var sheetGed = ss.getSheetByName('GED');
    sheetGed.appendRow([new Date(),docId,docUrl,docName]);
// ANNONCER LA RÉUSSITE DE CRÉATION DU DOCUMENT
 var ui = SpreadsheetApp.getUi();
 ui.alert('Well done\n\nLe devis '+ docId +' a bien été créé\nIl porte le nom : '+docName+'\n\nLe lien a été ajouté dans la GED.');
}

Résultat final !

1. Affichez le devis à exporter et cliquez sur le bouton du menu.

2. En quelques secondes, le script se déroule. Un message vous avertit quand il est terminé.

3. Le fichier est créé dans le bon dossier !

4. les informations se sont ajoutées dans le tableau GED.


A vous de jouer en adaptant le code à votre besoin.

Ce n’est qu’un début, imaginons d’autres exploitations, comme :

  • enregistrer le document dans plusieurs dossiers (celui du client et celui du projet par exemple !) ;
  • gérer les versions de devis grâce à la table de GED !
  • créer un mail automatiquement adressé au client contenant le devis en pièce jointe ;
  • ajouter dans un Google Agenda la date d’envoi du devis !
  • déclencher la machine à café 🙂 (je rigole mais c’est surement possible !)

Faites-nous part de vos utilisations de ce script en laissant un commentaire !

Voir l’article suivant pour ouvrir le PDF automatiquement après sa création.

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

Articles similaires

  • Articles connexes
  • Plus de l'auteur

Rédacteur

Photo de profil de l'auteur
Antoine MARTIN

Consultant et formateur sur les outils bureautiques, j'ai intégré l'équipe de Numericoach en 2020. J'accompagne les utilisateurs de Google Workspace à trouver des solutions répondant à leurs besoins. Mes domaines de prédilections sont les outils Sheets, Docs, Slides et Google Apps Script.

S’abonner
Notification pour

5

Note du cours

(7)

(0)

(0)

(0)

(0)

118 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Thierry

Excellent article comme d’habitude !

chen

Bonjour,
Merci pour ce excellent article!!!!
Par contre, pour la partie docDateMMYY = docDate.getMonth()+ »-« +docDate.getFullYear();
j’ai toujours le mois qui n’affiche pas proprement, et j’ai remarqué dans votre articles aussi il se trouve le meme problème.
Je n’arrive pas trouver la raison pour laquel il ne peut pas prendre bien en compte le mois.
Pourriez-vous,svp, me guider un peu sur la-dessus ?
En vous remerciant par avance.
Cordialement,
Siji

chen

Bonjour Antoine,
Merci beaucoup pour votre retour!!
Justement j’ai pensé la même chose, mais je ne sais pas comment l’ajouter dans le code.
Pourriez-vous, svp, me montrer la macro pour ajouter 1 de plus ?
D’avance merci.
Cordialement,
Siji

chen

Superbe!! Merci bien!

MSI

Je reçois le message suivant : TypeError: docDate.getMonth is not a function

ANTOINE MARTIN

Bonjour MSI.
Merci pour votre témoignage.
Bonne année !

chen

Bonjour, j’ai une autre question, s’il vous plaît, est-ce que c’est faisable, en téléchargeant tant qu’un pdf, sélectionner qu’une zone, et pas l’onglet actif entier ? Si oui, pourriez-vous me guider un peu au niveau du code?
Merci d’avance.
Cordialement,
Siji

Gilbert

Bonjour,
c’est possible d’avoir une zone en ajoutant quelques paramètres
var url = ssUrl.replace(/\/edit.*$/, »)
+ ‘/export?exportformat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.50’
+ ‘&bottom_margin=0.50’
+ ‘&left_margin=0.50’
+ ‘&right_margin=0.50’
+ ‘&sheetnames=false’
+ ‘&printtitle=false’
+ ‘&pagenum=false’
+ ‘&gridlines=false’
+ ‘&fzr=FALSE’
+ ‘&r1=0&r2=10’
+ ‘&c1=0&c2=4’
+ ‘&gid=’+sheetId;
r1 = ligne de début de la zone
r2 = ligne de fin
c1 = colonne de début
c2 = colonne de fin
sachant que 0 correspond à 1
Salutations
Gilbert

MSI

Bonjour,
La zone est déterminée dans les lignes
+ ‘&r1=0&r2=10’
et
+ ‘&c1=0&c2=4’
J’aimerais que r2 soit récupéré dans la cellule I3 de la feuille.
Comment faire?

Gilbert

La zone est déterminée dans les lignes
+ ‘&r1=0&r2=10’ //soit 1 à 9
+ ‘&c1=0&c2=4’ //soit A à E
Soit ici la zone A1:E9
Pour avoir la zone A1:I3
+‘&r1=0&r2=2’ //soit 1 à 3
+‘&c1=0&c2=8’ //soit A à I
si c’es bien la demande

Antoine

Merci Gilbert !

TAA66

Bonjour
Merci beaucoup pour cet article !!! Top !!!
J’aimerais exporter en PDF mais seulement des cellules sélectionnées comme quand on sélectionne , que l’on fait imprimer et qu’on choisit « cellules sélectionnées » au lieu de la page entière.
Merci par avance

Sophie

Bonjour,
Merci beaucoup pour cet article et la clarté du script que j’ai pu facilement adapter à mon besoin du moment.
Il me reste un petit point que j’aimerais mettre en place, mais je bloque …
Est il possible que le pdf généré s’ouvre automatiquement dans un nouvel onglet du navigateur après sa création ?
Si vous pouviez m’éclairer sur la possibilité et la fonction à utiliser …
Merci beaucoup pour l’ensemble de vos contributions?
Sophie

jamie

J’appel ça de la magie.
Tout fonctionne mais 2 questions. Est-ce possible de copie LURL (De la GED) mais dans un autre classeur Sheets pour Archivage ?
Et eviter de copier le PDF dans le fichier Drive avec des doublons de titre ?
Merci

Test ujack

Bonjour MARTIN,
2 ans après, merci pour ce code qui m’est fort utile.
J’ai un petit soucis avec « Spreadsheetapp » qui est marqué non défini.
Je suppose que cela vient du fait qu’il faut « Crée une variable qui contient le spreadsheet que tu auras créé auparavant » , comment faire cela ?
Merci !

Test ujack

Ah et j’ai trouvé !
C’est « SpreadsheetApp » qu’il faut utiiser et non « Spreadsheetapp ».
J’espère que cela servira à d’autres !

Bonne journée

jamie

Merci du suivi.
J’ai réussi a copier les infos dans un autre classeur.
Pour les doublons c’est que je ne veux pas avoir plusieurs version du même devis. Dans mon cas, le script se déploie en cliquant. J’aimerais qu’il incrément un numéro (le suivant depuis le dernier clic). À noter que je débute avec les script mais que j’adore ça.

Descombes Thibault

Bonjour et merci pour cet excellent tuto
Est il possible que le fichier PDF s’ouvre tout seul.
Cordialement

Patakess

Bonjour et merci pour ce tuto très bon !
J’aurai voulu savoir si (soyons fou !) on pouvait creer un PDF avec trois onglet différents, chacun représentant une page du dit PDF ?

Patakess

Ah tient, d’ailleurs, en voulant ouvrir le PDF (que je n’avais pas fait avant, shame on me) je vois qu’il y a un… « petit » soucis à savoir que ca n’a pas enregistrer du tout la page en PDF mais la page d’identification google x)comment image

Patakess

J’ai résolu ce problème, pardon x)

loutcho

Bonjour
Je suis confronter au même problème que vous, pourriez vous m’indiquer comment avez vous fait pour passer la page d’identification google x.
merci d’avance

Loutcho

Bonjour Antoine
Merci pour votre réponse rapide, Dsl mais je début sur Google Apps Script…
Votre script est ce qu’il me faut, dommage que je cale sur « Token » peut être un autre indice?
merci d’avance

Patakess

Bonjour,
Je vous remercie pour votre réponse. C’est ce que j’ai voulu faire en effet. Le soucis, c’est que je souhaites PDFiser un tableau contenant des formules faisant références à d’autres onglets. Le soucis c’est que du coup, les PDF sont justes une suite de #REF
Auriez vous une astuce miracle pour éviter ça svp ? 😀

Coline

Bonjour,
Cet article est génial, vous m’avez beaucoup aidé!
Cependant j’ai une petite question, est-ce possible de non pas enregistrer le PDF dans un dossier mais de simplement l’ouvrir pour n’avoir plus qu’a l’imprimer?
Et tout ceci en cliquant uniquement sur un bouton dans la feuille de calcul ?
Merci pour votre aide,
Cordialement,
Coline

Guilbert

Bonjour,
Merci pour ce script, c’est la première fois que j’effectue un script sur Google mais cela ne fonctionne pas. Je compile le script dans l’éditeur puis j’ouvre le fichier et j’appuie sur le bouton pour exporter au format PDF seulement voilà j’obtiens cette erreur :
Argument non valide : https://docs.google.com/spreadsheets/d/1buhhlJxWI0JZR1DiqLUnE-GorT40kVPz5jyJOPH6bc0/export?exportformat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.50&bottom_margin=0.50&left_margin=0.50&right_margin=0.50&sheetnames=false&printtitle=« TEST »&pagenum=false&gridlines=false&fzr=FALSE&gid=1441325003
Et je ne la comprends pas ! Merci par avance pour votre aide : )

Guilbert

Bonjour,
Merci pour votre réponse cela fonctionne correctement maintenant ! J’ai une seconde question : est-il possible de télécharger directement le pdf sur l’ordinateur plutôt que de la conserver dans drive ?
Merci

Lionel

Bonjour,
L’exécution du code me donne l’erreur suivante : TypeError: ss.getUrl is not a function
Pour autant je fais tourner d’autres macros sans pb.
Pouvez-vous m’aider?
Merci pour tous vos articles.
Cordialement

Lionel

Bonjour,
Désolé pour mon message précédent que vous pouvez supprimer…
La nuit porte conseil;) J’ai trouvé mon erreur (erreur de déclaration de la variable ss).
Votre script marche à merveille. Je vais pouvoir l’adapter à mon besoin.
Merci!

Lionel

Bonjour Antoine,
Le code fonctionnait parfaitement comme je l’indiquais dans mon précédent message mais depuis hier j’obtiens le message suivant au moment de l’appel à UrlFetchApp.fetch() :
Exception: Échec de la requête pour https://docs.google.com. Code renvoyé : 401. Réponse tronquée du serveur : Unauthorized Unauthorized Error 401 (Utilisez l’option muteHttpExceptions pour examiner la réponse entière.)
J’ai beau eu renouveler les permissions du script, je me retrouve toujours avec ce message d’erreur. Avez-vous une piste à me suggérer? Y a-t-il eu une modification dans la construction de l’URL? Rencontrez-vous ce même problème?
Cordialement,
Lionel

Lionel

Bonjour,
Après de longues heures de recherche sur le web et la lecture de nombreux articles (toujours moins bien rédigés que les vôtres ), j’ai enfin résolu l’erreur. Je livre ici pour tous une explication et la solution appliquée.
Unauthorized Error 401 provient bien d’un problème de permissions du script, ici la création d’un fichier sur Google Drive.
Dans mon objectif d’envoi par email du « fichier » PDF généré et non son enregistrement sur mon GDrive, j’ai supprimé du code la ligne :
var file = DriveApp.createFile(pdf); (ainsi d’ailleurs que le reste du code)
se faisant la permission pour l’API Google Drive (accès en lecture et écriture aux fichiers du drive de l’utilisateur) n’était plus demandée par mon script, qui générait alors l’erreur d’un accès non autorisé.
La seule solution que j’ai trouvée est de laisser cette ligne en commentaire ce qui a pour effet de générer tout de même la demande de permission pour l’API Google Drive! C’est bon à savoir.
//var file = DriveApp.createFile(pdf); suffit pour générer une demande de permission d’accès à gDrive
L’ajout de dépendances au projet dans le fichier appsscript.json n’a jamais eu pour effet la demande de permission attendue.
Y a-t-il un autre moyen de procéder que l’ajout de cette ligne en commentaire?
avec appsscript.json ou avec des ID clients OAuth 2.0 ?
Un article sur la gestion des ID et sur l’utilisation de console.cloud.google.com serait très apprécié à mon sens. Je n’ai rien trouvé sur le sujet.
Merci d’avance
Lionel

Arthur

Bonjour Antoine,
Tout d’abord je me suis lancé hier dans le script Sheets pour tenter de concurrencer une application qui tourne très bien sur VBA Excel, et votre article m’a été d’une grande aide !
J’ai pu réaliser ce qu’il me fallait (Enregistrer dans Drive en PDF plusieurs dizaines de pages).
Je trouve le script particulièrement lent pour exécuter la tâche, qui est faite en quelques millisecondes sous VBA, ce qui entraine deux erreurs dans Script :
La première : « Exception: Request failed for https://docs.google.com returned code 429. Truncated server response: <meta nam… (use muteHttpExceptions option to examine full response)"
que j'ai essayé de contourner après lecture dans d'autres forums par un Utilities.sleep(5000)
Ce qui amène à la deuxième "erreur" : malheureusement vu le volume de PDF que je génère, cela me fait dépasser la limite de temps de 6 minutes d'exécution d'un script sur Sheets (sans compte Gsuite).
Plutôt que de forcer pour allonger le temps d'exécution d'un script, savez-vous comment optimiser votre code pour que le PDF soit généré plus rapidement ?
Encore merci pour votre aide,

Antoine MARTIN

Bonjour Arthur, merci pour votre commentaire.
La question de la lenteur d’exécution d’un script coté serveur comparée à la vitesse d’une exécution côté client est centrale et m’a moi aussi interrogé, habitué aux codes plus rapides, même en ligne. je fais le max pour optimiser mais il y a des contraintes d’execution inévitables.
Un article est dans les cartons sur cette question.
Ma première recommandation serait d’agir par paquets, en regroupant les documents à créer.
a très vite

DJEEK

Bonjour,
J’utilise ce genre de script depuis presque 3 ans mais les PDF créés sont toujours assez lourds car je ne connais pas de PDF options pour diminuer la qualité des PDF.
Existe t il une option pour exporter les pdf avec un poids optimiser?

Simon

Bonsoir,
merci pour ce tuto il est juste top !
pour qu’il soit parfait il manquerait un tuto pour pouvoir envoyer par mail le pdf a l’intéressé via un petit script de votre confection ca serait magique !!!

Simon

Olala !! Merci beaucoup !!! vous etes au top 🙂 c’est super sympa !

Simon

Bonjour Antoine ,
merci pour votre aide et votre rapidité je vais essayer ca de ce pas !
je reviens vers vous pour vous donner des nouvelles 🙂
Bonne journée 🙂

Simon

Re !
Bien, Bien , Bien…
Que dire ….
Tout fonctionne a merveille je suis ravi !!!!!!!!
Mille mercis Antoine pour tous ces précieux conseils !!
J’aurais si ça t’ennuis pas une dernière petite requête 🙂
c’est donc par rapport a la GED ce coup la ^^
voila j’aimerai si cest possible sur une autre feuille de calcul faire un tableau de recherche en tapant le nom de mon client et lui ressortir uniquement ses facture devis ou autre dans le tableau .
Après ca promis je ne t’embetes plus hahhaha 🙂

Simon

Bonjour Antoine ,
merci pour ton aide j’ai réussi a faire quelque chose de sympa 🙂
Encore mille mercis a très vite !

Jade

Bonjour,
Je pensais avoir tout suivi comme il fallait, mais je retrouve avec ce message d’erreur :
Exception: Échec de la requête pour https://docs.google.com. Code renvoyé : 400. Réponse tronquée du serveur : <meta nam… (Utilisez l'option muteHttpExceptions pour examiner la réponse entière.)
Pouvez-vous m'aider ?
Merci

Antoine MARTIN

bonjour Jade, ce message d’erreur indique un probleme au niveau de la construction de l’URL du PDF .
Assurez-vous que cette partie est correctement écrite dans votre script : //URL de SS ?
var ssUrl = ss.getUrl();
var sheetId= sheet.getSheetId();
var url = ssUrl.replace(/\/edit.*$/, »)
+ ‘/export?exportformat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.50’
+ ‘&bottom_margin=0.50’
+ ‘&left_margin=0.50’
+ ‘&right_margin=0.50’
+ ‘&sheetnames=false’
+ ‘&printtitle=false’
+ ‘&pagenum=false’
+ ‘&gridlines=false’
+ ‘&fzr=FALSE’
+ ‘&gid=’+sheetId;
// CRÉER LE PDF A PARTIR DE L’URL
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { ‘Authorization’: ‘Bearer ‘ + token } });
var pdf = docurl.getAs(‘application/pdf’);
et spécifiquement que la variable « sheetId » existe et correspond bien à
var sheetId= sheet.getSheetId();
et que vous avez bien généré un Token dans les dernières lignes.
Bonne journée et bonne continuation !

Patrick TELLIER

Bonjour Antoine, et un grand merci pour tes contributions qui nous font beaucoup avancer.
J’ai une petite amélioration à te proposer sur ce script qui évite de créer une copie du pdf généré pour la renommer ensuite et supprimer l’original (j’avais pleins de EXPORT.PDF dans la corbeille ;-()
On peut affecter le nom de fichier dès la création :
var pdf = docurl.getAs(‘application/pdf’).setName(docName);
Il faut dans ce cas intervertir les lignes pour déclarer docName avant la création du fichier.
Bonne journée

Cécile LE MASSON

Bonjour, j’aimerais appliquer votre idée, mais j’ai peur de faire une erreur… Pouvez-vous préciser quelle est la partie que je dois déplacer et à quel endroit je dois la mettre, s’il vous plaît ?
Et merci à l’auteur pour ce script, c’est top pour éditer les quittances de loyer à ma locataire (je n’ai pas encore essayé de compléter avec l’envoi automatique par mail, mais cela cela ne saurait tarder) !

Francis

Bonsoir,
merci pour ce tuto et les divers échanges.
Je souhaiterais simplment pouvoir imprimer une certaine zone, paramétrable dans une cellule (ex:. de B2;BA25..)
Qui pourrais me donner qq informations pour pouvoir intégrer ce choix.
merci

Antoine MARTIN

Bonjour Francis,
J’ai trouvé ces indications à ajouter dans la génération de l’URL :
// EXPORT RANGE OPTIONS FOR PDF
//need all the below to export a range
//gid=sheetId must be included. The first sheet will be 0. others will have a uniqe ID
//ir=false seems to be always false
//ic=false same as ir
//r1=Start Row number – 1 row 1 would be 0 , row 15 wold be 14
//c1=Start Column number – 1 column 1 would be 0, column 8 would be 7
//r2=End Row number
//c2=End Column number
Je vais tester et rédiger un article sur cette option.
sinon je proposerai de créer un onglet avec un import (=arrayformula(feuille!B2:BA25)) de la zone à imprimer et d’imprimer cet onglet … 🙂
Bonne journée

Francis

Bonjour Antoine,
Merci pour t’a réponse, je teste ça ce week-end
Bonne journée

Pauline G

Bonjour Antoine, Tout d’abord un immense merci pour cette aide précieuse. Est ce qu’il est possible d’adapter ce code pour un document en gdoc et non et gsheet ?
Merci par avance pour votre aide

Antoine MARTIN

Bonjour Pauline, Merci pour votre message.
Le code permet de créer un PDF pour un seul onglet de Sheets, si votre besoin est de générer un Google Docs complet, il suffit d’utiliser la méthode document.getAs(‘application/pdf’) … mais il faut gérer le remplissage du document depuis Sheets… Quel est le besoin précisément ?

Jimmy

Bonjour,
Excellent Tuto ! Merci beaucoup !
J’ai cependant un petit problème, lorsque j’exécute mon script sur google sheet j’ai une erreur :
TypeError: docurl.getAs(…).SetName is not a function
Je ne trouve pas mon erreur, est ce un problème d’import de modules?
Je te joins ton code que j’ai modifié.
Ça serait super si vous pouviez y jeter un coup d’oeil 🙂
Jimmy
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu(« GED »);
menu.addItem(« Enregistrer le PDF ↓ « , »savePDF »);
menu.addToUi();
}
function savePDF()
{
// SÉLECTIONNER LA FEUILLE A SAUVEGARDER
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//URL de SS ?
var ssUrl = ss.getUrl();
var sheetId= sheet.getSheetId();
var url = ssUrl.replace(/\/edit.*$/, »)
+ ‘/export?exportformat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.50’
+ ‘&bottom_margin=0.50’
+ ‘&left_margin=0.50’
+ ‘&right_margin=0.50’
+ ‘&sheetnames=false’
+ ‘&printtitle=false’
+ ‘&pagenum=false’
+ ‘&gridlines=false’
+ ‘&fzr=FALSE’
+ ‘&gid=’+sheetId;
// RÉCOLTER LES INFORMATIONS DANS LE SHEET POUR COMPOSER LE NOM DU DOCUMENT
var clientName = sheet.getRange(‘E7’).getValue();
var docDate = sheet.getRange(‘F3’).getValue();
// Concaténons le tout
var docName = « _Facture_EDUC13_ »+clientName ;
// CRÉER LE PDF A PARTIR DE L’URL
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { ‘Authorization’: ‘Bearer ‘ + token } });
var pdf1 = docurl.getAs(‘application/pdf’).SetName(« _Facture_EDUC13_ »+clientName);
;
var file = DriveApp.createFile(pdf1);
// DEPLACER LE PDF DANS LE BON DOSSIER
/*
ATTENTION IL FAUT ADAPTER LE CODE AVEC L’ID DU FOLDER DE DESTINATION
https://drive.google.com/open?id=XXXXXXXXXXXXXXXXXXXXXXXXXXX
*/
var folder = DriveApp.getFolderById(« 1lf67xbo3H3WD7Lywbb51pM_Hf7Af1-ix »);
var finalFile = file.moveTo(folder);
//RÉCUPÉRER LE LIEN
var docUrl = finalFile.getUrl();
// ANNONCER LA RÉUSSITE DE CRÉATION DU DOCUMENT
var ui = SpreadsheetApp.getUi();
ui.alert(‘Well done\n\nLa facture a bien été créée\n Elle porte le nom : ‘+docName);
///Envoie du mail
MailApp.sendEmail(sheet.getRange(‘E11’).getValue(), »Facture BDS », »Bonjour « +sheet.getRange(‘E7’).getValue()+ »\n Tu trouveras ci-joint ta facture du BDS \n\n »+docUrl+ »\n\n Sportivement, \n Le Bureau Des Sports »);
}

Clément

Bonjour à tous. Super article (comme d’hab !). Mais là ou cela se corse c’est quand on souhaite gerer les sauts de page dans le script. On peut faire des devis avec beaucoup plus d’articles ou des articles prenant un grand nombre de lignes et dans ce cas il faut des sauts de page… Perso je fais un devis sur plusieurs feuilles : 1 feuille pour les paramètres globaux : Date, Ref du devis, Nom du client, …
Une feuille pour la saisie des articles « au km »
Une plage qui fait les totaux, une autre pour les conditions générales de vente
Ensuite je regroupe le tout dans ma feuille de devis avec :
={Entete;indirect(articles);Totaux;CGV}
(Fichier en anglais donc le séparateur est « ; » (en fr je crois que c’est « \ » ))
Malheureusement je n’ai pas réussi à gerer la mise en page par script.. Ca fait des saut de page ou ça veut. Dommage (La classe pageBreak n’est semble t’il pas dispo sous sheets)
Une piste pour ce problème ?
Merci pour votre aide .

Clément

Bonjour Antoine.
Super idée . Ca marchera très bien ainsi ! Il ne me reste plus qu’à séparer les parties sur des onglets différents et c’est gagné. Pas si difficile AMHA. Pour info, le script n’imprime pas les feuilles masquées, et ça c’est une bonne nouvelle 🙂
Merci

caron

Bonjour,
Script plus que parfait par contre je me heurte à un problème j’aimerais envoyer par mail ma sheet à plusieurs contacts mais en bricolant je n y parviens pas …
Auriez vous une solution merci d’avance

Benoit

Bonjour,
Tout d’abord un grand merci pour cet article qui m’a permit d’écrire un bout de code qui fonctionne presque…
j’ai donc un soucis.
Il me semble que c’est ici que ça bloque :
// CRÉER LE PDF A PARTIR DE L’URL
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, {headers: {‘Authorization’ : ‘Bearer ‘ + token } });
var pdf = docurl.getAs(‘application/pdf’).setName(docName);;
var file = DriveApp.createFile(pdf);
sur le fetch()
voici le retour d’erreur:
Exception: Request failed for https://docs.google.com returned code 400. Truncated server response: <meta nam… (use muteHttpExceptions option to examine full response)
si je supprime ou mets en commentaire comme suit :
var docurl = UrlFetchApp.fetch(url /*, {headers: {'Authorization' : 'Bearer ' + token } }*/ );
le script s'achève mais le pdf contient la page d'identification…
et là je bloque…
je ne n'est pas réussi à comprendre comment doit être la syntaxe du headers.
Si vous auriez un peu de temps pour m'aiguiller.
Cordialement
Benoit

Boris

Bonjour,
Merci beaucoup pour cet article, le code fonctionne à merveille.
Un petit complément qui serait vraiment super : Comment faire pour imprimer plusieurs onglets d’un seul clic ?
Merci merci merci !!

Boris

Merci beaucoup Antoine !

pierre

Bonsoir,
super tuto!! Par contre, dans l’onglet GED, je voudrais créer une autre tache (enregistrer le PDF des stats sur une autre feuille). J’ai réussis à faire apparaitre l’onglet PDF des stats, dans le GED, en copiant votre code une nouvelle fois à la suite du premier mais le code ne fonctionne pas. En effet il faut être sur la feuille dit « actif » pour pouvoir avoir le pdf s’enregistrer.
Est il possible de modifier votre code pour que cela fonctionne?
Je pense qu’il faut modifier ce passage:
// SÉLECTIONNER LA FEUILLE A SAUVEGARDER
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//URL de SS ?
var ssUrl = ss.getUrl();
var sheetId= sheet.getSheetId();
en mettant le nom de la feuille (ex: stat) Or j’ai un message d’erreur en début de code
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu(« GED »);
je suis débutant, pouvez vous m’aider s’il vous plait.
Un grand merci à vous

Antoine MARTIN

Bonjour Pierre, Désolé pour le retard de réponse.
Merci pour votre message, je n’ai pas bien compris la demande…
pouvez-vous reformuler ?

Coline Bui Xuan Loc

Bonjour,
Merci pour cet article.
Savez-vous s’il est possible de connaître le nombre total de pages du pdf ?
Pour ma part je dois inclure dans le pied de page le numéro de page ainsi que le nombre total.
Merci

Antoine MARTIN

Bonjour Coline,
essayez de passer en « true » l’argument « pagenum » dans la définition de l’URL :
var url = ssUrl.replace(/\/edit.*$/, »)
+ ‘/export?exportformat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.50’
+ ‘&bottom_margin=0.50’
+ ‘&left_margin=0.50’
+ ‘&right_margin=0.50’
+ ‘&sheetnames=false’
+ ‘&printtitle=false’
+ ‘&pagenum=true’
+ ‘&gridlines=false’
+ ‘&fzr=FALSE’
+ ‘&gid=’+sheetId;

Clément

Bonjour,
Merci beaucoup pour cet article!
Et il possible de n’enregistrer en PDF que certaines cellules selectionnées à la place de la feuille entière ? par exemple (A2:B2)
Si oui, comment puis-je adapter le spcrit ?
Merci

Antoine MARTIN

bonjour Clément
Je pense qu’il faut ajouter « &range=A2:B2″ à la fin de l’URL :
var url = ssUrl.replace(/\/edit.*$/, »)
+ ‘/export?exportformat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.50’
+ ‘&bottom_margin=0.50’
+ ‘&left_margin=0.50’
+ ‘&right_margin=0.50’
+ ‘&sheetnames=false’
+ ‘&printtitle=false’
+ ‘&pagenum=false’
+ ‘&gridlines=false’
+ ‘&fzr=FALSE’
+ ‘&gid=’+sheetId
+’&range=A2:B2’;

Clément

Effectivement ça fonctionne! Merci beaucoup c’est super.

Plop

Bonjour o/
Merci pour ce tuto très pratique :). Je l’ai adapté pour mon cas mais je bloque sur l’ajout d’un pied de page. J’ai beau explorer la doc de google script, je ne trouve pas (sauf sur un document google doc). Est-ce simplement possible ou bien dois-je abandonner cette idée ?
Merci d’avance 🙂

Antoine MARTIN

Bonjour Plop.
A ma connaissance, Le seul pied de page possible à mettre pour l’instant est celui de Sheet qui n’offre pas beaucoup de possibilité.

samuel frenette

Bonjour je suis nouveau dans le monde apps script j’aimerai mieux comprend vos explications des emplacement des lien, car je ne sais pas si c’est moi qui a la tête dans les nuage mais ca ma l’aire si simple mais je ne sais pas ou inséré mes lien …. Est-ce-que par le fait même de télécharger un nouveau PDF est ce que ceci va créée un document docs qui faudrait que je surprime manuellement?

samuel frenette

Erreur
TypeError: docDate.getMonth is not a function
savePDF Code.gs:46???

Bram's

Trés utile,
Merci Antoine 🙂

Antoine MARTIN

merci Bram’s

Erwin

Excellent article merci beaucoup !
Je suis découvre app script et je me demandais s’il est possible de faire en sorte que le PDF généré contienne des liens cliquables ?
La sheet que je transforme en PDF, il y a des liens. Mais lors de la conversion ces derniers ne sont plus cliquables sur le PDF.
Merci pour votre aide
Mer

Antoine MARTIN

Merci pour le message !
Je n’ai jamais testé mais j’aurai pensé que les liens seraient conservés dans le PDF. désolé de ne pas pouvoir plus aider.

Geoffroy

Bonjour
Merci infiniment pour votre partage. C’est hyper clair, vous partager le file, un grand bravo !!!

delphine
Votre note :
     

Bonjour, j’ai ce message d’erreur : Exception: Invalid argument: https://docs.google.com/spreadsheets/d/100IGVYJme79OJ08Ep8ud8iXiL2mpa6fwiqmIj7v7B9I/export?exportformat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.50&bottom_margin=0.50&left_margin=0.50&right_margin=0.50&sheetnames=false&printtitle=« TEST »&pagenum=false&gridlines=false&fzr=FALSE&gid=1478252375

Pouvez-vous m’aider svp?

Geoffroy VERZEAUX
Votre note :
     

Bonjour
Bravo et merci pour ce tuto. Il fonctionne à merveille. J’ai cependant un challenge à élucider. Lorsque j’envoie le lien vers le PDF créé par la macro, la personne qui reçoit le lien doit obligatoirement me demander une autorisation d’accès avant de pouvoir consulter le PDF. Y a-t-il un moyen de gérer les droits à la création du PDF ?
Bonne fêtes de fin d’année !

Antoine+MARTIN

Bonjour Geoffroy, vous pouvez partager le fichier dans le script en ajoutant une instruction au moment de la création du fichier :
var file = DriveApp.createFile(pdf);
==>
var file = DriveApp.createFile(pdf).addEditor(clientEmail)
ou user est l’adresse mail de votre destinataire.
Il faudrait que l’adresse mail apparaisse sur la facture pour la récupérer dynamiquement de même que le script récupérer le nom du fournisseur ici :

var clientName = sheet.getRange(‘C3’).getValue();
il faudrait un

var clientEmail = sheet.getRange(‘??’).getValue();

est-ce que cela répond à votre demande ?

Ricalens K
Votre note :
     

Bonjour Antoine, Grand merci ! j’ai téléchargé les fichiers pour les tester avant de les adapter mais j’ai une erreur lors de la génération du pdf : Exception: Une erreur inattendue s’est produite lors de l’application de la méthode ou de la propriété getFolderById sur l’objet DriveApp.
j’ai pourtant bien créé un dossier DEVIS et renseigné l’ID du dossier

Karine Ricalens

Désolée. J’ai résolu mon pb mais j’en ai un autre. Le fichier pdf exporté renvoie sur une page de connexion google

export.jpg
Jennyfer Delage

Bonjour,

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
À tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

À bientôt,

Jennyfer

Kévin Gloaguen
Votre note :
     

Bonsoir,

Tout d’abord merci pour tout cela!!!

J’ai tenté de mettre en oeuvre le script mais je me retrouve avec ce message d’erreur.

ErreurException: Invalid argument: https://docs.google.com/spreadsheets/d/1g8QQiLE7MyYeG3QJutrg7Nj1wvDDTlkUU6jBuezYLh0/export?exportformat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.50&bottom_margin=0.50&left_margin=0.50&right_margin=0.50&sheetnames=false&printtitle=« TEST »&pagenum=false&gridlines=false&fzr=FALSE&gid=960256940
savePDF BOUTON PDF.gs:43

La ligne 43 correspond à cela :
var docurl = UrlFetchApp.fetch(url, { headers: { ‘Authorization’‘Bearer ‘ +  token } });

Avez-vous une solution pour résoudre cela ? Merci d’avance pour votre retour.

Antoine+MARTIN

Bonjour Kévin, Le message d’erreur indique que l’URL générée n’est pas valide :
 https://docs.google.com/spreadsheets/d/1g8QQiLE7MyYeG3QJutrg7Nj1wvDDTlkUU6jBuezYLh0/export?exportformat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.50&bottom_margin=0.50&left_margin=0.50&right_margin=0.50&sheetnames=false&printtitle=« TEST »&pagenum=false&gridlines=false&fzr=FALSE&gid=960256940

je pense que le printtitle=« TEST » pose probleme, il faut mettre printtitle=true ou printtitle=false.

Bonne continuation

Thierry Vanoffe

Bonjour,

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
A tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

A bientôt,

Thierry

laurent pécourt
Votre note :
     

Bonjour, je découvre Numériblog, étant à la recherche d’une solution pour envoyer un PDF à partir d’une feuille sheet, ma recherche m’a amené chez vous. Super boulot… J’ai une petite demande miantenant, j’essaye d’adapter votre script pour mon travail, mais je bloque… Evidemment sinon je ne poserais pas de question… Pourriez vous m’expliquer, j’ai une feuille sheet ou il y a un client de renseigné, une date de préstation, un nom, une adresse, un mail et je bloque sur une erreur que je n’arrive pas à corriger : « Exception: Une erreur inattendue s’est produite lors de l’application de la méthode ou de la propriété getFolderById sur l’objet DriveApp. » Pourriez-vous, s’il vous plait, m’aider ? Merci et encore une fois bravo, je vais parcourir tous vos tutos… Laurent

Antoine+MARTIN

Bonjour Laurent, l’erreur indique un problème dans l’ID du dossier qui doit accueillir votre PDF sur votre Drive.

/* ATTENTION IL FAUT ADAPTER LE CODE AVEC L’ID DU FOLDER DE DESTINATION https://drive.google.com/open?id=XXXXXXXXXXXXXXXXXXXXXXXXXXX */
var folder = DriveApp.getFolderById(« XXXXXXXXXXXXXXXXXXXXXXXXXXX »);

Avez vous bien indiqué l’ID de votre dossier à la place des XXX et entre guillemets ?
Est-ce que vous avez bien accés en écriture à ce dossier ?
Bonne continuation !

Thierry Vanoffe

Bonjour Laurent,

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
A tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

A bientôt,

Thierry

Sophie Alram
Votre note :
     

Bonjour,
Un grand merci pour ce tuto !
Sauriez-vous comment remplacer getMonth() qui ne fonctionne plus pour afficher la date du devis dans le nom du document de la GED?
Bien à vous,
Sophie

Sophie Alram

J’ai trouvé finalement:
var docDateDDMMYY = sheet.getRange(‘B9’).getDisplayValue();
var docName = docId+« _Facture_ »+clientName+« _ »+clientChantier+« -« +docDateDDMMYY;

Thierry Vanoffe

Bonjour Sophie,

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
A tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

A bientôt,

Thierry

Pierre
Votre note :
     

Bonjour
Je trouve le script super et l’article hyper clair… merci beaucoup

malgré plusieurs essais, je bloque sur cette erreur : « Exception: Cannot call SpreadsheetApp.getUi() from this context.
onOpen onOpen.gs:2« 

Est ce que quelqu’un peut m’aider s’il vous plait?

Merci beaucoup!!

Thierry Vanoffe

Bonjour Pierre

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
A tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

A bientôt,

Thierry

Thierry Vanoffe

Bonjour Pierre,

Merci pour cette question pertinente.
Afin d’avoir une réponse rapide, je t’invite à poser cette question sur notre nouveau forum : NUM AGORA.
En effet, cet espace gratuit permet de poser des questions et de profiter de centaines de membres pour y répondre.
A tout de suite sur : https://forum.thierryvanoffe.com/ de préférence dans la bonne rubrique !
Ne pas oublier de mettre le lien de l’article en question et un copier-coller de cette question.

A bientôt,

Thierry