1

我想使用电子表格发送带有附件的批量谷歌邮件。在这个电子表格中,我输入了电子邮件地址、内容模板和相应的附件 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();
    }
   }
  }
4

1 回答 1

0

修改点:

  • 当我看到你的脚本时,我认为你的问题的原因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. 从这种情况来看,我认为这些文件可能是公开共享的或您的文件。如果我的理解是正确的,我认为您可以使用Drive Service ofDriveApp和方法getBlob直接检索文件。此外,正如您在GmailApp: sendEmail中看到的那样,attachments参数内部的option参数与BlobSource变量一起使用,与 return 相同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);
    }
  }
}

笔记:

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

参考:

于 2021-03-07T05:12:03.850 回答