我可以通过自动电子邮件从 Google 表单/Google 表格发送多个上传的附件吗?

Posted

技术标签:

【中文标题】我可以通过自动电子邮件从 Google 表单/Google 表格发送多个上传的附件吗?【英文标题】:Can I send multiple uploaded attachments from a Google Form/Google Sheet in an automated email? 【发布时间】:2021-08-19 18:30:35 【问题描述】:

我正在尝试使用一些 Google App 脚本创建一个链接到 Google 表格的 Google 表单,该脚本将从调查中获取一些答案,附加上传的文件,并向特定人员发送电子邮件.我已经能够弄清楚我在谷歌表格中收集数据并发送电子邮件的部分,但是我将上传的文件作为电子邮件附件的部分让我感到难过。

目前,我发送电子邮件的代码如下所示:

GmailApp.sendEmail(Recipient,subject,'',htmlBody: htmlText,);

但是看看the documentation on sendEmail,我似乎想在选项部分添加更多内容,对吧?所以如果我为此定义一个变量,我需要使用getFileById,但每次上传的文件ID都会不同。此外,我可能需要附加多个文件。

我创建了一个测试Google Form here,并将它附加到a Google Sheet here。你可以看到the Google App Script here。您可以通过查看代码中指定的 formtesting4@mailinator.com 来检查正在发送/接收的电子邮件是否成功。

这可能与我正在尝试做的事情有关吗?

【问题讨论】:

您好,我注意到您正在尝试创建一个 html 表。你打算做什么样的依恋?在您的 html 正文中的 Attachment 块下包含上传的文件链接?还是将文件附加在电子邮件本身而不是 html 正文中(使用附件选项)? HTML 表格位于电子邮件正文中。我可以通过引用适当的单元格来包含上传文件的链接,但我想将文件附加到电子邮件本身。我应该更清楚地说明这一点,但我想构建功能以便它可以在必要时处理多个文件。 【参考方案1】:

您可以参考这个示例脚本:

function emailMe() 

  const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const info = ss.getDataRange().getValues();

  info.forEach((entry,a) => 

    // Identify whether notification has been sent
    if (entry[4] === '') 


      // Collect entries
      var Recipient = "your@email.com"
      var subject = 'Roster Scheduler Update';
      Timestamp = entry[0];
      Name = entry[1];
      Roster = entry[2];
      attachment = "TEST";
      
      var attachmentBlobs = [];
      //Get the blob of all attachments available
      if(entry[3])
        var attachments = entry[3].split(', ');
      
        attachments.forEach(url => 
          var fileId = url.replace('https://drive.google.com/open?id=','');
          Logger.log(fileId);
          var file = DriveApp.getFileById(fileId);
          attachmentBlobs.push(file.getBlob());
        );
      
 
      let body = '';

      // Generate email
      var html = HtmlService.createTemplateFromFile("email.html");
      var htmlText = html.evaluate().getContent();
      
      // Send email
      GmailApp.sendEmail(Recipient, subject, body, htmlBody: htmlText, attachments: attachmentBlobs);

      // Email confidence
      const check = 'Sent';
      ss.getRange(a + 1,5).setValue(check);

    
  );

所做的更改:

使用File.getBlob()获取所有上传附件的blob文件。您可以从附件的 url 链接获取文件 ID 并使用 DriveApp.getFileById(id) 在GmailApp.sendEmail() 中包含body 以修复电子邮件内容问题 在GmailApp.sendEmail(recipient, subject, body, options) 中包含attachments 作为选项

输出:

示例 1:3 个附件

示例 2:1 个附件

【讨论】:

所以它看起来有效,除非有人不上传附件。我可能应该澄清一下,但并不总是需要将附件上传到 Google 表单。我假设将其包含在附件变量的某种 IF 语句中就足够了? 是的,只要一个 if 条件就足够了。我更新了答案。如果还有问题请告诉我 完美。这涵盖了一切。非常感谢你一直陪着我。我将阅读有关这些类和方法的一些文档,以了解更多关于它们的信息。我唯一添加的是一个额外的else attachment = "No attachment submitted" 来说明一个空提交。

以上是关于我可以通过自动电子邮件从 Google 表单/Google 表格发送多个上传的附件吗?的主要内容,如果未能解决你的问题,请参考以下文章

提交表单后发送电子邮件的 Google 表单应用脚本

Google 表单:将数据发送到电子表格

如何将我的数据从 Firestore 转换为身份验证用户

如何从 Google 电子表格中的 Google Apps 脚本自动更新“站点地图”功能?

通过 Google Cloud Platform 从 Firebase 发送自动电子邮件(无第三方)

从外部数据库自动加载 Google 电子表格数据