无法将导出的 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名是attachments
,content
也是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);
。所以也请测试一下。
参考:
我正在尝试将 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名是attachments
,content
也是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);
。所以也请测试一下。