Création et envoi PDF par mail

Bonjour,

Je tiens le bon bout, normalement c'est le dernier script qui me bloque et mon programme est finie et utilisable.

Je veux envoyer hebdomadairement et automatiquement un document en PDF de contrôle issu d'une feuille "CTL" par Mail. Je ne veux pas spécialement conserver le fichier PDF.

C'est pour une commune et non une entreprise, si je n'envoie pas ce document par mail, les conseillers n'iront pas le consulter directement dans le Drive.

CTL est créée grâce à d'autres feuilles et un Query avec conditions et j'utilise des MFC pour les couleurs. Elle s'auto met donc à jour toute seule comme une grande.

J'ai écrit un script pour créer mon PDF et l'envoi de mon mail. Je ne l'ai pas inventé, je ne suis pas assez douée pour ça, je suis partie de scripts existants soit sur ce site, soit sur d'autres et j'ai essayé d'adapter.

J'ai ensuite un déclencheur horaire pour le faire tourner tous les vendredis.

Tout fonctionne sauf que !!!

Quand j'ouvre ma pièce jointe (que je l'enregistre ou non sur mon ordi) j'ai ce message

Adobe Acrobat Reader ne peut pas ouvrir 220503-CTL.pdf car le type de ce fichier n'est pas pris en charge ou le fichier est endommagé (il a été envoyé en tant que pièce jointe et n'a pas été décodé correctement, par exemple).

J'ai essayé de l'ouvrir avec d'autres applications, rien ne fonctionne sauf "Application Windows Wordpad", mais le résultat n'est pas concluant, il y a seulement écrit "application/pdf" en haut de ma page.

Je pense qu'il y a un bug dans mon script que voici mais là je compte sur vos lumières, je cherche depuis trop longtemps et je comprends plus ce que je lis :

function Mail_CTL () {

    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.setActiveSheet(spreadsheet.getSheetByName('CTL'), true);
    var sheet = spreadsheet.getActiveSheet();
    let lastRow = sheet.getLastRow();

 // Mise en forme de CTL

  // Effacement bordures.    
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
      spreadsheet.getActiveRangeList().setBorder(false, false, false, false, false, false);

  // Création des bordures selon le nombre exact de lignes utilisées
      spreadsheet.getRange('A3:L'+lastRow).activate();
      spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
      spreadsheet.getRange('A3:L3').activate();
      spreadsheet.getActiveRangeList().setBorder(true, true, true, true, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID_THICK);  

  // Hauteur lignes
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
      spreadsheet.getActiveSheet().autoResizeRows(2, lastRow-1);

 //Préparation du PDF
    DocumentApp.getActiveDocument();
    DriveApp.getFiles();

  // variables
    const docID = '1Pgsyxiyei466-Ce5zJ-V5OsrW_XlZThuf2iX08siP-g';             //ID du document sheet
    const feuilleID = ' 501020824';                                           //ID de la feuille CTL 
    const email = 'albert.camus@gmail.com' + "," + 'victor.hugo@orange.fr' ;
    var docId = sheet.getRange('L2').getValue();
    var docName = docId+"-CTL";
    const fichier = docName + ".pdf"
    const objet = 'Rapport quotidien Réservations';
    const corps = texte

  // 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' +
      '&fitw=true' +
      '&top_margin=0.2' +              
      '&bottom_margin=0.5' +          
      '&left_margin=0.2' +             
      '&right_margin=0.2'+           
      '&sheetnames=false' +
      '&printtitle=false' +
      '&pagenum=false' +
      '&gridlines=false' +
      '&fzr=true' +
      '&gid='+feuilleID;
    var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};

 // Envoi email avec fichier attaché 
    MailApp.sendEmail(email, objet, corps, {
      htmlBody: corps,
      attachments: [{
        fileName:  fichier,
        content: (MimeType.PDF)}]});
} 

const texte = `
Bonjour,

Veuillez trouver en pièce jointe le rapport des réservations.

Merci de vérifier les actions à gérer.

Cordialement

Co 
`

Je préfère mettre le code ici même s'il est dans le document en lien car j'ai trouvé dommage lors de mes recherches sur internet de trouver des questions qui m'intéressaient mais la réponde était dans un fichier partagé qui n'existait plus.

Voici le lien de partage de mon fichier

https://docs.google.com/spreadsheets/d/1S44-csGvbNeYphl_NCy4livaQs5UWGR2VF9eu_RvXQc/edit?usp=sharing

Désolé Steelson, j'ai essayé de condenser et de faire moins long mais je ne sais pas faire… J'ai toujours été très mauvaise pour faire des résumés, même au lycée

Co

ceci date d'hier, cela peut t'aider ?

https://forum.excel-pratique.com/sheets/export-script-pdf-171336#p1062418

edit : en effet, j'ai la même difficulté que toi avec ton fichier !!

essaie avec ceci

var params = { method: "GET", headers: { "authorization": "Bearer " + ScriptApp.getOAuthToken() } };
  var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();
      GmailApp.sendEmail(email,objet,corps, {
      htmlBody: corps,
      attachments: [{
            fileName: fichier,
            content: reponse.getBytes(),
            mimeType: "application/pdf"
        }]
    });

edit : en effet, cela fonctionne avec cette modif

Déjà, merci pour ton aide,

Pour le premier lien, que tu m'as donné, je pense qu'il fait parti de ceux qui m'ont servi pour essayer de créer mon code

Ensuite, j'avais déjà testé la seconde méthode et ça me posait un problème d'où mes bidouilles.

Je viens de remettre et de retesté et ça me provoque toujours la même erreur :

Exception: Request failed for https://docs.google.com returned code 400. Truncated server response:

Sauv_CTL @ macros.gs:63

ligne 63 c'est

  var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();

Je n'ai pas réussi à comprendre de quoi il s'agit

Co

ceci fonctionne très bien

function Mail_CTL () {

    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.setActiveSheet(spreadsheet.getSheetByName('CTL'), true);
    var sheet = spreadsheet.getActiveSheet();
    let lastRow = sheet.getLastRow();

 // Mise en forme de CTL

  // Effacement bordures.    
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
      spreadsheet.getActiveRangeList().setBorder(false, false, false, false, false, false);

  // Création des bordures selon le nombre exact de lignes utilisées
      spreadsheet.getRange('A3:L'+lastRow).activate();
      spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
      spreadsheet.getRange('A3:L3').activate();
      spreadsheet.getActiveRangeList().setBorder(true, true, true, true, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID_THICK);  

  // Hauteur lignes
      sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
      spreadsheet.getActiveSheet().autoResizeRows(2, lastRow-1);

 //Préparation du PDF
    DocumentApp.getActiveDocument();
    DriveApp.getFiles();

  // variables
    const docID = '1CglYrHabEgpKrWXNsRiyhnaPGdd2DR_Hd380VaEQNik';             //ID du document sheet
    const feuilleID = '1605207877';                                           //ID de la feuille CTL 
    const email = 'xxxx@gmail.com' ;
    var docId = sheet.getRange('L2').getValue();
    var docName = docId+"-CTL";
    const fichier = docName + ".pdf"
    const objet = 'Rapport quotidien Réservations';
    const corps = texte

  // 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' +
      '&fitw=true' +
      '&top_margin=0.2' +              
      '&bottom_margin=0.5' +          
      '&left_margin=0.2' +             
      '&right_margin=0.2'+           
      '&sheetnames=false' +
      '&printtitle=false' +
      '&pagenum=false' +
      '&gridlines=false' +
      '&fzr=true' +
      '&gid='+feuilleID;
    var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};

 // Envoi email avec fichier attaché 
    var params = { method: "GET", headers: { "authorization": "Bearer " + ScriptApp.getOAuthToken() } };
    var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();
      GmailApp.sendEmail(email,objet,corps, {
      htmlBody: corps,
      attachments: [{
            fileName: fichier,
            content: reponse.getBytes(),
            mimeType: "application/pdf"
        }]
    });
} 

const texte = `
Bonjour,

Veuillez trouver en pièce jointe le rapport des réservations.

Merci de vérifier les actions à gérer.

Cordialement

Co 
`
image

Je viens de tester. J'ai recopié tel quel ton script. J'ai juste modifier l'ID du document et de la feuille et l'adresse mail et j'ai toujours un message quelque peu différent

Exception: Request failed for https://docs.google.com returned code 500. Truncated server response: : <!DOCTYPE html><html lang="fr"><head><meta name="description" content="Traitement de texte, présentations et feuilles de calcul en ligne"><meta nam... (use muteHttpExceptions option to examine full response)

Mail_CTL @ macros.gs:59

La ligne 59 :

    var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();

Je pense que ça doit être une histoire d'autorisation que je n'ai pas mais je n'y connais rien en autorisation

si tu lances de l'éditeur de script, il te demande l'autorisation !

je te mets en mp et en édition la copie que je m'étais faite, il suffit de mettre ton adresse email

Merci pour tout.

C'était bien un problème d'autorisation sur mon ordinateur.

Je valide ta réponse précédente

Co

Bonjour.

Je me suis inspiré de ce post pour aussi automatiser l'envoi d'une facture par mail et la stocker dans le drive.

Seulement, j'ai des soucis....

Pour le moment je demande d'envoyer la feuille ID correspondante mais en fait je voudrais qu'il me sélectionne seulement la plage A1:G42 de mon onglet 'Facture'. Une fois le pdf édité, il tient sur 2 pages alors que l'aperçu est sur une seule....

Aussi je cherche à personnaliser le nom du pdf enregistré sous le drive. J'aimerai que le nom soit Facture du yyyyMMdd N° xx. xx correspond à la cellule B13 de mon onglet Facture. J'ai bidouillé mais ça ne va pas et me fait "Facture du_20240312N°1xUKx4Ma0DmP_6E_gqdQR0zoST2wehDxxc3pxUAMEKw4"

function envoiCopieFeuillePDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();

  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = '1xUKx4Ma0DmP_6E_gqdQR0zoST2wehDxxc3pxUAMEKw4';
  const feuilleID = '1410644122';
  var email =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Facture').getRange('E41').getValue()        ;                              
  const dossier = DriveApp.getFolderById('1mNulgsvTkDRTMMhFC-lhN2vAbG6kLgEm');
  const d = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");

  const docId =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Facture').getRange('B13').getValue()                     ;

  const fichier = 'Facture du' + "_" + d + "N°" + docID +".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));
}  

Si quelqu'un peux me filer un coup de main, ce serait super !

Merci à tous

Rechercher des sujets similaires à "creation envoi pdf mail"