Нужна рука, чтобы немного привести в порядок это.У меня есть сценарий (см. Ниже), который просматривает лист Google и проверяет, приближается ли срок выполнения проекта к сроку его исполнения.Эта часть работает.Что мне нужно сделать, это отправить электронное письмо на ресурс, назначенный, когда он приближается или нарушил.Это достаточно просто, mailApp работает отлично.Но я хочу сгруппировать информацию, чтобы не спамить почтовые ящики людей.
Код:
function mailBot() {
var warningDays = 14;
var data = cwSheet.getDataRange().getValues();
data.slice(1).forEach(function(row) {
var user = row[0];
var userEmail = buildMailAddress(user);
var projectName = row[3];
var date = row[8];
var today = new Date();
if (
row[0] !== "" &&
row[0] !== "Unassigned" &&
row[0] !== "Proof of Concept"
) {
var dueDate = new Date(date);
if (dateDiff(dueDate, today) >= 1) {
// Logger.log("**BREACHED** | %s", row);
// TODO: Group results to send a single mail rather than multiple mails.
} else if (dateDiff(today, dueDate) <= warningDays) {
// Logger.log("**DUE** | %s", row);
// TODO: Group results to send a single mail rather than multiple mails.
}
}
});
}
Вывод журнала:
[19-01-22 02:24:40:852 PST] **BREACHED** | [Darth Vader, Link, , Some project, , Project, Group, Shaping, Tue Jan 01 00:00:00 GMT+00:00 2019, Green, , , ]
[19-01-22 02:24:40:853 PST] **BREACHED** | [Darth Vader, Link, www.google.com, Some project, , Project, Department, Shaping, Fri Oct 26 00:00:00 GMT+01:00 2018, Green, , , ]
[19-01-22 02:24:40:855 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 1, , Project, JL, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:856 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 2, , Small Dev, Waitrose, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:857 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 3, , Project, Group, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:857 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 3, , Small Dev, I&S, Development, Mon Jan 14 00:00:00 GMT+00:00 2019, , , , ]
Используя приведенный выше журнал в качестве примера, Дарт Вейдер получил бы 1 электронное письмо с содержанием 2 предупреждений.Фродо получит 1 электронное письмо с содержанием 4 предупреждений.Кто-нибудь может подсказать мне, как лучше всего добиться этого?
ОБНОВЛЕНИЕ 1
Учитывая код из cen0r ниже, который я настроил для работы с GAS
function mailBot() {
var warningDays = 14;
var data = cwSheet.getDataRange().getValues();
var today = new Date();
// Parse the data using custom function
var parsed = parseData(data);
// Filter entries that are breached
var breached = parsed.filter(function(entry) {
return dateDiff(entry.date, today) >= 1;
});
// Group breached entries by user and do something with them
groupBy(breached, "user").map(function(group) {
// Here group is an array of entries for one user
// You can send one email for all breached entries here
});
// Filter entries that are due
var due = parsed.filter(
function(entry) {
return (
dateDiff(today, entry.date) <= warningDays &&
dateDiff(entry.date, today) < 1
);
} // This is so there won't be 2 emails sent for breached & due
);
// Group due entries by user and do something with them
groupBy(breached, "user").map(function(group) {
Logger.log(group)
// Here group is an array of entries for one user
// You can send one email for all due entries here
});
}
// Parses the data from your input
function parseData(data) {
// Parse the data
var parsed = data.slice(1).map(function(row) {
var user = row[0];
var userEmail = buildMailAddress(user);
var today = new Date();
var projectName = row[3];
var date = new Date(row[8]);
return {
user: user,
userEmail: userEmail,
projectName: projectName,
date: date,
today: today
};
});
// Filter entries that you want to do something with
return parsed.filter(function(entry) {
return (
entry.user !== "" &&
entry.user !== "Unassigned" &&
entry.user !== "Proof of Concept"
);
});
}
// Groups array entries according to a property of the entry (the key)
function groupBy(xs, key) {
return xs.reduce(function(rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
}
Теперь выдается ошибка:
TypeError: Невозможно найти карту функции в объекте [object Object].(строка 25, файл "0 - Main")
, который ссылается на эту строку кода:
groupBy(breached, "user").map(function(group) {
});