无法将导出的 Excel 文件附加到 Google Apps 脚本中的 sendGrid 电子邮件

Trouble attaching exported Excel file to a sendGrid email in Google Apps Script

我正在尝试将 Google sheet 导出为 excel 文件,然后将其附加到 sendGrid 电子邮件。电子邮件通过时没有附件。

我认为这与 base64 编码有关,但不确定我哪里出错了。

这是我导出 excel 并尝试将其发送到 sendGrid 函数的代码:

function getGoogleSpreadsheetAsExcel(){

 try {

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var blankSS = 'xxxxxxxxxxxxxxxxxxxxxxx';
    var donations = ss.getSheetByName('Donations');
    var getrange = donations.getDataRange();
    var data = getrange.getValues();
    var header = data[0].slice(0, 13);
    var dataArray = [];

    dataArray.push(header);

    for(var i=0;i<data.length;i++){
        const sent = data[i][14];
       if(sent){
        continue;
       }else{
        const row = data[i];
        row.splice(-2);
        dataArray.push(row);
        }
   }

    var temp = SpreadsheetApp.openById(blankSS).getActiveSheet();

    if(dataArray.length > 1){

    dataArray.forEach((row) => temp.appendRow(row));
    
    var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + blankSS + "&exportFormat=xlsx";

    var params = {
      method      : "get",
      headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}
    };

    var blob = UrlFetchApp.fetch(url, params).getBlob().getBytes();
    var doc = Utilities.base64EncodeWebSafe(blob);

    const subject = "Activity Report";
    const body = "Please see attached spreadsheet of recent purchases.";

    sendEmailWithSendGrid(subject,body,doc);
    
    donations.getRange(2, 15, donations.getLastRow()-1).setValue('sent');
    
    }

    temp.clear()
 } 

 catch (f) {
    MailApp.sendEmail("xxxxxxxxxx@gmail.com", "Script Error", f);
  }

}

这里是 sendGrid 函数:

function sendEmailWithSendGrid(subject,body,attachments){

const key = 'SG.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const url = 'https://api.sendgrid.com/v3/mail/send';

  var payload = {
  "personalizations": [{"to": [{"email": "xxxxxxxxxxxxxx@gmail.com"}]}],
  "from": {"email": "xxxxxxxxxxx@gmail.com"},
  "subject": subject,
  "content": [{ "type": "text/plain", "value": body }],
  "attachment": [{"content": attachments, "type": "text/plain" , "filename": "testExcel.xlsx"}]
  };
  
  var options = {
    "method" : "post",
    "payload" : JSON.stringify(payload)
  };
  
  options.headers = {    
    "Authorization" : "Bearer " + key,
    "Content-Type" : "application/json"
    
  };
  var res = UrlFetchApp.fetch(url, options);
  Logger.log(JSON.stringify(res.getResponseCode()));

}

查看[=16=的Request Body的官方文档],好像是key名是attachmentscontent也是Base64编码后的内容。那么下面的修改呢?

发件人:

"attachment": [{"content": attachments, "type": "text/plain" , "filename": "testExcel.xlsx"}]

收件人:

"attachments": [{"content": attachments, "type": "text/plain" , "filename": "testExcel.xlsx"}]

并且,在您的情况下,var doc = Utilities.base64EncodeWebSafe(blob); 可能是 var doc = Utilities.base64Encode(blob);。所以也请测试一下。

参考: