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

Google Apps Script无法自动发送邮件通知问题求助

解决Google Apps Script Web App提交表单后无法自动发送邮件的问题

问题场景

关联Google Sheets的网站表单提交后,数据可正常写入表格,但通过doPost调用sendEmailNotificationFromSheet时无法自动发送通知邮件,手动运行该函数却能正常发送。

可能原因

  • Active Sheet上下文不一致:Web App运行时,getActiveSheet()可能指向非目标工作表(比如存在多个Sheet时),导致读取不到最新提交的数据。
  • 数据写入延迟:appendRow执行后,Sheet可能未立即完成数据持久化,此时调用getLastRow()读取的不是刚提交的行。
  • Web App权限不足:部署时的权限配置限制了MailApp在Web App上下文下的执行权限。

解决方案

方案1:直接传递表单数据给邮件函数(推荐)

跳过从Sheet重新读取数据的步骤,直接把doPost中获取的表单参数传给邮件发送函数,彻底避免上下文和延迟问题。

修改后的完整代码:

function doPost(e) {
  try {
    var sheet = getSheet();
    var params = e.parameter;
    Logger.log('收到的参数: ' + JSON.stringify(params));

    var name = params.name || '未填写';
    var email = params.email || '未填写';
    var phone = params.phone || '未填写';
    var service = params.service || '未填写';
    var extraServices = params.selectedServices || '无';
    var date = params.date || '未填写';

    // 写入Sheet
    sheet.appendRow([name, email, phone, service, extraServices, date]);
    Logger.log('预约记录已写入Sheet: ' + name);

    // 直接传递数据给邮件函数
    sendEmailNotification(name, email, phone, service, extraServices, date);

    return ContentService.createTextOutput(JSON.stringify({
      "result": "success",
      "data": params
    })).setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    Logger.log('错误: ' + error.toString());
    return ContentService.createTextOutput(JSON.stringify({
      "result": "error",
      "error": error.toString()
    })).setMimeType(ContentService.MimeType.JSON);
  }
}

// 修改邮件函数,直接接收参数
function sendEmailNotification(name, email, phone, service, extraServices, date) {
  try {
    Logger.log('待发送邮件数据 - 姓名: ' + name + ', 邮箱: ' + email + ', 电话: ' + phone + ', 服务: ' + service + ', 额外服务: ' + extraServices + ', 日期: ' + date);

    // 管理员邮箱,替换为你的实际邮箱
    var adminEmail = "xxxxx@gmail.com";

    // 管理员邮件内容
    var subjectAdmin = "新预约已收到";
    var bodyAdmin = "新预约已收到:\n\n" +
      "姓名: " + name + "\n" +
      "邮箱: " + email + "\n" +
      "电话: " + phone + "\n" +
      "服务: " + service + "\n" +
      "额外服务: " + extraServices + "\n" +
      "日期: " + date;

    MailApp.sendEmail(adminEmail, subjectAdmin, bodyAdmin);
    Logger.log('管理员邮件已发送至: ' + adminEmail);

    // 用户确认邮件内容
    var subjectUser = "预约确认通知";
    var bodyUser = "亲爱的 " + name + ",\n\n" +
      "感谢您预约xxxxx服务,以下是您的预约详情:\n\n" +
      "服务: " + service + "\n" +
      "额外服务: " + extraServices + "\n" +
      "日期: " + date + "\n\n" +
      "期待您的到来!\n\n" +
      "此致,\n" +
      "xxxxx";

    MailApp.sendEmail(email, subjectUser, bodyUser);
    Logger.log('用户确认邮件已发送至: ' + email);
  } catch (error) {
    Logger.log('发送邮件通知时出错: ' + error.toString());
  }
}

function getSheet() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // 替换为你的目标工作表名称,避免依赖Active Sheet
  var sheet = spreadsheet.getSheetByName("Sheet1"); 
  return sheet;
}

方案2:修正Sheet读取逻辑

如果坚持从Sheet读取数据,需确保指向固定工作表,并添加延迟确保数据写入完成:

function doPost(e) {
  try {
    var sheet = getSheet();
    var params = e.parameter;
    Logger.log('收到的参数: ' + JSON.stringify(params));

    var name = params.name || '未填写';
    var email = params.email || '未填写';
    var phone = params.phone || '未填写';
    var service = params.service || '未填写';
    var extraServices = params.selectedServices || '无';
    var date = params.date || '未填写';

    sheet.appendRow([name, email, phone, service, extraServices, date]);
    Logger.log('预约记录已写入Sheet: ' + name);

    // 添加1秒延迟,确保数据写入Sheet
    Utilities.sleep(1000);

    sendEmailNotificationFromSheet();

    return ContentService.createTextOutput(JSON.stringify({
      "result": "success",
      "data": params
    })).setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    Logger.log('错误: ' + error.toString());
    return ContentService.createTextOutput(JSON.stringify({
      "result": "error",
      "error": error.toString()
    })).setMimeType(ContentService.MimeType.JSON);
  }
}

function getSheet() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // 使用固定工作表名称
  var sheet = spreadsheet.getSheetByName("Sheet1"); 
  return sheet;
}

方案3:检查Web App部署权限

  1. 打开脚本编辑器,点击右上角「部署」→「新部署」
  2. 选择部署类型为「Web应用」
  3. 配置选项:
    • 执行身份:选择「我(你的邮箱)」
    • 谁可以访问:根据需求选择「任何人,甚至匿名」或「任何人」
  4. 点击「部署」,将新生成的Web App URL更新到你的表单中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:14:50