Ответ:
Как объяснено в ссылке, на которую ссылается @TheMaster, если многие люди одновременно редактируют лист, некоторые изменения могут не отслеживаться триггером onEdit
.
Обходной путь:
Чтобы убедиться, что письма из всех строк отправляются, я бы предложил добавить столбец рядом с данными, который будет отслеживать, какие письма были отправлены. onEdit
будет перебирать все строки, находить те, которые не были отправлены, отправлять электронные письма и писать Sent
в соответствующих ячейках. Я создал небольшой пример того, как это будет выглядеть так:
function onEditTrigger(e) {
var sheet = e.source.getActiveSheet();
var values = sheet.getDataRange().getValues();
// Loops through each row and send email in rows that don't have "Sent" in 4th row
// Starts at row 2 (first row is for headers)
for(var i = 1; i < values.length; i++) {
var row = values[i];
var status = row[3];
var recipient = row[0];
var subject = row[1];
var body = row[2];
// Checks that the email from this row has not been sent and all data cells in the row are populated (not sure if you want this last thing, change accordingly)
if(status != "Sent" && recipient != "" && subject != "" && body != "") {
// In this example "recipient" is in first column, subject in second and body in third. Change accordingly
MailApp.sendEmail(recipient, subject, body);
sheet.getRange(i + 1, 4).setValue("Sent");
}
}
}
Помните, что вы не можете использовать MailApp.sendEmail в простом onEdit
, как это происходит в любом сервисе, требующем авторизации . Таким образом, ваша функция не может быть вызвана onEdit(e)
, и вы должны установить ее, запустив сначала функцию, которая создает триггер, например:
function createEditTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('onEditTrigger')
.forSpreadsheet(ss)
.onEdit()
.create();
}
Надеюсь, это вам поможет.