使用应用程序脚本在 Gmail 中批量发送带有相应附件的电子邮件

BulkSend emails with respective attachments in Gmail using appscript

我想使用电子表格批量发送 google 带附件的邮件。在这个 spreadsheet 中,我已经放置了电子邮件地址、内容模板和相应的附件 url。

当我尝试执行下面的代码时,除了 行项目 #21 “attachments.push(file.getAs(MimeType.PDF)) 之外,一切都很顺利。 ",显示错误。当我删除第 21 行并执行时,我可以发送带有 HTML 附件的批量电子邮件,而不是包含病毒并被标记为垃圾邮件的 PDF。

有人可以用正确的代码帮助我执行相同的操作并直接发送 pdf 而不是 HTML

var EMAIL_SENT = "EMAIL_SENT";
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  
var numRows = 3; 
var blobs = [];

var dataRange = sheet.getRange(startRow, 1, numRows, 5)

var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[2]; 
var subject = "Attachments";       
var message = row[4];       
var options = {muteHttpExceptions:true};
var attachments = UrlFetchApp.fetch(row[3], options).getBlob();     
attachments.push(file.getAs(MimeType.PDF));
var emailSent = row[0];     
if (emailSent != EMAIL_SENT) {  
  
  GmailApp.sendEmail(emailAddress, subject, message, {attachments: attachments,});
  
  sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
 
  SpreadsheetApp.flush();
    }
   }
  }

修改点:

  • 当我看到您的脚本时,我认为您在 attachments.push(file.getAs(MimeType.PDF)) 出现问题的原因是由于 var attachments = UrlFetchApp.fetch(row[3], options).getBlob();。在这一行,attachments 是 HTTPResponse 对象。为此,您的 attachments.push(file.getAs(MimeType.PDF)) 脚本尝试将 file.getAs(MimeType.PDF) 设置为 attachments。由此,错误发生。并且,file 未声明。
  • 而且,当我看到您的电子表格时,我注意到文件的 URL 是 https://drive.google.com/file/d/###/view?usp=sharing 等公开共享文件的 link。从这种情况来看,我认为那些文件可能是公开共享的或您的文件。如果我的理解是正确的,我认为你可以使用 Drive Service of DriveApp and the method getBlob. Furthermore, as you can see in GmailApp: sendEmail 直接检索文件,option 参数中的 attachments 参数与 BlobSource 变量一起使用, 与 returns getBlob.
  • 相同

当以上几点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

var EMAIL_SENT = "EMAIL_SENT";

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  var numRows = 3;
  var dataRange = sheet.getRange(startRow, 1, numRows, 5);
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[2];
    var subject = "Attachments";
    var message = row[4];
    var fileId = row[3].split("/")[5];
    var emailSent = row[0];
    try {
      var file = DriveApp.getFileById(fileId);
      if (emailSent != EMAIL_SENT) {
        GmailApp.sendEmail(emailAddress, subject, message, { attachments: [file.getBlob()] });
        sheet.getRange(startRow + i, 1).setValue(EMAIL_SENT);
        // SpreadsheetApp.flush(); // I think that this might not be required to be used.
      }
    } catch(e) {
      console.log("File of " + row[3] + "cannot be retrieved. Error message is " + e.message);
    }
  }
}

注:

  • 在上面的脚本中,当URL(row[3])的文件无法检索时,可以在日志中看到URL。

参考: