Apps script pour envoi d'email

Bonjour,

J'ai un tableau de suivi de devis/chantier partagé avec mon équipe sur google sheet

Je souhaiterai pouvoir ajouter un script pour envoyer un mail a un technicien (mail générique) lorsqu'un chantier lui est programmé (avec reprise de quelques informations.

Je vous partage un fichier (pas l'original, confidentialité), mais contenant le tableau,

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

L'idée étant qu'en cochant la case mail de la colonne W, de la ligne concernée, le mail parte automatiquement (modèle de mail mis en exemple pour la ligne 2)

Vous m'aideriez grandement si c'était possible.

D'avance merci beaucoup

Bonjour,

C'est assez facilement realisable :

Il faut stocker les donnés utiles : adresse mail, donnés à écrire dans le mail.

Puis, preparer le cord du mail, les destinataires et enfin, utiliser MailApp pour envoyer le mail.

Il est même possible d'utiliser un alias.

Bonjour @PierreLepinay,

Avez-vous quelques précisions du comment faire, je ne connais pas Mailapp.

D'avance merci

Bonjour,

Regardez un peu sur internet et sur le forum, il y a beaucoup d'exemples. La documentation de google fournit également un exemple très proche de votre demande ici :

https://developers.google.com/apps-script/reference/mail/mail-app?hl=fr#sendemailrecipient,-subject,-body,-options

Avez-vous déjà utilisé app script ?

Bonjour Saboh12617,

J'ai cherché sur internet mais aucune solution pour ma demande.

J'ai trouvé un script (mais que je n'ai fait qu'appliquer/recopier) pour l'envoi d'un email à partir d'une ligne, mais je n'ai pas trouver le moyen de l'appliquer sur toute une colonne (comme dans mon fichier partagé.

Très honnêtement je ne suis pas adepte de script, ni programmateur et j'osai penser que ce forum pouvait m'aider à mettre en place mon idée.

Bonjour, étant relativement simple je peux te faire un tel script, j'ai demandé l'accès en édition du fichier.

Bonjour PierreLepinay,

Je viens d'ouvrir les accès (je pensais que c'était fait mais visiblement non).

Bonjour,

Ce n'est toujours pas le cas j'ai fais une copie en local et ai simplement corrigé le script que tu avais commencé, voici le script fonctionnel :

function sendMailToTechos(e) {
  const sheet = e.source.getActiveSheet();
  const range = e.range;
  const colonneCase = 23; 
  const colonneEmail = 13;
  const now = new Date();
  if (range.getColumn() == colonneCase && range.getValue() == true) {
    const row = range.getRow();
    const emailTechnicien = sheet.getRange(row, colonneEmail).getValue();
    const numeroDevis = sheet.getRange(row, 1).getValue();
    const dateDebut = sheet.getRange(row, 22).getValue();
    const travaux = sheet.getRange(row, 4).getValue();
    const ot = sheet.getRange(row, 21).getValue();
    const sujet = "Nouveau chantier : " + numeroDevis;
    const corps = "Bonjour,\n\nVoici les informations concernant le nouveau chantier :\n\nNuméro de devis : " + numeroDevis + "\nDate de début : " + dateDebut + "\nNuméro d'OT : " + ot + "\nDétail des travaux : " + travaux + "\n"
    MailApp.sendEmail(emailTechnicien, sujet, corps);
    range.setValue('email envoyé au technicient le '+Utilities.formatDate(now,'GMT+2','dd/MM/yyyy'))
  }
}

Voici sans commentaire, il nécessite aussi d'aller dans le menu a gauche des déclancheurs activer le déclencheur sur la fonction à chaque modification :

image

Le résultat :

image

+ j'ai ajouté une ligne :

    range.setValue('email envoyé au technicient le '+Utilities.formatDate(now,'GMT+2','dd/MM/yyyy'))

Qui retire la case a cocher et met à la place la date à laquelle le tech. a été informé par email, mais tu peux très bien supprimer cette ligne.

Bonjour Pierre,

Très bonne idée de remplacer la case à cocher par une date d'envoi, ça permet de garder une trace.

Par contre lorsque je copie ton script, j'ai un message d'erreur à l'éxecution

image

Il est normal que tu ais ce message, ce script n'est pas fait pour être exécuté manuellement.

Comme indiqué précédemment, il faut ajouter un déclencheur lançant le script à chaque modification sur le fichier.

Puis, si tu essayes de cocher une case dans la colonne 23 (MAIL) le script va se lancer.

Ah oui, pardon, c'est très fort ce que tu as réussi à faire, mille merci.

Dernier détail, la date de début de l'OT se met sous ce format "Thu Jan 09 2025 00:00:00 GMT+0100 (Central European
Standard Time)", est-il possible de n'avoir que la date au format dd/mmm/yyyy ?

Merci encore pour ton travail

Hello, je me permets une petite question pédagogique.

Est-ce que la date se met correctement à cet endroit du code ?

 range.setValue('email envoyé au technicient le '+Utilities.formatDate(now,'GMT+2','dd/MM/yyyy'))

Si oui, vois-tu ce qui pourrait te permettre d'avoir le bon format également pour OT ?

Bonjour 21Formatic,

Pour ma part les essais que j'ai pu tester sur la feuille Test fonctionne bien, juste le détail de la date de planification que je souhaiterai modifié, mais le numéro de l'OT se met comme il est indiqué et la case à cocher se change bien en date d'envoi.

Merci beaucoup à Pierre Lepinay pour son aide qui va m'être très utile.

