Création PDF automatique dans Google drive puis envoi par mail
Bonjour je suis débutant dans l'automatisation et j'ai besoin d'aide, voilà je souhaiterais à partir d'un PDF créer dans Google Drive l'envoyer par mail automatiquement j'ai créé une base de script qui me crée le PDF dans Drive mais après je n'arrive pas à trouver de script pour envoyer mon PDF par mail automatiquement si vous avez la solution je suis preneur merci.
voilà mon script
function onOpen() {
// Trigger function that runs when the spreadsheet is opened
var ui = SpreadsheetApp.getUi();
// Creates a custom menu named "Print Invoices"
ui.createMenu('PDF FACTURE')
// Adds a menu item "Print All Invoices" that calls the function "PrintToPDF"
.addItem('ALL Facture PDF', 'PrintToPDF')
// Adds a menu item "Select Invoices to Print" that calls the function "promptUserToSelectInvoices"
.addItem('Select Facture PDF', 'promptUserToSelectInvoices')
.addToUi();
}
function PrintToPDF() {
var spreadsheet = SpreadsheetApp.getActive();
var databaseSheet = spreadsheet.getSheetByName('Base de données');
var invoiceSheet = spreadsheet.getSheetByName('Facture');
var dataRange = databaseSheet.getRange(2, 1, databaseSheet.getLastRow() -1, 1);
var data = dataRange.getValues();
for (var i = 0; i < data.length; i++) {
var valueToPrint = data[i][0];
invoiceSheet.getRange('F12').setValue(valueToPrint);
var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?';
var params = {
exportFormat: 'pdf',
format: 'pdf',
size: 'letter',
portrait: 'true',
fitw: 'true',
sheetnames: 'false',
printtitle: 'false',
top_margin: 0,
bottom_margin: 0,
left_margin: 0,
right_margin: 0,
gid: invoiceSheet.getSheetId()
};
var range = invoiceSheet.getDataRange();
var rangeParam = '&range=' + range.getA1Notation();
url += getUrlParams(params) + rangeParam;
var backoffTime = 500;
var maxBackoffTime = 5000;
var attempts = 0;
var response;
while (true) {
try {
Utilities.sleep(backoffTime);
response = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
muteHttpExceptions: true
});
break; // Break out of the while loop if the request is successful
} catch (e) {
if (e.message.indexOf('Exception: Request failed for') === -1 || e.message.indexOf('returned code 429') === -1) {
throw e; // Throw an exception if it's not a 429 error
}
attempts++;
if (attempts >= 5) {
throw e; // If the maximum number of attempts is reached, throw an exception
}
backoffTime *= 2; // Exponential backoff
backoffTime = Math.min(backoffTime, maxBackoffTime); // Limit backoff time to maximum value
}
}
var fileName = 'Invoice_' + valueToPrint + '.pdf';
var downloadsFolder = DriveApp.getRootFolder().getFoldersByName('pdf_invoices').next();
var file = downloadsFolder.createFile(response.getBlob().setName(fileName));
var fileUrl = file.getUrl();
Logger.log('PDF file URL: ' + fileUrl);
}
}
function getUrlParams(params) {
var keys = Object.keys(params);
var query = '';
keys.forEach(function(key, index) {
query += key + '=' + params[key];
if (index < (keys.length - 1)) {
query += '&';
}
});
return query;
}
function promptUserToSelectInvoices(data) {
// Prompts the user to enter invoice numbers separated by commas
var selectedInvoices = [];
var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Select Invoices to Print', 'Enter the invoice numbers separated by commas:', ui.ButtonSet.OK_CANCEL);
if (response.getSelectedButton() === ui.Button.OK) {
var input = response.getResponseText().trim();
selectedInvoices = input.split(',').map(function(value) {
return value.trim();
});
// Calls the PrintSelectedToPDF() function with the selectedInvoices array
PrintSelectedToPDF(selectedInvoices);
}
}
function PrintSelectedToPDF(invoicesToPrint) {
var spreadsheet = SpreadsheetApp.getActive();
var databaseSheet = spreadsheet.getSheetByName('Base de données');
var invoiceSheet = spreadsheet.getSheetByName('Facture');
var dataRange = databaseSheet.getRange(2, 1, databaseSheet.getLastRow() -1, 1);
var data = dataRange.getValues();
for (var i = 0; i < data.length; i++) {
var valueToPrint = data[i][0];
// Check if invoicesToPrint is empty or includes the current invoice number
if (invoicesToPrint.length === 0 || invoicesToPrint.includes(valueToPrint)) {
invoiceSheet.getRange('F12').setValue(valueToPrint);
var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?';
var params = {
exportFormat: 'pdf',
format: 'pdf',
size: 'letter',
portrait: 'true',
fitw: 'true',
sheetnames: 'false',
printtitle: 'false',
top_margin: 0,
bottom_margin: 0,
left_margin: 0,
right_margin: 0,
gid: invoiceSheet.getSheetId()
};
var range = invoiceSheet.getDataRange();
var rangeParam = '&range=' + range.getA1Notation();
url += getUrlParams(params) + rangeParam;
var backoffTime = 500;
var maxBackoffTime = 5000;
var attempts = 0;
var response;
while (true) {
try {
Utilities.sleep(backoffTime);
response = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
muteHttpExceptions: true
});
break; // Break out of the while loop if the request is successful
} catch (e) {
if (e.message.indexOf('Exception: Request failed for') === -1 || e.message.indexOf('returned code 429') === -1) {
throw e; // Throw an exception if it's not a 429 error
}
attempts++;
if (attempts >= 5) {
throw e; // If the maximum number of attempts is reached, throw an exception
}
backoffTime *= 2; // Exponential backoff
backoffTime = Math.min(backoffTime, maxBackoffTime); // Limit backoff time to maximum value
}
}
var fileName = 'Invoice_' + valueToPrint + '.pdf';
var downloadsFolder = DriveApp.getRootFolder().getFoldersByName('pdf_invoices').next();
var file = downloadsFolder.createFile(response.getBlob().setName(fileName));
var fileUrl = file.getUrl();
Logger.log('PDF file URL: ' + fileUrl);
}
}
}P
Bonjour,
Voici un script clé en main réalisant cette tâche, vous avez juste à adapter quelques variables :
function savePDF()
{
// Selection de la feuille à PDFiser
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//générer URL de la feuille
var ssUrl = ss.getUrl();
var sheetId= sheet.getSheetId();
var url = ssUrl.replace(/\/edit.*$/,'') // ici sont indiquées les caractéristiques de l'impression PDF, il necessite d'adapter les marges, orientation en fonction de vos données.
+ '/export?exportformat=pdf&format=pdf'
+ '&size=A4'
+ '&portrait=true'
+ '&fitw=true'
+ '&top_margin=-0.95'
+ '&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éation du nom du PDF, dans mon cas une cellule située en A6, vous pouvez y mettre un nom directement, ou bien un autre celulle.
var docName = sheet.getRange('A6').getValue();
// 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);
// enregistrement du PDF dans le Drive
var folder = DriveApp.getFolderById("17LmzDRdzPpH3z_4ruLnGXbBWbQNo5");/* Important ! > Ici on doit mettre l'adresse du dossier drive où on veut sauvegarder le PDF, allez dans votre dossier et dans la barre d'URL en haut copier le code qui ressemble à ça : 0AGuVhN09TP00Uk9PVA */
var finalFile = file.moveTo(folder);
var docUrl = finalFile.getUrl();
// Envoi du PDF par mail
var demandeurEmail = sheet.getRange('F5').getValue(); /* ici l'adresse mail de mon destinataire se situe dans une cellule, il est possible de changer directement l'information, ou de mettre une autre cellule */
var message = "Bonjour"+"<p>Ci-joint le "+docName+"</p>"+"<a href='"+docUrl+"'>Cliquez ici pour ouvrir le recap.</a>"; // texte du mail
MailApp.sendEmail({to:demandeurEmail , subject: ""+docName, htmlBody:message}) ;
// facultatif, cela sert à confirmer à l'utilisateur que le mail à bien été envoyé
var demandeur = "Prénom NOM"; // nom du destinataire
var ui = SpreadsheetApp.getUi();
ui.alert("Le "+ docName +" a bien été créé\n et été envoyé à "+ demandeur +" ");
}
}Merci je test ça