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
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
ceci est le google form
https://docs.google.com/forms/d/1k9Az9ce7glU96uABGQFx_a4nLJNmkGlNueDehbDMLaE/edit
ceci est la feuille
il me faudra votre mail pour le partage je pense pour info
merci bonne soiree
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
});
}
}
}
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"
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, 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 :
- 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".
- Une fois l'onglet Développeur activé, cliquez dessus.
- Dans l'onglet Développeur, cliquez sur "Insertion" dans le groupe "Contrôles".
- Sélectionnez "Case à cocher" dans la liste des contrôles.
- 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.
- Une fois que la case à cocher est insérée, vous pouvez la déplacer et la redimensionner selon vos besoins.
Cdlt
Alex