Envoyer par Email une feuille d'un classeur google Sheet Le sujet est résolu

Avatar de l’utilisateur
Piga25
Messages : 14
Inscription : 03 févr. 2023 15:36
A remercié : 4 fois
Remercié : 2 fois

Envoyer par Email une feuille d'un classeur google Sheet

Message par Piga25 »

Bonjour,
Malgré mes recherches, j'ai toujours une erreur dans mon code.
J'aimerai envoyer la page active qui est nommée : "Note de frais" à l'adresse de l'Email de l'intéressé qui elle est située sur cette même feuille en cellule "F7".
mon code:
function EnvoiMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Note de frais');
{
var range = sheet.getRange(7, 5);  // adresse Email du destinataire est dans la cellule "E7"
var data = range.getValues();
var toEmail = data
var subject = "Imprimé CERFA";
var message = "Bonjour ";
message += "Voici le PDF du CERFA " ;
if(toEmail!=''){
MailApp.sendEmail(toEmail,subject,message);}
sheet.getRange(7,6).setValue("Oui");
SpreadsheetApp.flush(); 
}
}
J'ai ceci comme message d'erreur : Exception: The parameters (number,String,String) don't match the method signature for MailApp.sendEmail.
EnvoiMail
@Email.gs:12
Nota: pour l'envoi, je pense insérer un bouton en lieu et place de la valeur de la cellule(7,6)
Cordialement
Piga25

Edit:
avec ce code cela fonctionne :
function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = //ici mettre l'ID du fichier ex: '1injaUvfQu1CSvmmfnxxxxxxxxg7IAmvEUhOfQIhdxxx';
  const feuilleID = // ici mettre l'ID de la feuille ex: '1108000000';
  //const email = 'Parametre!B5';
  var email = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Note de frais').getRange('E7').getValue()
  //const dossier = DriveApp.getFolderById('Facture18');
  const d = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd")
  const fichier = 'Facture' + "_" + d + ".pdf"
  const objet = 'Frais de déplacement ';
  const corps =  "Bonjour,";
  // 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));

 
Dernière modification par Piga25 le 17 févr. 2023 14:20, modifié 1 fois.
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par NC-Ahmet »

Hello Piga25,

Il semblerait que ta variable "toEmail" que tu renseignes en argument de MailApp.sendEmail() soit considéré comme un tableau (Array) alors qu'une chaîne de caractère est attendue.

En effet, je constate que toEmail = data alors que var data = range.getValues() retourne un tableau.

Il faudrait que tu fasse un range.getValue() sans le 's'. Ensuite tente de faire un console.log(toEmail) pour t'assurer qu'il s'agit bien d'une chaîne de caractère.

Si c'est bien le cas, ton code marchera à nouveau.

Je te renvoie vers la documentation ici.

A+ !
Ahmet
Avatar de l’utilisateur
Piga25
Messages : 14
Inscription : 03 févr. 2023 15:36
A remercié : 4 fois
Remercié : 2 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par Piga25 »

Bonjour NC-Ahmet
Oui bien vu pour le range.getValue() sans le 's'.
Pour info je commence juste à écrire des scripts, j'essai de comprendre en regardant plusieurs exemples.
Voici mon code modifié:
function EnvoiMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Note de frais');
{
var range = sheet.getRange(7, 5);  // adresse Email du destinataire est dans la cellule "E7"
var data = range.getValue();
var toEmail = data
var subject = "Imprimé CERFA";
var message = "Bonjour ";
message += "Voici le PDF du CERFA " ;
}
if(toEmail!=''){
MailApp.sendEmail(toEmail,subject,message);}
//sheet.getRange(7,6).setValue("Oui");
SpreadsheetApp.flush(); 
}
Maintenant reste à mettre la feuille ('Note de frais') en format PDF puis de la joindre à l'Email.
Et là je sèche.
Merci



 
Avatar de l’utilisateur
Piga25
Messages : 14
Inscription : 03 févr. 2023 15:36
A remercié : 4 fois
Remercié : 2 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par Piga25 »

