Это не решение «под ключ», но иллюстрирует, что вы можете сделать.
Чтобы отправить более одного электронного письма, вам необходимо собирать электронные письма для каждого случая, для которого требуется электронное письмо.Обычно это делается с использованием Object
или Array
, или, возможно, Array
из Object
с (например, для объединения более одного фрагмента информации).
Возможно, это стоитотправить только одно электронное письмо каждому инструктору, содержащему список всех событий, которые они имеют, и одно электронное письмо каждому фасилитатору, содержащему список всех событий, которые они имеют.
В этом примере объект используется для хранения объекта.instructor
и facilitator
информация для обработки электронной почты вне цикла данных электронной таблицы.Каждое релевантное электронное письмо используется как ключ объекта со значением, которое является массивом информации о событии.
const data = sheet.getDataRange().getValues();
const headers = data.shift();
const reminderColText = "Reminder Days Left", // Title of the header col
compareCol = headers.indexOf(reminderColText),
// If the row & column intersection has this value, an email is sent for the row's data
sendIfDays = 1;
if (compareCol === -1)
throw new Error("Did not find the header column titled '" + reminderColText + "'")
// Prune the sheet's data to only that which we care about.
const events = data.filter(function (row) { return row[compareCol] === sendIfDays; });
const infoIndices = { eventName: 0, // Event name in Col A
eventTime: 1,
eventLoc: 3, // Event location in Col D
instructorEmail: 4,
facilitatorEmail: 5 };
const emailInfo = { instructors: {}, facilitators: {} };
events.forEach(function (row) {
var ins = row[infoIndices.instructorEmail],
fac = row[infoIndices.facilitatorEmail],
name = row[infoIndices.eventName],
time = row[infoIndices.eventTime],
loc = row[infoIndices.eventLoc];
// Create an Array for each instructor / facilitator email
if (!emailInfo.instructors[ins])
emailInfo.instructors[ins] = [];
if (!emailInfo.facilitators[fac])
emailInfo.facilitators[fac] = [];
// Add the event data to the relevant array
var eData = { name: name, time: time, loc: loc };
emailInfo.instructors[ins].push(eData);
emailInfo.facilitators[fac].push(eData);
});
// Send emails based on the collected information.
[ {r: emailInfo.instructors, f: getFormattedInstructorMessage_},
{r: emailInfo.facilitators, f: getFormattedFacilitatorMessage_}
].forEach( function (o) {
var formatFunc = o.f;
for (var email in o.r) {
var recipientName = getNameFromEmailSomehow_(email);
var msg = formatFunc(recipientName, o.r[email]);
MailApp.sendEmail(email, "Subject", msg);
}
});
Выше предполагается, что вы также написали некоторые фоновые функции:
- функция
getNameFromEmailSomehow_
, которая преобразует электронную почту в имя (например, поиск в LDAP, или, может быть, вы написали имя инструктора / помощника в строке и включили его в eData
- две функции форматирования
getFormattedInstructorMessage_
и getFormattedFaciliatorMessage_
, которые берут имя получателя и список всех его событий на предстоящий день и используют список объектов для создания текста электронного письма. Вы можете вернуть HTML (и использовать другую версию MailApp.sendEmail
) или простопростой текст, в зависимости от того, что вы предпочитаете.
Абсолютно примитивный пример форматера:
function basicFormattedMessage_(to, events) {
var msg = "Hello " + to + ",\n";
msg += "You have " + events.length + " events tomorrow:\n";
events.forEach(function (e) {
msg += "\nName: " + e.name;
msg += "\nTime: " + e.time;
msg += "\nRoom: " + e.loc;
msg += "\n";
});
return msg;
}