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

求助:如何通过MailApp发送Google表单提交的文件?

问题分析与修复方案

你的代码存在几个关键问题导致无法正常发送带附件的邮件,以下是具体问题和修复后的代码:

存在的问题

  • 变量重复声明:两次声明responses变量,覆盖了最初的ItemResponse对象数组,导致后续处理逻辑混乱。
  • 文件获取方式错误:表单文件上传项的getResponse()返回的是文件ID数组,而非可直接作为附件的文件对象,必须通过Drive服务获取实际文件。
  • 索引逻辑矛盾:注释标注文件是第一个响应项,但代码使用responses[1](数组索引从0开始,第一个项应为responses[0])。
  • 响应内容拼接错误:直接将数组responses拼接到邮件正文,会导致格式混乱,需要格式化输出。

修复后的代码

function onFormSubmit(e) {
  // 获取所有响应项(ItemResponse对象数组)
  const itemResponses = e.response.getItemResponses();
  // 获取文件上传项(根据实际位置调整索引,这里假设是第2个项,索引为1)
  const fileItemResponse = itemResponses[1];
  // 获取所有响应的文本内容数组
  const responseTexts = itemResponses.map(item => item.getResponse());
  
  // 获取文件ID数组(表单文件上传项返回的是ID数组)
  const fileIds = fileItemResponse.getResponse();
  // 将文件ID转换为Drive文件对象
  const attachments = fileIds ? fileIds.map(id => DriveApp.getFileById(id)) : [];

  // 邮件主题与正文
  const subject = "New File Uploaded";
  let body = "A new file has been uploaded.\n\n";
  // 格式化拼接所有响应内容
  itemResponses.forEach((item, index) => {
    body += `${item.getItem().getTitle()}: ${responseTexts[index]}\n`;
  });

  if (attachments.length > 0) {
    MailApp.sendEmail("someRandomEmail@gmail.com", subject, body, { attachments: attachments });
    Logger.log("File sent successfully!");
  }
}

关键修复点说明

  1. 区分响应对象与文本内容:用itemResponses存储原始的ItemResponse对象,responseTexts存储纯文本响应,避免变量覆盖。
  2. 正确获取文件对象:通过DriveApp.getFileById()将文件ID转换为可作为附件的文件对象,支持多文件上传(表单文件上传项允许用户上传多个文件,返回的是ID数组)。
  3. 索引修正:根据实际表单中文件上传项的位置调整索引(如果是第一个项则用itemResponses[0])。
  4. 正文格式化:遍历响应项,将问题标题和对应回答拼接成易读的格式。
  5. 空值处理:增加对fileIds的判断,避免无文件时出现错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:31:01