Re
J'ai trouvé un script qui fonctionne bien mais, oui il y a un mais, il envoi la totalité des feuilles du classeur.
J'aimerai qu'il envoi uniquement la feuille qui est nommée : Note de frais
function emailFeuilleDeCalculVersPDF() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sh = ss.getSheets()[0]; //il enverra la feuille 0 qui est la première feuille du classeur.
   // si vous changez le nombre, changez-le aussi dans les paramètres ci-dessous
  var shName = sh.getName();
  // Email réceptionant le PDF de cette feuille de calcul
  var email = sh.getRange('E7').getValue();
  // Obtenir l'URL de la feuille de calcul actuellement active (lien)
  var feuille = SpreadsheetApp.getActiveSpreadsheet();
  // Sujet du message
  var sujet = "PDF généré depuis la feuille de calcul " + feuille.getName(); 
  // Corps du mail
  var corpsDuMessage = "<p>Bonjour,</p>Veuillez trouver en pièce jointe le PDF de votre feuille de calcul.<p>Bonne réception,</p>";
  var contenant = DriveApp.getFileById(feuille.getId()).getAs("application/pdf");
  contenant.setName(feuille.getName() + ".pdf");
  // Si vous n'avez pas dépassé le quota, envoi du mail avec la pièce jointe en PDF.
  if (MailApp.getRemainingDailyQuota() > 0) 
    GmailApp.sendEmail(email, sujet, corpsDuMessage, {
      htmlBody: corpsDuMessage,
      attachments:[contenant]     
    });  
}
Merci
 
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par NC-Ahmet »

Hey !

Je te renvoie vers un article de notre blog qui t'expliquera comment t'y prendre !

Tu peux directement défiler jusqu'au paragraphe intitulé "Créer la fonction « savePDF »". 

