Google Apps Script表单发信后如何在Sheet的F列写入EMAIL_SENT标记
错误原因
你的脚本存在4个核心问题导致无法写入标记:
- 变量名不匹配:你将工作表实例赋值给了
ws变量,但写入时调用了未定义的sheet变量,这是触发运行报错的直接原因 - 索引相关变量不存在:
startRange和i两个变量没有提前定义,也没有在遍历逻辑中维护行号,无法定位要写入的行 - 数据读取范围错误:你仅读取了B到D列的数据,
row数组最多只有3个元素,row[4]读取不到对应列的值,同时也覆盖不到你要写入的F列 - 列索引错误:你要写入的F列对应工作表的第6列,原代码写的第4列是D列,列位完全不匹配
修正后可直接使用的脚本
var EMAIL_SENT = "EMAIL_SENT"; function sendMail() { // 列索引对应读取范围:B列=0,C列=1,D列=2,F列=4(读取范围从B开始计算偏移) var emailCol = 0; var nameCol = 1; var phoneCol = 2; var sentFlagCol = 4; var emailTemp = HtmlService.createTemplateFromFile("email"); var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("form1"); // 读取范围扩展到F列,保证能读取已发送标记、支持写入标记 var data = ws.getRange("B2:F" + ws.getLastRow()).getValues(); // 遍历的时候带上索引i,用来定位对应行 data.forEach(function(row, i){ // 已经发送过的直接跳过 if (row[sentFlagCol] == EMAIL_SENT) return; emailTemp.fullname = row[nameCol]; emailTemp.phone = row[phoneCol]; var htmlMessage = emailTemp.evaluate().getContent(); GmailApp.sendEmail( row[emailCol], "Thank you!", "Your email doesn't support HTML.", {name: "Email App", htmlBody: htmlMessage} ); // 定位到对应行的F列写入标记:行号是2+i(因为数据从第二行开始读取),列号是6(F列是工作表第6列) ws.getRange(2 + i, 6).setValue(EMAIL_SENT); SpreadsheetApp.flush(); }); }
注意事项
如果后续你的表格列结构有调整,只需要修改对应列的索引数值即可,原来配置的On form submit触发条件无需改动。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

