You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets自动邮件脚本报错求助:infoRandonneur未定义

问题诊断与修复方案

首先,你遇到的ReferenceError: infoRandonneur is not defined核心原因是模板变量赋值顺序颠倒,另外代码里还有两处潜在逻辑问题需要修正,我一步步给你拆解解决:

1. 紧急修复:模板变量赋值顺序错误

在envoyerMailProduit函数里,你先调用modele.evaluate().getContent()生成了邮件内容,之后才给modele.infoRandonneur = info赋值——这时候模板已经编译完成,根本没拿到变量值,自然会报“未定义”错误。

修正后的envoyerMailProduit函数:

function envoyerMailProduit(nom,prenom,mail,ligne){
  var mailRandonneur = mail;
  var info = recupererInfoCommande(mailRandonneur);
  
  // 先给模板绑定变量,再编译生成内容!
  var modele = HtmlService.createTemplateFromFile('ProduitCommande');
  modele.infoRandonneur = info; // 这行必须提前到evaluate之前
  var message = modele.evaluate().getContent();
  
  var adressemail = "baptistelautrette@hotmail.fr";
  MailApp.sendEmail({
    to: adressemail,
    subject: "Produits à commander pour un randonneur",
    htmlBody: message
  });
}

2. 修正工作表2的数据获取逻辑

在recupererInfoCommande里,你用工作表1的行号去读取工作表2的数据,这完全不合理——两个工作表的行号没有对应关系!你需要找到工作表2中邮箱匹配的那一行,再提取该行的目标列数据。

修正后的recupererInfoCommande函数:

function recupererInfoCommande(mailRandonneur) {
  var mailVerif = mailRandonneur;
  var feuille2 = SpreadsheetApp.getActive().getSheetByName('Form Responses 2');
  var dernier_rang2 = feuille2.getDataRange().getLastRow();
  
  for(var ligne=2; ligne<=dernier_rang2;ligne++){
    var mailRecherche = feuille2.getRange(ligne,2).getValue();
    if (mailVerif == mailRecherche){
      // 找到匹配行后,提取该行第6到26列的所有数据
      var enregistrement = feuille2.getRange(ligne,6,1,26).getValues()[0];
      var infoRandonneur = {
        sacH:enregistrement[0],
        sockH:enregistrement[1],
        tailleSockH: enregistrement[2],
        pantalonH:enregistrement[3],
        taillePantalonH:enregistrement[4],
        ponchoH:enregistrement[5],
        taillePonchoH:enregistrement[6],
        tshirtH:enregistrement[7],
        tailleTshirtH:enregistrement[8],
        polaireH:enregistrement[9],
        taillePolaireH:enregistrement[10],
        casquetteH:enregistrement[11],
        batonH:enregistrement[12],
        sacF:enregistrement[13],
        sockF:enregistrement[14],
        tailleSockF: enregistrement[15],
        pantalonF:enregistrement[16],
        taillePantalonF:enregistrement[17],
        ponchoF:enregistrement[18],
        taillePonchoF:enregistrement[19],
        tshirtF:enregistrement[20],
        tailleTshirtF:enregistrement[21],
        polaireF:enregistrement[22],
        taillePolaireF:enregistrement[23],
        casquetteF:enregistrement[24],
        batonF:enregistrement[25]
      };
      return infoRandonneur;
    }
  }
  
  // 新增:如果没找到匹配邮箱,返回默认值避免模板报错
  return { sacF: "未找到对应订单信息" };
}

3. 性能优化建议(可选)

目前你每次循环都单独调用getRange取值,数据量大时会很慢。建议一次性读取整个工作表数据到内存,再遍历查找,减少API调用次数:

function recupererInfoCommande(mailRandonneur) {
  var mailVerif = mailRandonneur;
  var feuille2 = SpreadsheetApp.getActive().getSheetByName('Form Responses 2');
  // 一次性读取所有数据到内存
  var allData = feuille2.getDataRange().getValues();
  
  // 从第2行开始遍历(allData[0]是表头)
  for(var ligne=1; ligne<allData.length;ligne++){
    var mailRecherche = allData[ligne][1]; // 第2列(索引1)是邮箱
    if (mailVerif == mailRecherche){
      // 截取当前行第6到26列(索引5到25)的数据
      var enregistrement = allData[ligne].slice(5, 31);
      var infoRandonneur = {
        sacH:enregistrement[0],
        sockH:enregistrement[1],
        tailleSockH: enregistrement[2],
        pantalonH:enregistrement[3],
        taillePantalonH:enregistrement[4],
        ponchoH:enregistrement[5],
        taillePonchoH:enregistrement[6],
        tshirtH:enregistrement[7],
        tailleTshirtH:enregistrement[8],
        polaireH:enregistrement[9],
        taillePolaireH:enregistrement[10],
        casquetteH:enregistrement[11],
        batonH:enregistrement[12],
        sacF:enregistrement[13],
        sockF:enregistrement[14],
        tailleSockF: enregistrement[15],
        pantalonF:enregistrement[16],
        taillePantalonF:enregistrement[17],
        ponchoF:enregistrement[18],
        taillePonchoF:enregistrement[19],
        tshirtF:enregistrement[20],
        tailleTshirtF:enregistrement[21],
        polaireF:enregistrement[22],
        taillePolaireF:enregistrement[23],
        casquetteF:enregistrement[24],
        batonF:enregistrement[25]
      };
      return infoRandonneur;
    }
  }
  
  return { sacF: "未找到对应订单信息" };
}

最后测试

按上述修改调整后,重新运行MailProduit(),应该就能正常读取infoRandonneur.sacF并发送邮件了。如果还有问题,可以检查工作表2中邮箱列是否确实是第2列,以及对应行的数据是否完整。

内容的提问来源于stack exchange,提问作者baptiste

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:12:35