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 :

image

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 :

image

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 :

image

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 :

image

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.

Rechercher des sujets similaires à "apps script erreur typeerror envoie mail"