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

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));
}

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 c**onsole.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

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


\

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 = « 

Bonjour,

Veuillez trouver en pièce jointe le PDF de votre feuille de calcul.

Bonne réception,

 »;
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

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):stuck_out_tongue_winking_eye: :

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 :wink:)_
** 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

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));
}

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

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 :

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 !

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

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.

merci de corriger le problème => Décidemment va falloir se calmer et mettre la forme sur ce forum.
Y a vraiment un problème de ton !
Même à chat gpt je parle plus poliment :grin:

Bonjour,
J’ai un script qui a le mem fonctionnement.
Par contre, je voudrais que le script s’exécute avec une autre boite email mais pas la mienne.
Comment je dois faire ?

Merci d’avance.

Bonjour,

Désolé pour la réponse plus que tardive !

De manière générale, les scripts sont exécutés avec le compte de la personne qui l’exécute, et donc avec son adresse e-mail (jusqu’ici, c’est logique). Si vous voulez que le mail soit envoyé depuis une autre adresse, deux solutions :

  • La plus compliquée : mettre en place un compte de service avec une délégation de domaine, puis écrire un code complexe qui fait que vous vous connectez au compte de service pour que lui-même se connecte au compte voulu afin que ce compte envoie le mail.
  • La plus simple : rajouter l’autre boîte email en tant qu’alias de votre email, puis changer le code d’envoi d’email en utilisant GmailApp.sendEmail() avec un objet contenant la propriété from et l’alias que vous venez d’établir. Ainsi, le mail sera envoyé via l’alias, qui s’avère être l’autre boîte mail !
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 = "";

   // À FAIRE : Mettre l’alias qui enverra le mail
   const alias = "";

  // 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é
  GmailApp.sendEmail(email, objet, corps, {
    htmlBody: corps,
    from: alias,
    attachments: [{
      fileName: nomFichierPDF,
      content: blob.getBytes(),
      mimeType: "application/pdf"
    }]
  });
}

Cela devrait fonctionner correctement :slight_smile: