Envoi d'email via google sheet avec tableau html

Bonjour,

J'ai un fichier test comprenant ces données en plage B6:G (nombre de lignes aléatoires) et en G3 l'adresse mail de diffusion.

Le texte est n'importe quoi, mais il faut anonymiser donc... ^^

FruitsTexteQuantité vendueEntête 1Entête 2Entête 3
Pommesxxxxxxxxxxxxx
Orangesxxxxxxxxxx
Bananesxxxxxxxxxxxxxxx
Pommesxxxxxxxx
Bananesxxxxxxxxxxxxxxxxx

Oranges

xxxxxxxxxxxxxxxxxxx

En fouillant sur le net j'ai pu réaliser ce script, me permettant de personnaliser mon entête et mettre des bordures sans utiliser de fichier html.

Le script est fonctionnel.

Question comment faire pour qu'à chaque fois qu'il y a le mot "Bananes" la cellule (<td></td>) est un fond jaune et qu'à chaque fois qu'il y a le mot orange ce soit la ligne entière (<tr></tr>) qui soit en orange ?

Une idée sans utiliser de fichier html ?

function EnvoiMail() {

var Fichier = SpreadsheetApp.getActiveSpreadsheet();
var Fichier_BDD = Fichier.getSheetByName('BDD');
var TabloBDD = Fichier_BDD.getRange(6, 2, Fichier_BDD.getLastRow()-5, 6).getValues();
var Adressemail = Fichier_BDD.getRange("G3").getValue();
var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="width:100%;table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;'
var htmltable = '<table ' + TABLEFORMAT +' ">';

for (row = 0; row<TabloBDD.length; row++){

htmltable += '<tr>';

for (col = 0 ;col<TabloBDD[row].length; col++){
  if (TabloBDD[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} 
  else
    if (row === 0)  {
      htmltable += '<th style="color:white;background-color:#CCC7C5">' + TabloBDD[row][col] + '</th>';
    }

  else {htmltable += '<td>' + TabloBDD[row][col] + '</td>';}
}

     htmltable += '</tr>';
}

     htmltable += '</table>';
     Logger.log(TabloBDD);
     Logger.log(htmltable);

MailApp.sendEmail({
    name: "ESSAI",
    to: Adressemail,
    subject: "Email de test",
    htmlBody: "<p>Bonjour,</p><p>texte d'intro ici</p>"+htmltable+"<p>Cordialement,</p>"
  });
}

Bonjour,

une proposition

    for (col = 0; col < TabloBDD[row].length; col++) {
      if (TabloBDD[row][col] === "" || 0) { htmltable += '<td>' + 'None' + '</td>'; }
      else
        if (row === 0) {
          htmltable += '<th style="color:white;background-color:#CCC7C5">' + TabloBDD[row][col] + '</th>';
        }
        else {
          var couleurDeCellule = (TabloBDD[row][0] == "Oranges" ? "orange" : (TabloBDD[row][col] == "Bananes" ? "yellow" : "white"))
          htmltable += '<td bgcolor="' + couleurDeCellule + '">' + TabloBDD[row][col] + '</td>';
        }
    }

Tu peux aussi utiliser cette fonction en mettant les couleurs dans ta feuille (par mise en forme conditionnelle), cela évite de devoir change le code quand on change de critère.

https://sheetstipsandtricks.blogspot.com/2022/02/inserer-un-tableau-provenant-dune.html

ce qui ferait alors

function EnvoiMail() {

  var Fichier = SpreadsheetApp.getActiveSpreadsheet();
  var Fichier_BDD = Fichier.getSheetByName('BDD');
  var maBDD = Fichier_BDD.getRange(6, 2, Fichier_BDD.getLastRow() - 5, 6);
  var Adressemail = Fichier_BDD.getRange("G3").getValue();

  MailApp.sendEmail({
    name: "ESSAI",
    to: Adressemail,
    subject: "Email de test",
    htmlBody: "<p>Bonjour,</p><p>texte d'intro ici</p>" + tableHTMLplus(maBDD) + "<p>Cordialement,</p>"
  });
}

Merci Steelson, je rentre du travail, je vais tester tout ça demain.

Je comprends maintenant ou je n'ai pas réussi

[row][0]
Je ne savais pas qu'on pouvait utiliser comme ça.

Connaitrais tu un bon ouvrage pour apprendre à coder à tout hasard ?

J'ai des bases, mais il faut que je consolide tout ça pour gagner en autonomie.

Connaitrais tu un bon ouvrage pour apprendre à coder à tout hasard ?

soit openclassrooms, soit https://www.sheets-pratique.com/fr/codes, et enfin les questions/réponses du forum !

Merci beaucoup Steelson, les 2 fonctionnent parfaitement.

J'avais pensé aussi utiliser le CPF avec numericoach ou autres.

J'avais trouvé aussi SheetConverter, mais il ne fonctionne plus :(

C'est pour ce genre de raison-disparition que je n'aime pas les outils prêts à l'emploi et non maintenus. Il faut rester simple avec des outils génériques ne dépassant pas une page et facile à maintenir.

Dans ton Script, du coup, var pourrait être remplacé par let si j'ai bien compris les petites nouveautés non ?

absolument, ou const

var est le mot réservé historique utilisé pour déclarer une variable. Il présente un certain nombre de défauts. Certains sont corrigés par l'utilisation du mode strict mais la solution préconisée à partir d'ES6 c'est d'utiliser let et const

Bonjour Steelson, j'ai fait un test sur une copie de mon doc au boulot et il y a quelques bémols

J'ai fait un fichier quasi similaire avec des données bidons, histoire que ce soit plus parlant.

https://docs.google.com/spreadsheets/d/1Vu51X7_s3-ldsxDLm_HnHL-6iGpFTNuBdIZTg0Pqcpw/edit?usp=sharing

L'idée est d'avoir le corps du mail (si on choisit Occitanie par exemple) qui va de B2 à H26.

1er problème : toutes les cellules ont un quadrillage.

Est-il possible de ne mettre un quadrillage uniquement s'il y a du quadrillage sur les cellules ?

Sinon dois-je faire 2 fonctions tableHTMLplus et tableHTMLplus2 (bordure = 0px) mais j'augmente la durée d'exécution du script

La Mise en forme "couleur en alternance" n'est pas prise en charge, est-ce adaptable ?

Un problème sur mon fichier original que je n'arrive pas à reproduire dans celui de test est la valeur de getLastRaw()

Dans le fichier original, la valeur est toujours à 45, alors que celui partagé, elle varie bien en fonction du nombre de ligne affichée... Une piste ?

ok, je vais regarder

mais une solution plus simple est de joindre un pdf, et là tu auras exactement la mise en forme !

Oui, le pdf, je sais faire, mais c'est justement ce que je ne veux pas.

le ficher va être regarder sur tel portable, tablette, et télécharger le fichier, les supprimer, pas pratique.

Dans le corps du mail c'est top pour le coup.

Pour ceci, en effet ce n'est pas détecté

La Mise en forme "couleur en alternance" n'est pas prise en charge, est-ce adaptable ?

mais tu peux remplacer par une mise en forme conditionnelle avec cette formule

=mod(row($B14);2)

pour la plage B14:H202

Dans le fichier original, la valeur est toujours à 45, alors que celui partagé, elle varie bien en fonction du nombre de ligne affichée... Une piste ?

cela veut dire qu'il y a des formules qui vont au-delà de ce que tu vois

remplace .getLastRow() par .getLastDataRow('B') en ajoutant cette fonction

Object.prototype.getLastDataRow = function(col){ // col en lettre
  var lastRow = this.getLastRow();
  if (col == null){col='A'}
  var range = this.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }  
};

Est-il possible de ne mettre un quadrillage uniquement s'il y a du quadrillage sur les cellules ?

je vais regarder si c'est possible, cela peut être compliqué

va falloir dépouille tout ceci ……… https://developers.google.com/apps-script/reference/spreadsheet/range

Sinon dois-je faire 2 fonctions tableHTMLplus et tableHTMLplus2 (bordure = 0px) mais j'augmente la durée d'exécution du script

c'est une solution en effet !

Je crains de ne pas avoir le temps à court terme de me plonger dans https://developers.google.com/apps-script/reference/spreadsheet/range

Compte tenu de ta présentation, je ne pense pas que cela prenne plus de temps de faire ce que tu proposes, premier tableau jusque ligne 12, second tableau de 13 jusqu'à la fin.

Tu peux même pour la première partie ne pas faire de tableau mais mettre des titres html

htmlBody: "<p>Bonjour,</p><p><h2>"+Fichier_BDD.getRange(B2).getValue()+"</h2></p>" + tableHTMLplus(maBDD) + "<p>Cordialement,</p>"

cela veut dire qu'il y a des formules qui vont au-delà de ce que tu vois

remplace .getLastRow() par .getLastDataRow('B') en ajoutant cette fonction

Cette fonction marche parfaitement, j'ai trouvé le coupable, une formule avec Query.

J'avais pensé autrement créer un onglet "paramètres" avec cette formule :

=MAX(SIERREUR(EQUIV(9^9;A:A;1);0);SIERREUR(EQUIV("zzz";A:A;1);0))

puis récupérer le résultat dans une variable.

Concernant le quadrillage, j'ai dupliqué ta fonction, une sans bordure, l'autre avec.

Le fichier de démo étant simplifié, j'ai beaucoup de MFC dans l'entête du fichier en prod.

Avec les 2 fonctions c'est parfait. Le temps d'exécution est de 5 secondes par envoi de mail.

Du coup j'ai une autre question par rapport à ça. Pour l'envoi d'un mail c'est parfait.

Si je veux envoyer un mail pour chaque région (boucle pour changer la région + envoi de mail), je vais être obligé de mettre une tempo quelque part non ?

J'ai 2 boutons un qui envoie un mail sur la région choisi (fonctionnel), le second bouton lui va faire défiler la liste de validation et envoyer un mail pour chaque région donc X fois 5 secondes.

Donc j'ai 2 options, soit je fais une boucle sur ma liste de validation puis envoi de mail, soit ma liste de validation est vide, j'affiche toutes les régions et là il faut créer une variable tableau pour l'envoi de ce mail avec une boucle pour que cette variable change de valeur pour chaque région.

Une autre idée ?

Si je veux envoyer un mail pour chaque région (boucle pour changer la région + envoi de mail), je vais être obligé de mettre une tempo quelque part non ?

Normalement non, MAIS il te faudra rafraichir ta page par

SpreadsheetApp.flush()

Il faut considérer qu'au début d'un script, Google fait une photo de la feuille. Si tu y changes de valeurs, elles ne seraient pas prises en compte sans cela.

Rechercher des sujets similaires à "envoi email via google sheet tableau html"