Script pour télécharger la feuille voulue en PDF
Bonjour à tous,
Je cherche à faire un script qui me permettrait :
1. de créer un fichier .PDF à partir d'une feuille "Planning"
2. de télécharger ce PDF directement sur mon ordinateur
Pour lancer ce script, je compte mettre un bouton.
Dans mes recherches, j'ai trouvé deux scripts qui se rapprocheraient :
- le 1er vient de ce forum (lien inactif pour moi pour le moment) et permet d'envoyer le fichier PDF par mail :
function envoiCopieFeuillePDF() {
DocumentApp.getActiveDocument();
DriveApp.getFiles();
// variables
const doc = SpreadsheetApp.getActive();
const docID = '________mettre_ici_l_ID___du___fichier_____________';
const feuilleID = '__ID_feuille__';
const email = '___email_destinataire____;
const dossier = DriveApp.getFolderById('__________ID_du_dossier______________');
const d = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd")
const fichier = '____nom___du___fichier____suivi_ici_de_sa_date____________' + "_" + d + ".pdf"
const objet = 'Test pdf';
const corps = "Veuillez trouver ci-joint ...";
// Création du fichier pdf
const url = 'https://docs.google.com/spreadsheets/d/' + docID + '/export?';
const exportOptions =
'exportFormat=pdf&format=pdf' +
'&size=A4' +
'&portrait=true' + // orientation portrait, false pour paysage
'&fitw=false' + // pas d'ajustement en largeur
'&sheetnames=false&printtitle=false' + // pas de nom ni de titre à l'impression
'&pagenumbers=false&gridlines=false' + // pas de numérotation, pas de grille
'&fzr=false' + // frozen rows = pas de répétition de l'en-tête
'&gid=' + feuilleID;
var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();
// Envoi email avec fichier attaché
GmailApp.sendEmail(email, objet, corps, {
htmlBody: corps,
attachments: [{
fileName: fichier,
content: reponse.getBytes(),
mimeType: "application/pdf"
}]
});
// Sauvegarde du fichier.
dossier.createFile(reponse.setName(fichier));
} - le deuxième vient de Dr-Bracket et permet de télécharger un fichier : ce code est en deux parties gs et html :
Code GS:
// Runs when the spreadsheet starts, adds a tab at the top
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Script Menu')
.addItem('Download a file!', 'dlFile')
.addToUi();
}
// Run when you click "Download a file!"
function dlFile() {
let file = DriveApp.getRootFolder().createFile('Hi.txt', 'Hello, world!');
// Create little HTML popup with the URL of the download. Added filename to object. ~~~~~~~~~~~
let htmlTemplate = HtmlService.createTemplateFromFile('Download.html');
htmlTemplate.dataFromServerTemplate = { url: file.getDownloadUrl(), name: file.getName() };
let html = htmlTemplate
.evaluate()
.setWidth(400)
.setHeight(300);
SpreadsheetApp.getUi()
.showModalDialog(html, 'Download');
};
// Added the following to satisfy the withSuccessHandler method: ~~~~~~~~~~~~~
function createDownloadUrl(data) {
return {
url: data.url,
name: data.name,
};
}Code HTML :
<!DOCTYPE html>
<html>
<head>
<script>
let data = <?!= JSON.stringify(dataFromServerTemplate) ?>; // Stores the data directly in
// the javascript code
function downloadFile() {
const dlBtn = document.getElementById("dlBtn");
dlBtn.innerText = "Downloading..";
// window.open(data.url);
// Replaced with:
// the url and name variables will be returned here from the
// code.gs function createDownloadEvent() after it runs successfully.
google.script.run
.withSuccessHandler(({ url, name }) => {
const a = document.createElement("a");
document.body.appendChild(a);
a.download = name;
a.href = url;
a.target = "_blank";
a.click();
})
.createDownloadEvent(data);
dlBtn.disabled = true;
}
</script>
</head>
<body>
<button id="dlBtn" onclick="downloadFile()">Download</button>
</body>
</html>Je cherche donc à faire une combinaison de ces deux solutions afin d'arriver à mes fins.
(Je n'ai pas besoin des boites de dialogues qui alourdissent le code).
Si quelqu'un peut m'aider ?
Bonjour,
un seul fichier gs
function savePDFonComputer() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getActiveSheet()
const type = 'pdf'
const mimeTypes = { pdf: MimeType.PDF };
const name = sh.getName() + '.pdf'
const url = "https://docs.google.com/a/mydomain.org/spreadsheets/d/" + ss.getId() + "/export?exportFormat=pdf&gid=" + sh.getSheetId() + "&access_token=" + ScriptApp.getOAuthToken();
const blob = UrlFetchApp.fetch(url).getBlob().setName(name);
const infoHtml = {
data: `data:${mimeTypes[type]};base64,` + Utilities.base64Encode(blob.getBytes()),
filename: `${name}`,
};
const html = HtmlService.createHtmlOutput(`<a href="${infoHtml.data}" download="${infoHtml.filename}">${infoHtml.filename}</a>`)
.setWidth(420).setHeight(100);
SpreadsheetApp.getUi().showModalDialog(html, "Download your file ...")
}il faudra juste cliquer sur le lien proposé
Bonjour Steeson,
Script court et très pratique.
Je vous remercie !
Je voudrais par l'intermédiaire mettre un style au ModalDialogue Box pour y mettre un bouton Download sans pour autant montrer le nom du fichier.
Ca donnerai quelque chose de ce style :
J'ai créé un script .html en suivi le tuto : https://www.sheets-pratique.com/fr/codes/sidebar
Une solution ?
Un bouton, je ne sais pas faire simplement dans ce cas, c'est un peu plus compliqué, mais si tu ne veux pas faire apparaître le nom du fichier change cette instruction
const html = HtmlService.createHtmlOutput(`<a href="${infoHtml.data}" download="${infoHtml.filename}">DOWNLOAD</a>`)en fait, pour faire simple, j'utilise l'attribut download , voir ici https://developer.mozilla.org/fr/docs/Web/HTML/Element/a qui ne concerne que la balise <a> et pas un bouton, voilà pourquoi ce serait plus complexe in fine
Merci beaucoup pour ces précisions :)