Envoie email suite à une case cochée dans une colonne

Bonjour

J'essaie de modifier quelques peu un script :

En fait j'ai 2 scripts le premier script permet l'envoi d'un email automatique et ça fonctionne.

par contre j'aimerais y ajouter une alternative en effet:

Dans j'ai crée une colonne supplementaire en C et je souhaite coché dans cette colonne une cellule " en manuel" me permettant l'envoi d'un second mail quelques peu different

J'ai bien avancer mais j'ai une erreur que j'arrive pas à definir à priori cela provient d'un déclencheur ci-dessous le script

l'erreur qu'il me renvoie est celle ci :

18 mars 2024, 12:59:02ErreurTypeError: Cannot read properties of undefined (reading 'length')
at onFormSubmit(Code:5:25)

function onFormSubmit(e) { var responses = e.namedValues; var sheet = SpreadsheetApp.getActiveSheet(); var row = sheet.getActiveRange().getRow(); var column = e.values.length + 1; try { MailApp.sendEmail({ to: responses['VOTRE EMAIL'][0], subject: 'Confirmation de réservation', htmlBody: `Bonjour,<br><br>je vous confirme votre réservation pour le<br>${responses['DATE DE RESERVATION'][0]}<br><br>vous etes inscrits dans <br>${responses['CATEGORIE DE PILOTE'][0]}<br><br>Cordialement,<br>Moto-Club` }); var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM yyyy hh:mm a"); sheet.getRange(row, column).setValue('Confirmé le : ' + d); } catch (e) { sheet.getRange(row, column).setValue(error); } envoyerEmailSecond(); // Appel de la fonction d'envoi d'email secondaire } function envoyerEmailSecond() { var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var dernierLigne = feuille.getLastRow(); var colonneEnvoi = feuille.getRange("C2:C" + dernierLigne).getValues(); // Colonnes des cases cochées var emails = feuille.getRange("B2:B" + dernierLigne).getValues(); // Colonnes des adresses email var objet = "Avis de non-présence à l'événement"; // Objet de l'e-mail var corpsMessage = "Bonjour,<br><br>Je vous informe conformément aux directives de réservation de notre formulaire que vous n'avez pas prévenu le moto-club de votre empêchement.<br>Nous vous prions de régler votre accès par avance. Nous allons vous envoyer un lien pour votre règlement. Après votre règlement, votre réservation sera effective.<br><br>Bonne journée."; // Corps du message de l'e-mail for (var i = 0; i < colonneEnvoi.length; i++) { if (colonneEnvoi[i][0] == true) { // Vérifie si la case est cochée var destinataire = emails[i][0]; // Envoi de l'e-mail MailApp.sendEmail({ to: destinataire, subject: objet, htmlBody: corpsMessage }); } } }

Merci

Bonjour, il faudrait que tu copies ton script dans la case code.

code

Cdlt

Alex

Ok merci

function onFormSubmit(e) {
  var responses = e.namedValues;
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = sheet.getActiveRange().getRow();
  var column = e.values.length + 1;

  try {
    MailApp.sendEmail({
      to: responses['VOTRE EMAIL'][0],
      subject: 'Confirmation de réservation',
      htmlBody: `Bonjour,<br><br>je vous confirme  votre réservation pour le<br>${responses['DATE DE RESERVATION'][0]}<br><br>vous etes inscrits dans <br>${responses['CATEGORIE DE PILOTE'][0]}<br><br>Cordialement,<br>Moto-Club`
    });
    var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM yyyy hh:mm a");
    sheet.getRange(row, column).setValue('Confirmé le : ' + d);
  } catch (e) {
    sheet.getRange(row, column).setValue(error);
  }

  envoyerEmailSecond(); // Appel de la fonction d'envoi d'email secondaire
}

function envoyerEmailSecond() {
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dernierLigne = feuille.getLastRow();
  var colonneEnvoi = feuille.getRange("C2:C" + dernierLigne).getValues(); // Colonnes des cases cochées
  var emails = feuille.getRange("B2:B" + dernierLigne).getValues(); // Colonnes des adresses email
  var objet = "Avis de non-présence à l'événement"; // Objet de l'e-mail
  var corpsMessage = "Bonjour,<br><br>Je vous informe conformément aux directives de réservation de notre formulaire que vous n'avez pas prévenu le moto-club de votre empêchement.<br>Nous vous prions de régler votre accès par avance. Nous allons vous envoyer un lien pour votre règlement. Après votre règlement, votre réservation sera effective.<br><br>Bonne journée."; // Corps du message de l'e-mail

  for (var i = 0; i < colonneEnvoi.length; i++) {
    if (colonneEnvoi[i][0] == true) { // Vérifie si la case est cochée
      var destinataire = emails[i][0];
      // Envoi de l'e-mail
      MailApp.sendEmail({
        to: destinataire,
        subject: objet,
        htmlBody: corpsMessage
      });
    }
  }
}

L'erreur "TypeError: Cannot read properties of undefined (reading 'length')" indique que dans la fonction onFormSubmit, une tentative est faite pour accéder à la propriété length d'une variable qui est undefined. Dans votre cas, l'erreur se produit à la ligne 5 du code.

Voici la ligne en question :

var column = e.values.length + 1;

L'erreur se produit probablement parce que e.values est undefined, ce qui signifie que la propriété values de l'objet e n'est pas définie ou n'est pas accessible dans ce contexte.

Dans le contexte de Google Apps Script, lorsqu'un formulaire est soumis, l'objet e contient les valeurs du formulaire dans la propriété namedValues, mais pas dans la propriété values.

Pour corriger cette erreur, vous devez ajuster votre code pour accéder aux valeurs du formulaire correctement. Si vous avez besoin du nombre de valeurs soumises dans namedValues, vous pouvez utiliser la méthode Object.keys() pour compter le nombre de clés dans namedValues,

par exemple :

var column = Object.keys(responses).length + 1;

Cela récupérera le nombre de clés (ou propriétés) dans l'objet responses, qui correspondra au nombre de valeurs soumises dans le formulaire. Ensuite, vous pouvez utiliser ce nombre pour déterminer la colonne dans laquelle écrire dans votre feuille de calcul.

Cdlt

Alex

Bonjour j'ai toujours une erreur en retour

20 mars 2024, 12:37:34ErreurTypeError: Cannot convert undefined or null to object
at onFormSubmit(Code:5:23)

function onFormSubmit(e) {
  var responses = e.namedValues;
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = sheet.getActiveRange().getRow();
  var column = Object.keys(responses).length + 1;

  try {
    MailApp.sendEmail({
      to: responses['VOTRE EMAIL'][0],
      subject: 'Confirmation de réservation',
      htmlBody: `Bonjour,<br><br>je vous confirme  votre réservation pour le<br>${responses['DATE DE RESERVATION'][0]}<br><br>vous etes inscrits dans <br>${responses['CATEGORIE DE PILOTE'][0]}<br><br>Cordialement,<br>Moto-Club`
    });
    var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM yyyy hh:mm a");
    sheet.getRange(row, column).setValue('Confirmé le : ' + d);
  } catch (e) {
    sheet.getRange(row, column).setValue(error);
  }

  envoyerEmailSecond(); // Appel de la fonction d'envoi d'email secondaire
}

function envoyerEmailSecond() {
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dernierLigne = feuille.getLastRow();
  var colonneEnvoi = feuille.getRange("C2:C" + dernierLigne).getValues(); // Colonnes des cases cochées
  var emails = feuille.getRange("B2:B" + dernierLigne).getValues(); // Colonnes des adresses email
  var objet = "Avis de non-présence à l'événement"; // Objet de l'e-mail
  var corpsMessage = "Bonjour,<br><br>Je vous informe conformément aux directives de réservation de notre formulaire que vous n'avez pas prévenu le moto-club de votre empêchement.<br>Nous vous prions de régler votre accès par avance. Nous allons vous envoyer un lien pour votre règlement. Après votre règlement, votre réservation sera effective.<br><br>Bonne journée."; // Corps du message de l'e-mail

  for (var i = 0; i < colonneEnvoi.length; i++) {
    if (colonneEnvoi[i][0] == true) { // Vérifie si la case est cochée
      var destinataire = emails[i][0];
      // Envoi de l'e-mail
      MailApp.sendEmail({
        to: destinataire,
        subject: objet,
        htmlBody: corpsMessage
      });
    }
  }
}

la premiere partie du formulaire fonctionne

C'est à dire il y a bien une réponse automatique à la réservation

maintenant

la seconde partie ne fonctionne pas

dans la colonne c je marque 0

ensuite j'ai le message d'erreur, si vous souhaitez je peux vous donner acces google et a la sheets aussi

merci

par avance

Bonjour,

L'erreur ne viendrait pas du fait d'exectuer le script sans événement ? si e = undefined alors forcément les variables basées sur e ne peuvent fonctionner.

J'ai lu le script rapidement, en gros onFormSubmit(e) se lance lorsqu'il y a un nouveau formulaire > OK

et envoyerEmailSecond(), quand doit il se lancer ? Manuellement si des cases sont cochées en colonne C de votre feuille sheet ? Donc rien a voir avec le formulaire ?

Si tel est le cas il faut lancer cette fonction indépendamment de la fonction onFormSubmit(e).

Le script semble correctement mis à jour pour résoudre l'erreur précédente. Maintenant, la variable column est correctement définie en comptant le nombre de clés dans l'objet responses.

Cependant, il y a un problème potentiel dans la fonction onFormSubmit. Lorsque vous capturez une erreur dans le bloc catch, vous essayez de définir la valeur de la cellule avec l'erreur en utilisant la variable error. Cependant, error n'est pas défini dans ce contexte. Vous devriez utiliser la variable e qui capture l'erreur. Voici comment vous pouvez corriger cela :

} catch (error) {
    sheet.getRange(row, column).setValue(error);
}

En utilisant error plutôt que e, vous capturez l'erreur générée dans le bloc catch et la stockez dans la cellule correspondante de la feuille de calcul.

À part cela, le script semble correct et devrait fonctionner correctement.

"si vous souhaitez je peux vous donner accès google et a la Sheets aussi"

si il y a encore une erreur on peut faire ça.

Cdlt

Alex

J'ai fais une demande d'accès

J'ai apporté quelques modification, pour le déclenchement d'un mail lorsque l'on coche en colonne "C" et ajouté une boite dialogue de confirmation d'envoi de mail.

j'ai séparé les scripts, il faut activer un déclencheur pour "onEdit" sur "Lors d'une modification"

Merci j'ai vu les modif

mais apres plusieur essai j'ai toujours ce message

22 mars 2024, 07:10:36ErreurTypeError: Cannot convert undefined or null to object
at onFormSubmit(Code:5:23)

function onFormSubmit(e) {
  var responses = e.namedValues;
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = sheet.getActiveRange().getRow();
  var column = Object.keys(responses).length + 1;

  try {
    MailApp.sendEmail({
      to: responses['VOTRE EMAIL'][0],
      subject: 'Confirmation de réservation',
      htmlBody: `Bonjour,<br><br>je vous confirme  votre réservation pour le<br>${responses['DATE DE RESERVATION'][0]}<br><br>vous etes inscrits dans <br>${responses['CATEGORIE DE PILOTE'][0]}<br><br>Cordialement,<br>Moto-Club`
    });
    var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM yyyy hh:mm a");
    sheet.getRange(row, column).setValue('Confirmé le : ' + d);
} catch (error) {
    sheet.getRange(row, column).setValue(error);
}

  envoyerEmailSecond(); // Appel de la fonction d'envoi d'email secondaire
}

function envoyerEmailSecond() {
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dernierLigne = feuille.getLastRow();
  var colonneEnvoi = feuille.getRange("B2:B" + dernierLigne).getValues(); // Colonnes des cases cochées
  var emails = feuille.getRange("M2:M" + dernierLigne).getValues(); // Colonnes des adresses email
  var objet = "Avis de non-présence à l'événement"; // Objet de l'e-mail
  var corpsMessage = "Bonjour,<br><br>Je vous informe conformément aux directives de réservation de notre formulaire que vous n'avez pas prévenu le moto-club de votre empêchement.<br>Nous vous prions de régler votre accès par avance. Nous allons vous envoyer un lien pour votre règlement. Après votre règlement, votre réservation sera effective.<br><br>Bonne journée."; // Corps du message de l'e-mail

  for (var i = 0; i < colonneEnvoi.length; i++) {
    if (colonneEnvoi[i][0] == true) { // Vérifie si la case est cochée
      var destinataire = emails[i][0];
      // Envoi de l'e-mail
      MailApp.sendEmail({
        to: destinataire,
        subject: objet,
        htmlBody: corpsMessage
      });
    }
  }
}

https://docs.google.com/spreadsheets/d/1TOey1LoH_tNWIhq8mz4WoCevFP__AY1ZCxOnLZEvGlc/edit?resourcekey...

Bonjour, si tu ne reprends pas mes scripts ça ne peux pas fonctionner, les colonnes de case à cocher ne sont pas bonne ainsi que les colonnes des mails.

on va faire un à la fois, et pas à pas, efface tout, reprends celui-là qui correspond à ton sujet de départ.

Nomme le "Envoyer second mail"

function envoyerEmailSecond(e) {
  var feuille = e.source.getActiveSheet();
  var row = e.range.getRow();
  var colonneEnvoi = feuille.getRange("C" + row).getValue(); // Case cochée dans la colonne "C"
  var email = feuille.getRange("L" + row).getValue(); // Adresse e-mail correspondante en colonne "L"
  var objet = "Avis de non-présence à l'événement";
  var corpsMessage = "Bonjour,<br><br>Je vous informe conformément aux directives de réservation de notre formulaire que vous n'avez pas prévenu le moto-club de votre empêchement.<br>Nous vous prions de régler votre accès par avance. Nous allons vous envoyer un lien pour votre règlement. Après votre règlement, votre réservation sera effective.<br><br>Bonne journée.";

  if (colonneEnvoi == true) { // Vérifie si la case est cochée
    // Envoi de l'e-mail
    MailApp.sendEmail({
      to: email,
      subject: objet,
      htmlBody: corpsMessage
    });

    // Affichage de la boîte de dialogue avec l'adresse e-mail envoyée
    Browser.msgBox('Mail envoyé à ' + email);
  }
}

// Fonction appelée par le déclencheur sur modification
function onEdit(e) {
  var feuille = e.source.getActiveSheet();
  var row = e.range.getRow();
  var column = e.range.getColumn();

  if (column == 3) { // Vérifie si la modification a eu lieu dans la colonne "C"
    envoyerEmailSecond(e); // Appel de la fonction d'envoi d'e-mail
  }
}

Crées un déclencheur sur modification qui appelle la fonction onEdit. Pour cela, suis ces étapes :

  • Dans l'éditeur de script, clique sur l'icône de l'horloge (Triggers) à côté de l'icône de lecture.
  • Cliquez sur "Ajouter un déclencheur".
  • Sélectionne la fonction "onEdit" dans la liste déroulante.
  • Sous "Type de déclencheur", sélectionne "Sur la modification".
  • Cliquez sur "Enregistrer".

Dans ce script les cases à cocher sont en "C" et il va chercher les mails correspondants en "L"

Entendu je vérifie

Bon cela fonctionne

Merci c'est sympa pour l'association du moto club pour info voici qui nous sommes sur facebook et nous avons un site aussi au nom du moto club cabannais

Notamment pour pourrez voir sur quoi vous nous avez aidé sur facebook BOUTON S'INSCRIRE vous pouvez faire une reservation au nom ALEXANDER et vous comprendrez tout.

J'ai mis en place a l'origine ce syteme en 2017 que j'ameliore constamment et vous y participez )-;

Si vous avez des sujestions sur le formulaire et ces ameliorations nous sommes preneurs

Aujourd'hui certains crees des aplications qui deviennent payantes .

Ne sachant pas d'ou vous etes vous etes le bienvenu au club quand nous sommes ouvert le 1 er et 3 em samedi de chaque mois on vous offrira une pizza Bon Weekend Pierre Jean

Bonjour et merci pour l'invitation j'irais voir sur Facebook.

Je vous souhaite une bonne continuation.

N'oubliez pas de clore ce sujet avec

Bon Week-End également,

Alex

bonjour Alexander

Je m'interroge sur un point

J'ai duplique un formulaire complet qui me permet de faire des test il fonctionne mais je n'arrive pas à faire apparaitre cette case a cocher dans exel savez ou peut etre mon erreur

icone

Bonjour, je ne connais pas bien Excel mais j'ai trouvé ça :

Pour faire apparaître une case à cocher dans Excel, vous pouvez suivre ces étapes :

  1. Assurez vous que l'onglet Développeur est visible dans le ruban Excel. Sinon, vous pouvez l'activer en suivant ces étapes :
    • Allez dans "Fichier" (ou "Office" dans les versions plus anciennes d'Excel).
    • Sélectionnez "Options".
    • Dans la fenêtre qui s'ouvre, choisissez "Personnaliser le ruban".
    • Cochez la case "Développeur" dans la liste des onglets à droite.
    • Cliquez sur "OK".
  2. Une fois l'onglet Développeur activé, cliquez dessus.
  3. Dans l'onglet Développeur, cliquez sur "Insertion" dans le groupe "Contrôles".
  4. Sélectionnez "Case à cocher" dans la liste des contrôles.
  5. Cliquez sur l'endroit de la feuille Excel où vous souhaitez insérer la case à cocher, puis dessinez la taille de la case à cocher à l'aide de votre souris.
  6. Une fois que la case à cocher est insérée, vous pouvez la déplacer et la redimensionner selon vos besoins.

Cdlt

Alex

Rechercher des sujets similaires à "envoie email suite case cochee colonne"