Ah oui dans le mail !

Bien sûr, on peut modifier le format de la date, 2 possibilités :

- la solution simple, au lieu de stocker dans dateDebut la valeur date qui est donc un objet au format que tu as indiqué, on peut juste la stocker en format affiché, pour se faire, remplace :

const dateDebut = sheet.getRange(row, 22).getValue();

Par :

const dateDebut = sheet.getRange(row, 22).getDisplayValue();

- la solution + complexe, c'est un objet date, il suffit d'appliquer la même méthode que pour inscrire la date à la fin du script, donc, remplacer :

const dateDebut = sheet.getRange(row, 22).getValue();

Par :

const dateObj = sheet.getRange(row, 22).getValue();

const dateDebut = Utilities.formatDate(dateObj,'GMT+2','dd/MM/yyyy')

Bonjour Pierre,

Encore merci pour ton aide, qui à fait évoluer mon tableau et son utilité d'un coup.

Crois tu qu'il est possible, à partir de ton script de créer une deuxième colonne avec case a cocher pour envoyer un mail de réception de matériel. J'ai tenté de recopier ton script et modifier les informations mais visiblement les scripts ayant le même nom "sendmailToTechos" ça ne fonctionne pas.

C'est bien sûr possible, j'ai oublié de commenter le script, en voici une version commenté, j'ai aussi scindé en 2 fonctions, une première qui vérifie où a eu lieu la modification et qui en fonction, lance le script, comment cela tu peux ajouter facilement une fonction pour envoyer un email dans une nouvelle situation.

/**
 * Déclaration des coonstantes dans la portée globale, qui seront utilisées par plusieurs fonctions
 */
const NOW = new Date(); //  Déclaration de la constante NOW qui représente la date et l'heure actuelles.

/*  Déclaration de l'objet DEST qui contient les configurations pour les destinataires "techos" et "cciaux".
Chaque destinataire a une colonne pour la case à cocher (colonneCase) et une colonne pour l'email (colonneEmail).*/
const DEST = { //
  'techos':{
    'colonneCase':23, 
    'colonneEmail':13,
  },
  'cciaux':{
    'colonneCase': null,  // Colonne où se trouve la case à cocher pour "cciaux" (actuellement null)
    'colonneEmail': null, // Colonne où se trouve l'email pour "cciaux" (actuellement null)
  }
}

/**
 * Fonction principale qui est déclenchée par un événement (e).
 * Elle vérifie si la colonne de la plage modifiée correspond à celle définie pour "techos" ou "cciaux" et si la case est cochée.
 * Si oui, elle appelle la fonction appropriée pour envoyer un email.
 * 
 * @param {e} e - l'event d'édition
 */
function sendEmail(e) {
  const sheet = e.source.getActiveSheet(); // feuille active
  const range = e.range; // plage de cellules modifiée
  if (range.getColumn() == DEST.techos.colonneCase && range.getValue() == true) { // si colonne modifié = colonne techos ET valeur de la modification = vrai (donc case cochée)
    sendMailToTechos(sheet, range); // on lance sendMailToTechos avec comme argument la feuille active et la range modifiée
  } else if (range.getColumn() == DEST.cciaux.colonneCase && range.getValue() == true) {// si colonne modifié = colonne cciaux ET valeur de la modification  = vrai (donc case cochée)
    sendMailToCciaux(sheet, range); // on lance sendMailToCiaux avec comme argument la feuille active et la range modifiée
  }
}

/**
 * Fonction qui envoie un email au technicien.
 * Elle récupère les informations nécessaires à partir de la feuille et envoie un email avec ces informations.
 * 
 * @param {sheet} sheet - La feuille active.
 * @param {range} range - La plage où a eu lieu la modification.
 */
function sendMailToTechos(sheet, range) {
  const row = range.getRow(); // numéro de ligne de la plage modifiée
  const emailTechnicien = sheet.getRange(row, DEST.techos.colonneEmail).getValue(); // email du tech
  const numeroDevis = sheet.getRange(row, 1).getValue(); //  numéro de devis
  const dateDebut = sheet.getRange(row, 22).getDisplayValue(); // la date de début (au format affiché !)
  const travaux = sheet.getRange(row, 4).getValue(); // détail des travaux
  const ot = sheet.getRange(row, 21).getValue(); //numéro d'OT
  const sujet = "Nouveau chantier : " + numeroDevis; // Prépare le sujet de l'email texte + numéroDevis
  const corps = "Bonjour,\n\nVoici les informations concernant le nouveau chantier :\n\nNuméro de devis : " + numeroDevis + "\nDate de début : " + dateDebut + "\nNuméro d'OT : " + ot + "\nDétail des travaux : " + travaux + "\n"; // Prépare le corps de l'email
  MailApp.sendEmail(emailTechnicien, sujet, corps); // Envoie l'email au technicien
  range.setValue('email envoyé au technicien le ' + Utilities.formatDate(NOW, 'GMT+2', 'dd/MM/yyyy')); // Met à jour la cellule pour indiquer que l'email a été envoyé
}

/**
 * Fonction qui envoie un email au "cciaux".
 * Actuellement, cette fonction est vide et n'est pas implémentée.
 * 
 * @param {sheet} sheet - La feuille active.
 * @param {range} range - La plage où a eu lieu la modification.
 */
function sendMailToCciaux(sheet, range) {
  // Implémentation à ajouter
}
Rechercher des sujets similaires à "apps script envoi email"