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 […]
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.
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
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 :
//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 connexes
- Plus de l'auteur
5
Note du cours
(7)
(0)
(0)
(0)
(0)
Excellent article comme d’habitude !
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
Bonjour Chen, Merci beaucoup.
date.getMonth() renvoie effectivement le mois à partir de 0 ! il faut ajouter 1 pour obtenir le bon numéro 🙂
Merci de l’avoir signalé.
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
J’avais mi à jour le code dans l’article :
//mise en forme de la date : mois-annee
var docDateMMYY = (docDate.getMonth()+1)+ »-« +docDate.getFullYear();
Superbe!! Merci bien!
Je reçois le message suivant : TypeError: docDate.getMonth is not a function
Bonjour MSI.
Merci pour votre témoignage.
Bonne année !
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
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
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?
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
Merci Gilbert !
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
Bonjour, pour imprimer la plage de cellule sélectionnée, il faut récupérer les coordonnées avec getActiveRange(); puis récupérer les premières et dernières lignes et colonnes et les ajouter dans le code proposés par Gilbert dans le commentaire ci-dessous.
Faites nous partager votre code si vous y êtes arrivés : 🙂
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
Bonjour Sophie,
incroyable je viens d’avoir le même besoin concret : ouvrir automatiquement un document que le script a créé.
La question est simple mais la réponse un peu plus complexe. en gras il faut ouvrir un modal dans lequel un script coté client peut déclencher l’ouverture d’un lien automatiquement.
Il fera l’objet d’un article prochainement. 🙂
Antoine
Bonjour Sophie, voici enfin la réponse à votre demande : https://thierryvanoffe.com/google-sheets-google-apps-script-ouvrir-un-fichier-automatiquement-apres-lavoir-cree/ (a paraitre le 9/02/2021 !:)
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
Bonjour, Jamie ! c’est plus un prénom scientifique que magique 🙂 (cf C’est pas Sorcier !)
tu peux copier l’URL dans un autre SpreadSheet :
Crée une variable qui contient le spreadsheet que tu auras créé auparavant et ajoute-la dans le code suivant :
//ajouter l’urL dans la GED.
const ssGed = Spreadsheetapp.openById(« ID_DU_SS_GED »);
const sheetGed = ssGed.getSheetByName(‘GED’);
sheetGed.appendRow([new Date(),docId,docUrl,docName]);
:
Pour éviter les doublons, c’est plus complexe; il faudrait préciser le besoin.
bonne journée.
Bonjour @Antoine MARTIN 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 !
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
Bien vu Test Ujak ! ce genre d’erreur arrive souvent. soyons vigilants sur la casse 🙂 Bonne continuation !
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.
Ok, donc à chaque création de PDF il faudrait créer un numéro unique ?
il y a plusieurs possibilités, je préconise d »ajouter une colonne qui référence tous tes PDF et qui poste un numero qui s’incrémente à chaque fois. Pour trouver le numéro à écrire, je me sers d’une cellule qui contient la valeur max de cette colonne, je la récupère dans le script au moment de la création du PDF et j’y ajoute 1.
pour obtenir une aide plus ciblées, tu peux voir ici : https://school.numericoach.fr/
Bonne soirée.
Bonjour et merci pour cet excellent tuto
Est il possible que le fichier PDF s’ouvre tout seul.
Cordialement
Bonjour Thibault,
Promis juré je rédige ce week-end l’article sur cette question déjà évoquée. Bonne journée !
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 ?
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)
J’ai résolu ce problème, pardon x)
Bonjour, merci pour vos messages. la réponse est dans l’article 🙂
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
Bonjour, il faut bien respecter la phase de token :
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(url, { headers: { ‘Authorization’: ‘Bearer ‘ + token } });
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
Bonjour, Je préconise de produire une SpreadSheet temporaire, y copier les 3 onglets désirés, le transformer en PDF et supprimer le SpreadSheet temporaire. si besoin je pourrai le présenter en article.
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 ? 😀
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
Bonjour et merci pour votre message ! Vous trouverez votre réponse dans l’article suivant : https://thierryvanoffe.com/?p=24290 (à paraitre le 9/02/2021)
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 : )
Bonjour. Apparemment l’argument passé en printtitle entraine une erreur, la présence des « » doit y être pour quelquechose.
essayez de retirer les guillemets pour obtenir cela :
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
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
Bonjour Guilbert, pas évident d’envoyer un fichier en local directement sur le PC, et je ne le conseille pas d’une façon générale… le stockage en local est dépréciée par rapport au stockage en ligne. Mais vous pouvez synchroniser le Drive avec le disque dur de votre ordi en installant « Google Drive pour ordinateur » : https://support.google.com/a/answer/7491144?hl=fr
Bonne journée !
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
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!
Bonjour merci pour votre retour. J’allai répondre dans ce sens, l’erreur renvoie souvent à un problème de déclaration de variables. je laisse les messages cela peut aiguiller d’autres utilisateurs ;
Bonne journée 🙂
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
Bonjour, peut-etre un probleme de syntaxe d’URL ? est-ce que le sheets a été mis à la corbeille ? ou dans une Drive Partagés ? difficile de trouver une solution de loin .
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
Merci Lionel pour ton partage !
Je n’ai pas de réponses à ta question pour l’instant. Étonnant qu’un code en commentaire puisse débloquer la situation ! ?
bonne continuation !
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,
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
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?
Bonjour Djeek. je ne connais pas le moyen de diminuer le poids d’un PDF via cette méthode. il faudrait prospecter sur le pourquoi du poids. est-ce qu’il y a des images ? sont elles optimisées ? Merci pour vos retours;
Antoine
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 !!!
Bonjour Simon ! Merci pour le message. c’est demandé si gentiment que je vais le faire ! 🙂
Olala !! Merci beaucoup !!! vous etes au top 🙂 c’est super sympa !
Simon voici 3 lignes à ajouter dans le code, avant l’annonce de la réussite du script. Attention, il faut ajouter l’adresse mail du client dans le devis (ici je l’ai mise en C7. Tu peux refaire une copie du fichier mis à jour https://docs.google.com/spreadsheets/d/11WAZNqX2GjKi-LZw1slacNKr2RcLDX5J6yA6M6Iwdas/copy
// envoyer le document au client
const clientEmail = sheet.getRange(‘C7’).getValue();
const message = « Bonjour »+ »
Veuillez trouver ci-joint le devis « +docName+ »
« + »Cliquez ici pour ouvrir le devis.« ;
MailApp.sendEmail({to:clientEmail , subject: « Votre devis « +docName, htmlBody:message}) ;
Bonne journée.
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 🙂
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 🙂
Bonjour Simon, pour afficher les devis de chaque client en fonction d’une information donnée dans une cellule, je te propose de : 1 afficher dans la GED le nom du client en fonction du Num de devis, 2 créer une feuille avec une liste déroulante des clients ayant un devis et un Query qui affiche les devis en question. Voici ce que ça donne sur le fichier exemple : https://docs.google.com/spreadsheets/d/11WAZNqX2GjKi-LZw1slacNKr2RcLDX5J6yA6M6Iwdas/copy
Bonjour Antoine ,
merci pour ton aide j’ai réussi a faire quelque chose de sympa 🙂
Encore mille mercis a très vite !
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
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 !
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
Bonjour Patrick, merci pour cette amélioration ! ça fait plaisir de voir le code évoluer.
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) !
Bonjour Cécile, Merci pour votre message. J’ai mis à jour l’article pour éviter la suppression du fichier originale, action inutile efectivement car il suffit de le déplacer dans le bon dossier. erreur de débutant 🙂 Merci à Patrick pour cette amélioration.
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
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
Bonjour Antoine,
Merci pour t’a réponse, je teste ça ce week-end
Bonne journée
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
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 ?
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 »);
}
Bonjour, il faut écrire setName() sans le S majuscule 🙂 j’ai corrigé dans l’article . Merci de me l’avoir signalé.
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 .
Bonjour Clément,
Merci pour ton message !
Effectivement la gestion des sauts de pages de Sheets à PDF n’est pas prise en charge, à ma connaissance.
pour répondre à ce besoin déjà rencontré, je préconise de mettre les différentes parties dans un fichier Sheets dédié et de faire un onglet par page, l’export en PDF sautera une page à chaque onglet, en utilisant getAs(« PDF ») au lieu de l’URL PDF.
Ou alors d’utiliser DocumentsApp…
Mais c’est un besoin très complexe à gérer pour obtenir une mise en page propre.
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
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
bonjour et merci pour le message. Qu’entendez-vous par « envoyer par mail ma sheet » ? est-ce qu’il s’agit de partager la feuille de calcul ? d’envoyer le PDF directement ? Numericocha propose des coaching par heure pour un accompagnement personnalisé. N’hésitez pas : https://school.numericoach.fr/1h-de-coaching-g-suite
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
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 !!
Bonjour Boris,
bonne question, mais un peu longue à développer. j’en ferai un nouvel article 🙂
Merci beaucoup Antoine !
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
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 ?
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
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;
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
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’;
Effectivement ça fonctionne! Merci beaucoup c’est super.
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 🙂
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é.
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?
Erreur
TypeError: docDate.getMonth is not a function
savePDF @حسن الحسن تمياس Code.gs:46???
Trés utile,
Merci Antoine 🙂
merci Bram’s
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
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.
Bonjour
Merci infiniment pour votre partage. C’est hyper clair, vous partager le file, un grand bravo !!!
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?
bonjour Delphine,
il faut retirer les « » dans l’URL au niveau de printtitle :
&printtitle=« TEST » à remplacer par &printtitle=false ou &printtitle=true selon le besoin d’imprimer ou pas le titre dans le PDF.
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 !
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 ?
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
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
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
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.
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
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
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
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 !
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
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
J’ai trouvé finalement:
var docDateDDMMYY = sheet.getRange(‘B9’).getDisplayValue();
var docName = docId+« _Facture_ »+clientName+« _ »+clientChantier+« -« +docDateDDMMYY;
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
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!!
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
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