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
相关产品推荐
相关产品推荐

