Envoie d'un mail automatique à partir d'un G. Sheets

Bonjour tout le monde,

Je commence à débuter l'utilisation de G. Sheets et c'est vraiment tout nouveau pour moi. Je souhaiterais créer une VBA pour l'envoi automatique d'un Google Sheet (dans le corps du mail - GMail) à l'aide d'un bouton "Envoyer". Cependant, je suis tout nouveau, je m'y connais pas du tout en macro et j'ai commencé à lire des livres dessus et des vidéos.

Je souhaiterais extraire mon tableur (A1:H33) dans le corps du mail et l'envoyer aux adresses e-mail qui se trouve dans le classeur. (voir image). Ou bien, le mettre au format PDF.

image

https://docs.google.com/spreadsheets/d/1mLBnpbKcI26wcun1KbmI9xIbkXQ_G1uumximjeDzs24/edit?usp=sharing

En vous remerciant et vous souhaitant un bon dimanche !

Bonjour,

je ne connais pas ton niveau, mais mon but de toute façon est de coacher, pas de tout faire

voici quelques briques ...

Envoyer un mail c'est hyper simple ... fais un test en y mettant ta propre adresse

function envoyerEmail() {
  MailApp.sendEmail({to: 'nom@fai.fr', subject: 'ici l objet', htmlBody: 'ici le <b>texte</b><br>version html'})
};

Récupérer des adresses

  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var email = feuille.getRange('D35').getValue()

Récupérer un tableau et le mettre dans le corps du texte ... fais un test en exécutant la fonction testTableHTML

function testTableHTML(){
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var plage = feuille.getRange('A1:H33'); 
  Logger.log(tableHTML(plage.getValues()))
}

function tableHTML(plage) {
  // Source : https://www.sheets-pratique.com/fr/codes/fonction-table
  return '<table>\n' + plage.map(l => '<tr><td>' + l.join('</td><td>') + '</td></tr>').join('\n') + '\n</table>';
}

Il faudra ensuite assembler ces briques ...

Plutôt qu'un bouton, je préfère un menu personnalisé

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('MonMenu')
    .addItem('Envoyer mail', 'envoyerEmail')
    .addToUi();
}

Bonjour,

Je vous remercie beaucoup. Je vais essayer les codes. Mon niveau: je suis débutant, j’ai aucune connaissance en macro.

Bon dimanche !

Bonjour,

J'ai essayé les fonctions que vous avez proposé, elle marche parfaitement séparément. Cependant, je n'arrive pas vraiment à utiliser la fonction testTableHTML() - le script s'exécute mais rien ne se produit.

function testTableHTML(){
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var plage = feuille.getRange('A1:H33'); 
  Logger.log(tableHTML(plage.getValues()))
}

function tableHTML(plage) {
  // Source : https://www.sheets-pratique.com/fr/codes/fonction-table
  return '<table>\n' + plage.map(l => '<tr><td>' + l.join('</td><td>') + '</td></tr>').join('\n') + '\n</table>';
}

Également, je souhaiterais savoir comment peut-on faire appel à plusieurs adresse sur plusieurs cellules ? J'ai essayé mais cela ne marche pas

  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var email = feuille.getRange('D35:D37').getValue()

Merci,

Bonne journée :)

Bonjour,

Si tu as plusieurs cellules, mets un s à getValues

var email = feuille.getRange('D35:D37').getValues()

Pour le premier point, peux-tu mettre un lien vers ton fichier simplifié anonymisé ?

Bonjour,

Merci pour votre réponse. Voici le Google Sheets:

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

Le script se trouve également à l'intérieur.

Également, est-il possible d'insérer automatique la date du jour de la modification d'une cellule ou lors de la saisie d'une nouvelle ligne (?) même s'il existe déjà un historique "Dernière modification il y a ... min ". ?

var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Emploi du temps')
var email = feuille.getRange('B17').getValue()

function envoyerEmail() {
  MailApp.sendEmail({to:email,
  subject: 'ici l objet', 
  htmlBody: testTableHTML()})
};

function testTableHTML(){
  var plage = feuille.getRange('A1:F14'); 
  return (tableHTML(plage.getValues()))
}

function tableHTML(plage) {
  // Source : https://www.sheets-pratique.com/fr/codes/fonction-table
  return '<table>\n' + plage.map(l => '<tr><td>' + l.join('</td><td>') + '</td></tr>').join('\n') + '\n</table>';
}

Bonjour,

Désolé, ça fait un moment que j'ai pas répondu. Ce que vous avez envoyé marche à la perfection.

Cependant, j'ai une petite question, est-ce normal que ça ne prend pas la mise en page ?

Bonne journée à vous,

  1. La seule solution que je connaisse pour prendre la mise en page est de mettre le document en pièce jointe en pdf.
  2. Quelqu'un connaît peut-être une autre solution ... ou via un long travail de script, on pourrait sans doute récupérer les tailles de caractères .getFontSize(), getFontWeight() couleurs de fond getBackground()et de police getFontColor()

Je regarderai à l'occasion (pas tout de suite) si je peux le faire si personne n'a la solution.

Avec un tas de cellules fusionnées, le rendu n'est pas top, il faudrait revoir la mise en forme de la feuille

var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
var email = feuille.getRange('D35').getValue()

function envoyerEmail() {
  MailApp.sendEmail({to:email,
  subject: 'Voyage', 
  htmlBody: myTableHTML()})
};

function myTableHTML(){
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var plage = feuille.getRange('A1:H33'); 
  return (tableHTML(plage))
}
function tableHTML(plage){
  var data=plage.getDisplayValues()
  var taille=plage.getFontSizes()
  var fond=plage.getBackgrounds()
  var couleur=plage.getFontColors()
  var police=plage.getFontFamilies()
  var htmltable = '<table cellspacing=0 cellspadding=2px>';
  for (row = 0; row<data.length; row++){
    htmltable += '<tr>';
    for (col = 0 ;col<data[row].length; col++){
      if (data[row][col] === "" || 0) {htmltable += '<td style="background-color:' + fond[row][col] + ';">' + ' ' + '</td>';} 
      else
        htmltable += '<td style="font-family:' + police[row][col] + '; background-color:' + fond[row][col] + '; color:' + couleur[row][col] + '; font-size:' + taille[row][col] + 'px;">' + data[row][col] + '</td>';
      }
      htmltable += '</tr>';
    }
  htmltable += '</table>';
  return htmltable
}

je vais quand même voir comment traiter les cellules fusionnées par ligne

Bonjour,

Waouh ! Merci beaucoup pour le script pour garder la mise en page.

Oui, j"avais regardé la mise en page, il faut créer un script HTML. Du coup, j'avais essayé une autre version (d'après internet), convertir le Sheets en PDF avec la fonction suivante

function sendReport() {
  var message = {
    to: "youremail@example.com",
    subject: "Monthly sales report",
    body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
    name: "Bob",
    attachments: [SpreadsheetApp.getActiveSpreadsheet().getAs(MimeType.PDF).setName("Monthly sales report")]
  }
  MailApp.sendEmail(message);
}

Cependant, on ne peut pas choisir la plage sélectionner et l'onglet (il faut ajouter une ligne code pour cacher les onglets). Et aussi, il est impossible d'extraire le Sheets et la mettre en pièce jointe au format XLSX.

attachments: [SpreadsheetApp.getActiveSpreadsheet().getAs(MimeType.MICROSOFT_EXCEL).setName("Monthly sales report")]

Bonjour,

Cependant, on ne peut pas choisir la plage sélectionner et l'onglet (il faut ajouter une ligne code pour cacher les onglets).

non, non, non, non .... il est tout à fait possible de choisir la feuille et uniquement celle-ci ! qui sur internet a dit le contraire ?


Et aussi, il est impossible d'extraire le Sheets et la mettre en pièce jointe au format XLSX.

quel serait l'intérêt ?


je poursuis sur les cellules fusionnées, pftt j'en aurai passé du temps, mais je pense que cela donne une possibilité intéressante !

pfttt, quelle galère avec les cellules fusionnées, je pense avoir réussi

var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
var email = feuille.getRange('D35').getValue()

function envoyerEmail() {
  MailApp.sendEmail({to:email,
  subject: 'Voyage', 
  htmlBody: myTableHTML()})
};

function myTableHTML(){
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Agenda')
  var plage = feuille.getRange('A1:H33'); 
  return (tableHTML(plage))
}
function tableHTML(plage){
  var data = plage.getDisplayValues()
  var taille = plage.getFontSizes()
  var fond = plage.getBackgrounds()
  var couleur = plage.getFontColors()
  var police = plage.getFontFamilies()
  const mergedRanges = plage.getMergedRanges();
  var flag = Array.from({ length: plage.getNumRows() }, () => Array.from({ length: plage.getNumColumns() }, () => true));
  var layout = Array.from({ length: plage.getNumRows() }, () => Array.from({ length: plage.getNumColumns() }, () => ''));
  mergedRanges.forEach((rng,i) => {
    for (x=rng.getRow();x<rng.getRow()+rng.getNumRows();x++){
      for (y=rng.getColumn();y<rng.getColumn()+rng.getNumColumns();y++){
        flag[x-1][y-1]=false
      }
    }
    flag[rng.getRow()-1][rng.getColumn()-1]=true
    layout[rng.getRow()-1][rng.getColumn()-1]=' colspan="'+rng.getNumColumns()+'" rowspan="'+rng.getNumRows()+'" '
  });
  var htmltable = '<table cellspacing=0 cellspadding=2px>';
  for (row = 0; row<data.length; row++){
    htmltable += '<tr>';
    for (col = 0 ;col<data[row].length; col++){
      if (flag[row][col]){
        if (data[row][col] === "" || 0) {
          htmltable += '<td '+layout[row][col]+' style="background-color:' + fond[row][col] + ';">' + ' ' + '</td>';
        } 
        else
          htmltable += '<td '+layout[row][col]+' style="font-family:' + police[row][col] + '; background-color:' + fond[row][col] + '; color:' + couleur[row][col] + '; font-size:' + taille[row][col] + 'px;">' + data[row][col].replace(/(\r\n|\n|\r)/gm,"<br>") + '</td>';
        }
      }
    htmltable += '</tr>';
  }
  htmltable += '</table>';
  return htmltable
}

Bonsoir,

Waooouh ! Merci beaucoup pour votre aide ! Vous êtes un expert !

Je vous remercie encore,

Hello,

Désolé, si je prends le topic de Fowsto.

J'ai essayé votre fonction, elle marche parfaitement, un grand merci à vous. Cependant, j'aimerais savoir s'il est possible que les bordures soient prise en compte ?

https://docs.google.com/spreadsheets/d/1tKyvaD8Gzk_W31l1gb3tHZaGEiMP_r498K7ggPA7utw/edit?usp=sharing

Bon week-end,

Bonjour,

c'est possible mais comme je ne sais pas reconnaître les cellules bordées ou non bordées, je ne peux le mettre que sur (toutes) les cellules renseignées en ajoutant

border: 1px solid black;
          htmltable += '<td '+layout[row][col]+' style="border: 1px solid black; font-family:' + police[row][col] + '; background-color:' + fond[row][col] + '; color:' + couleur[row][col] + '; font-size:' + taille[row][col] + 'px;">' + data[row][col].replace(/(\r\n|\n|\r)/gm,"<br>") + '</td>';

une alternative serait de mettre une bordure sur toutes les cellules qui ne sont pas grisées par exemple, ou dont la police n'est pas de couleur xx ... car on peut récupérer la couleur de fond/de police d'un cellule.

Rechercher des sujets similaires à "envoie mail automatique partir sheets"