Là, voici un exemple que je t'offre comme sur un plateau pour m'excuser du délai de réponse (lis quand même l'article pour comprendre la mécanique derrière cette fonction)😜 :

function exportPdf() {
  // On génère une URL qui va imprimer le PDF
  const url = ss.getUrl().replace(/\/edit.*$/, "");
  const params = `/export?exportformat=pdf&format=pdf&gid=${feuille.getSheetId()}`;


  // On fait une requête de l'url ci-dessus et on désigne le format (pdf) et nom de fichier (fichier.pdf)
  const pdf = UrlFetchApp.fetch(url + params, {
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
  })
    .getAs("application/pdf")
    .setName(`fichier.pdf`);


  // On envoie l'email à l'utilisateur qui a lancé le script (jette un coup d'œil dans ta boîte mail après avoir lancé le script 😉)
  GmailApp.sendEmail(
    recipient,
    "Objet du mail",
    `Bonjour,
      
Vous trouverez ci-joint votre document PDF.
      
Bonne journée
`,
    {
      attachments: [pdf],
    }
  );
};


Je t'ai mis en rouge les parties à potentiellement modifier.

N'hésite pas à creuser dans l'article que je t'ai envoyé ci-dessus, tu verras que tu peux ajouter plein de paramètres dans ton URL (là où tu déclares const url) pour personnaliser la manière dont le PDF va sortir.

Si tu as des questions, tu sais où toquer !

A+
Ahmet
Avatar de l’utilisateur
Piga25
Messages : 14
Inscription : 03 févr. 2023 15:36
A remercié : 4 fois
Remercié : 2 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par Piga25 »

Bonjour,
C'est fait et merci pour tous ces bon conseils et information.
Voila le code que je vais utiliser :
function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = // ici mettre l'ID du fichier, exemple :'1injaUvfQu1CSvmmfn8YT0wLNjg7Ixxxxxxxxxxxxxxx';
  const feuilleID =// ici mettre l'ID de la feuille, exemple : '100000000010';
  //const email = 'Parametre!B5';
  var email = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Note de frais').getRange('E7').getValue()
  var texte = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sommaire').getRange('L1').getValue()
  //const dossier = DriveApp.getFolderById('Facture18');
  const d = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd")
  const fichier = 'Facture' + "_" + d + ".pdf"
  const objet = 'Frais de déplacement ';
  const corps =  votre 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' +                     // 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));
Avatar de l’utilisateur
Apollo

Membre tout neuf
Messages : 1
Inscription : 29 nov. 2023 16:41

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par Apollo »

Bonjour,

Top pour ce script qui fonctionne impec pour moi, cependant je voudrais sélectionner une plage de cellules précise de la feuille pour créer mon PDF à envoyer.

Ex:

  const docID = // ici mettre l'ID du fichier, exemple :'1injaUvfQu1CSvmmfn8YT0wLNjg7Ixxxxxxxxxxxxxxx';
  const feuilleID =// ici mettre l'ID de la feuille, exemple : '100000000010';
..............et la je sèche !

Je débute en script sheets et je n'avance vraiment pas sur ce problème;;;si quelqu'un à la solution je suis preneur !

Merci d'avance
Avatar de l’utilisateur
NC_Quentin

Coach Numericoach
Invétéré
Messages : 32
Inscription : 10 oct. 2022 09:06
A remercié : 1 fois
Remercié : 11 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par NC_Quentin »

Bonjour !

Je me suis permis de reprendre le code précédent et de le commenter pour répondre à ce que vous demandez. J’ai rajouté des commentaires pour expliciter un peu plus la chose :

Code : Tout sélectionner

function envoiPDF() {
  // /!\ Bien qu’un commentaire, cette ligne sert à forcer la détection automatique des autorisations par Apps Script lors de l’exécution du script.
  // En effet, pour que l’export PDF fonctionne, il faut que le script soit autorisé à lire les fichiers de votre Drive, chose qu’il ne détecte pas par défaut.
  // Bien qu’il soit possible de le faire à la main, il est plus simple de le faire ainsi, avec une ligne en commentaire comme ci-dessous :
  // DriveApp.getFiles();

  // VARIABLES
  // À FAIRE : Mettre l'ID du Google Sheets à exporter, par exemple : "1injaUvfQu1CSvmmfn8YT0wLNjg7Ixxxxxxxxxxxxxxx"
  // L’ID est dans l’URL du fichier Google Sheets, après /d/
  const docID = "";

  // À FAIRE : Mettre l’ID de la feuille, qui se trouve dans l’URL du Google Sheets, derrière gid=
  const feuilleID = "";

  // À FAIRE : Mettre l’adresse email à laquelle envoyer le PDF
  const email = "";

  // L’objet du mail à envoyer.
  const objet = "Export PDF par Google Apps Script";

  // Le corps du mail à envoyer.
  const corps = "Ci-joint : le fichier PDF.";

  // Le nom de l’export PDF. Il faut bien inclure le .pdf !
  const nomFichierPDF = "Export.pdf"

  // À FAIRE : Mettre la région de cellules à exporter, en notation A1 (par exemple, "C2:O27")
  const range = "A1:B4";

  // Création du fichier pdf avec l’URL spéciale d’export
  const url = 'https://docs.google.com/spreadsheets/d/' + docID + '/export?';

  // Les options d’export, à rajouter au besoin. L’ordre n’a pas d’importance. Retirez les barres obliques (//) en début de ligne pour activer une option.
  const exportOptions =
    "exportFormat=pdf&format=pdf" +
    "&range=" + range +
    //"&size=A4" +                            // Taille de la feuille
    //"&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;

  // UrlFetchApp pour récupérer le résultat à l’URL que l’on construit avec l’URL de base et les options d’export définies juste au-dessus.
  const params = {
    headers: {
      'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
    },
    muteHttpExceptions: true,
  }
  const reponse = UrlFetchApp.fetch(url + exportOptions, params);

  if (reponse.getResponseCode() !== 200) {
    console.log("Erreur dans l’appel à UrlFetchApp ! – " + reponse.getResponseCode());
    console.log(reponse.getContentText());
    console.log(reponse.getHeaders());
    return;
  }

  // Récupération du "blob" représentant notre fichier
  const blob = reponse.getBlob();

  // Envoi email avec fichier attaché
  MailApp.sendEmail(email, objet, corps, {
    htmlBody: corps,
    attachments: [{
      fileName: nomFichierPDF,
      content: blob.getBytes(),
      mimeType: "application/pdf"
    }]
  });
}
Il y a quelques champs à remplir vous-même, mais je pense que les commentaires sont assez explicites. Toutefois, si cela ne suffit pas, n’hésitez pas à demander !
Avatar de l’utilisateur
S C transcontinental

Membre tout neuf
Messages : 3
Inscription : 05 févr. 2024 20:41

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par S C transcontinental »

Bonsoir,
le code marche parfaitement, mais le fichier PDF à la réception est endommagé adobe Reader n'arrive pas à l'ouvrir.
merci de corriger le problème.
merci

 
Avatar de l’utilisateur
NC_Quentin

Coach Numericoach
Invétéré
Messages : 32
Inscription : 10 oct. 2022 09:06
A remercié : 1 fois
Remercié : 11 fois

Re: Envoyer par Email une feuille d'un classeur google Sheet

Message par NC_Quentin »

Bonjour !

Le code que j’ai posté est parfaitement fonctionnel, et effectue un export PDF d’un fichier Google Sheets donné et de la région sélectionnée. Toutefois, si vous souhaitez que nous examinions plus en avant votre problème, vous êtes libre de prendre contact avec nous pour une prestation, et après un court échange et un devis en bonne et due forme, nous serons ravis de vous aider. 
Répondre

Rejoignez la discussion 💬

Vous devez être enregistré pour participer à la discussion et échanger avec les différents membres

Inscrivez-vous dès aujourd'hui

Vous n'êtes pas encore membre ? Rejoignez-nous gratuitement dès aujourd'hui et contribuer en postant votre réponse ou question sur tous les forums disponibles

Inscription

Connectez-vous