表单提交至谷歌表格后触发邮件发送的脚本集成问题求助
表单提交至谷歌表格后触发邮件发送的脚本集成问题求助
我在使用一个能把数据写入谷歌表格的App Script脚本,它本身运行完全正常。现在我想在脚本执行完成后给自己发一封邮件,于是写了一个EmailNote()函数——单独在编辑器里运行这个函数时邮件能正常发送,但把它集成到doPost(e)脚本里之后,就收不到邮件了,求大神帮忙看看问题出在哪!
我的doPost(e)脚本:
// Manual: https://github.com/levinunnink/html-form-to-google-sheet var sheetName = 'Entries' var scriptProp = PropertiesService.getScriptProperties() function intialSetup () { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { var lock = LockService.getScriptLock() lock.tryLock(10000) try { var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) var sheet = doc.getSheetByName(sheetName) var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] var nextRow = sheet.getLastRow() + 1 var newRow = headers.map(function(header) { return header === 'timestamp' ? new Date() : e.parameter[header] }) sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]) return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })) .setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })) .setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } }
我的EmailNote()脚本:
function EmailNote() { var emailSender = "my.mail@gmail.com"; var emailRecipients = ["my.mail@gmail.com", "my@mail.com"]; var emailSubject = "App Script - Email"; var emailBody ='App Script - Email'; // send mail GmailApp.sendEmail(emailRecipients.join(","), emailSubject, emailBody, { from: emailSender }); }
问题分析与解决方法
单独运行EmailNote()正常,但在doPost里调用失效,主要有两个核心问题:
- 最直接的疏漏:你当前的
doPost代码里根本没调用EmailNote()函数,自然不会触发邮件发送😂 - 潜在的权限问题:
doPost作为Web App运行时,权限配置不对会导致GmailApp无法执行,比如部署时选了“以用户身份运行”而不是“部署者身份”。
具体修复步骤
在
doPost中添加EmailNote()调用:
把调用放在数据写入表格成功之后、返回响应之前的位置,确保只有当数据正常写入时才触发邮件。修改后的doPost代码如下:// Manual: https://github.com/levinunnink/html-form-to-google-sheet var sheetName = 'Entries' var scriptProp = PropertiesService.getScriptProperties() function intialSetup () { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { var lock = LockService.getScriptLock() lock.tryLock(10000) try { var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) var sheet = doc.getSheetByName(sheetName) var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] var nextRow = sheet.getLastRow() + 1 var newRow = headers.map(function(header) { return header === 'timestamp' ? new Date() : e.parameter[header] }) sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]) // 新增:调用邮件发送函数 EmailNote(); return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })) .setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })) .setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } }确认Web App部署权限:
重新部署脚本时,一定要选:- 执行权限:以部署者的身份运行
- 谁可以访问:任何人(甚至匿名)
因为表单提交通常是匿名请求,权限配置错误会导致邮件服务或表格写入功能失效。
额外优化建议
可以让邮件内容更实用,比如把刚提交的表单数据放进邮件里,修改EmailNote为带参数的函数:
// 修改后的带参数邮件函数 function EmailNote(submittedData) { var emailSender = "my.mail@gmail.com"; var emailRecipients = ["my.mail@gmail.com", "my@mail.com"]; var emailSubject = "新的表单提交通知"; // 把提交数据转成易读的文本格式 var emailBody = "收到新的表单提交,内容如下:\n" + submittedData.join("\n"); GmailApp.sendEmail(emailRecipients.join(","), emailSubject, emailBody, { from: emailSender }); } // 对应doPost里的调用改为: EmailNote(newRow);
备注:内容来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

