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

表单提交至谷歌表格后触发邮件发送的脚本集成问题求助

表单提交至谷歌表格后触发邮件发送的脚本集成问题求助

我在使用一个能把数据写入谷歌表格的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里调用失效,主要有两个核心问题:

  1. 最直接的疏漏:你当前的doPost代码里根本没调用EmailNote()函数,自然不会触发邮件发送😂
  2. 潜在的权限问题:doPost作为Web App运行时,权限配置不对会导致GmailApp无法执行,比如部署时选了“以用户身份运行”而不是“部署者身份”。

具体修复步骤

  1. 在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()
      }
    }
    
  2. 确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:09:33