Ниже код отправляет электронные письма, включая таблицу в теле со строками данных и заголовком в формате html.Он также присоединяет те же данные в файл xlsx и pdf.Кому-то нравится в pdf, кому-то нравится в теле письма, кому-то нравится в xlsx, так что ...
У меня есть 2 проблемы с кодом ниже:
Результат цикла, таблица / строки, должны быть записаны на листе Google (экспорт).Затем этот лист будет прикреплен в формате PDF и XLSX к отправленному письму.
В настоящее время лист «Экспорт» уже прикреплен, но он «пустой», так как данные еще не записаны в лист экспорта, вот вопрос, как?
Я уже пытался добавитьстроки "xlsxTable + = data [row] [col];"в коде, чтобы перехватить данные, но я не думаю, что это правильный способ сделать это.
Вторая проблема заключается в том, что иногда вложение (xlsx) не «правильно» отформатировано и содержит следующие слова: «Этот файл может быть un ".(Предварительный просмотр Google) При загрузке xlsx говорится, что формат файла неправильный ... но странно то, что при отправке 3 разных писем 2 из них в порядке, 1 - нет, иногда все в порядке.Возможно, это проблема синхронизации и должна включать паузу.
Любая помощь приветствуется, спасибо!
Ниже в коде используются листы Google, с 4 листами внутри: данные, электронные письма, параметры, экспорт.
Таблица данных
ID Name Amount Date
1000 Company 500.23 01/01/2019
2000 Company 500.23 01/01/2019
1000 Company 500.23 01/01/2019
3000 Company 500.23 01/01/2019
1000 Company 500.23 01/01/2019
2000 Company 500.23 01/01/2019
Таблица сообщений электронной почты
ID To Cc Bcc FirstName Subject Language BodyStart BodyEnd Sent SentDate
1000 Company1@email.com
2000 Company2@email.com
3000 Company3@email.com
Таблица параметров содержит только ReplyTo & ReplyToName
Фактический код
function Statements_Attachments() {
//This section specifies the sheet and some fixed variables.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataRange = ss.getSheetByName("Data").getDataRange();
var emailRange = ss.getSheetByName("Emails").getDataRange();
var param = ss.getSheetByName("Parameters");
var data = dataRange.getValues();
var nameData = emailRange.getValues();
var lastCol = dataRange.getLastColumn();
var lastRow = emailRange.getLastRow();
var replyEmail = param.getRange("B2").getValue();
var replyName = param.getRange("B3").getValue();
var sentRange = ss.getSheetByName("Emails");
var startRow = 1;
var sent = "Y";
var ssA = SpreadsheetApp.getActive();
var ssID = ssA.getId();
var ssName = ssA.getName();
var sheetName = "Export"; //Fill in Sheet Name you want to Email
var shID = getSheetID(sheetName); //Get Sheet ID of Sheet Name
//This section below starts the loop comparing the key between the 2 sheets.
for (var i = 1; i < nameData.length; i++) {
var rows = nameData[i];
var emailAddress = rows[2];
var keyID = rows[0];
var ccMail = rows[3];
var bccMail = rows[4];
var bodyStart = rows[8];
var bodyEnd = rows[9];
var keyName = rows[1];
var subject = rows[6] ;
var emailSent = rows[10];
var xlsxTable = ""; //Variable used to collect the Data for pasting in "Export Sheet"
var exportTable = ""; //Variable used to paste Data in "Export Sheet"
var htmlTable = ""; // HTML body Table created to paste in Email
var htmlMessage = "";
var preTable = '<!DOCTYPE html><html>' + bodyStart ;
var postTable = '</html>';
for (row = 0; row < data.length; row++) {
if (row == 0){
for (col = 0; col < data[row].length; col++) {
if (col == 0) {
htmlTable += '<tr><th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th>';
xlsxTable += data[row][col];
} else
if (col == lastCol - 1) {
htmlTable += '<th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th></tr>';
xlsxTable += data[row][col];
} else {
htmlTable += '<th style="border-collapse: collapse;border: 1px solid black;background-color:#558EDB">' + data[row][col] + '</th>';
xlsxTable += data[row][col];
}
}
}
else if (data[row][0] == keyID) {
for (col = 0; col < data[row].length; col++) {
if (col == 0) {
htmlTable += '<tr><td style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
xlsxTable += data[row][col];
} else
if (col == lastCol - 1) {
htmlTable += '<td style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td></tr>';
xlsxTable += data[row][col];
} else
if (col == 6) {
htmlTable += '<td align="right" style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
xlsxTable += data[row][col];
} else
if (col == 20 || col == 21) {
htmlTable += '<td style="border-collapse: collapse;border: 1px solid black">' + Utilities.formatDate(data[row][col], "GMT", "dd-mm-yyyy") + '</td>';
xlsxTable += data[row][col];
} else {
htmlTable += '<td align="right" style="border-collapse: collapse;border: 1px solid black">' + data[row][col] + '</td>';
xlsxTable += data[row][col];
}
}
}
}
//The section below closes the table in the body and constructs the complete body.
htmlTable += '</tbody></table>';
htmlMessage = preTable + htmlTable + bodyEnd + postTable;
//The section below should paste the Data into the Export Sheet, to be used as basis for the xlsx & pdf attachment to the email.
exportTable = xlsxTable;
//How to write the result to the Export Sheet in columns and rows.
//The section below sets the variables for the Attachment.
var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=xlsx&id="+ ssID +"&gid="+ shID;
var urlPdf = url + "&portrait=true" + "&exportFormat=pdf";
var paramsP = {
method : "get",
headers : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true
};
var paramsX = {
method : "get",
headers : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true
};
var blobPdf = UrlFetchApp.fetch(urlPdf, paramsP).getBlob();
var blobP = blobPdf.setName(sheetName + ".pdf");
var blobXlsx = UrlFetchApp.fetch(url, paramsX).getBlob();
var blobX = blobXlsx.setName(sheetName + ".xlsx");
//The section below retrieves alias email address to send as
var me = Session.getActiveUser().getEmail();// Log the aliases for this Gmail account.
var aliases = GmailApp.getAliases(); // Gets the alias from account
Logger.log(aliases); // Logs the alias
// The section below sends the actual emails
if (emailAddress != "" && emailSent != sent){ //If next email address needs to be different add: && nextEmail != emailAddress
if (aliases.length > 0){ // Prevents sending duplicates
GmailApp.sendEmail(emailAddress, subject, '', {
htmlBody: htmlMessage,
from : aliases[1],
cc : ccMail,
bcc : bccMail,
replyTo : replyEmail,
name : replyName,
attachments : [blobP, blobX],
});
// The section below puts a "Y" next to the row already processed.
sentRange.getRange(startRow + i, 11).setValue(sent);
sentRange.getRange(startRow + i, 12).setValue(new Date ());
//Utilities.sleep(1000);
SpreadsheetApp.flush(); // Make sure the cell is updated right away in case the script is interrupted
}
}
}
}
function getSheetID(name){
var sheetName = SpreadsheetApp.getActive().getSheetByName(name)
var sheetID = sheetName.getSheetId().toString()
return sheetID
}