Apps Script - Erreur TypeError envoie mail
Bonjour,
J'ai fais un copier/coller de mon script de l'an dernier sur le nouveau fichier Sheet que j'ai crée.
En gros, lorsqu'une réponse à un formulaire est envoyée vers le fichier sheet, la personne qui a répondu est censée recevoir un mail de confirmation.
Mais mon script ne fonctionne pas et voici l'erreur :
ErreurTypeError: Cannot read properties of undefined (reading '1')confmail@ Code.gs:12
Quelqu'un aurait-il une idée de ce qui bloque ?
Voici mon script :
function confmail() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var feuille_1 = ss.getSheetByName("Réponses_msg");
var texte_mail = ss.getSheetByName("Message");
var subject = texte_mail.getRange(2, 1).getValue();
var data = feuille_1.getDataRange().getValues();
var lastRowWithData = data.length;
while (lastRowWithData > 0 && data[lastRowWithData - 1][0] === "") {
lastRowWithData--;}
var rowData = data[lastRowWithData - 1];
var emailadresse = rowData[1];
var prenom = rowData[3]; // Prénom
var activgym = rowData[4]; // ActivGym
var badminton = rowData[5]; // Badminton
var fitgym = rowData[6]; // FitGym
var gymsportsante = rowData[7]; // Gym Sport Sante
var handball = rowData[8]; // Hand
var babyhand = rowData[9]; // BabyHand
var karatekid = rowData[10]; // karate kid
var kravmaga = rowData[11]; // krav maga
var montagne = rowData[12]; // montagne
var pilates = rowData[13]; // pilates
var qigong = rowData[14]; // qi gong
var tennisdetable = rowData[15]; // tennisdetable
var yogalundi = rowData[16]; // yoga lundi
var yogavendredi = rowData[17]; // yoga vendredi
var cotisation = rowData[22]; // cotisation
var messagemail = texte_mail.getRange(2, 2).getValue(); // le message
messagemail = messagemail.replace("<Prénom>", prenom)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Activ'Gym : 75 €]>", activgym)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Badminton : 55 €]>", badminton)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Fit'Gym : 75 €]>", fitgym)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Gym Sport Santé : 90 €]>", gymsportsante)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Handball : 110 €]>", handball)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [BabyHand : 80 €]>", babyhand)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Karaté Kid : 150 €]>", karatekid)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Krav Maga : 150 €]>", kravmaga)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Montagne (gratuit)]>", montagne)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Pilates : 155 €]>", pilates)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Qi Gong : 150 €]>", qigong)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Tennis de Table : 20 €]>", tennisdetable)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Yoga Lundi : 170 €]>", yogalundi)
.replace("<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [Yoga Vendredi : 170 €]>", yogavendredi)
.replace("<Cotisation>", cotisation);
Logger.log("Le mail va être envoyé à : " + emailadresse)
Logger.log("Sujet du mail : " + subject)
Logger.log("corps du mail : " + messagemail)
MailApp.sendEmail(emailadresse, subject, messagemail);
}Je vous partage également mon fichier sheet : https://docs.google.com/spreadsheets/d/1KaMd1f6KJi6us9GCVdBP6wQbTbWzmwL04nNNVoB35jw/edit?usp=sharing
Merci pour votre aide
Cordialement.
Salut,
Demande d'accès faite, mais ajoute ce log ici :
var rowData = data[lastRowWithData - 1];
console.log(rowData )Et là je pense que tu va voir ce qui pose problème
EDIT : après avoir eu l'accès j'ai mis le log et voici le résultat :
Cela signifie donc que rowData n'est pas correct, il faut donc remonter le script pour voir ce qui bloque.
C'est donc ici que se pose le pb :
J'ai log lastRowWithData et le résultat est... 1000 sauf que dans ta feuille c'est en fait la ligne 2, cela est causé par ta super formule en V2 :
Mais la boucle while semble palier à ce problème, en vérifeir si data[lastRowWithData -1][0] est vide, je pense que cela vise l'email ? Si c'est le cas, il ne faut pas viser la position 0, mais 1, car l'email est en colonne B de ton fichier, en faisant le test de changer 0 en 1, voici le résultat :
Ca fonctionne, c'est donc ça qui posait problème !
Voici toutefois une version + succincte de ton script :
function confmail2() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const [reponses, messageSheet] = ["Réponses_msg", "Message"].map(n => ss.getSheetByName(n));
const [subject, template] = messageSheet.getRange(2, 1, 1, 2).getValues()[0];
const data = reponses.getDataRange().getValues();
const lastRow = reponses.getRange("B:B").getValues().filter(String).length;
const row = data[lastRow - 1];
const sectionLabels = [
["Activ'Gym : 75 €", 4], ["Badminton : 55 €", 5], ["Fit'Gym : 75 €", 6],
["Gym Sport Santé : 90 €", 7], ["Handball : 110 €", 8], ["BabyHand : 80 €", 9],
["Karaté Kid : 150 €", 10], ["Krav Maga : 150 €", 11], ["Montagne (gratuit)", 12],
["Pilates : 155 €", 13], ["Qi Gong : 150 €", 14], ["Tennis de Table : 20 €", 15],
["Yoga Lundi : 170 €", 16], ["Yoga Vendredi : 170 €", 17]
];
let message = template
.replace("<Prénom>", row[3])
.replace("<Cotisation>", row[22]);
sectionLabels.forEach(([label, i]) => {
message = message.replace(
`<Sélectionnez la ou les section(s) pour la(es)quelle(s) vous souhaitez vous inscrire [${label}]>`,
row[i]
);
});
Logger.log(`Mail à : ${row[1]}\nSujet : ${subject}\nMessage :\n${message}`);
MailApp.sendEmail(row[1], subject, message);
}Bonjour à tous,
Très élégant ta réfactorisation avec la boucle @Pierre, et félicitations pour tes explications détaillées et didactiques.
Au plaisir de lire tes contributions sur le forum !
Bonjour,
Merci beaucoup Pierre.
J'ai réajuster les numéros des Row afin qu'ils correspondent bien avec les champs de mon mail et j'ai rajouté le déclencheur.
Tout fonctionne.
Merci beaucoup.