Использование values[i][E3]
не сработает - вам нужно передать целые числа, чтобы получить значения, которые вы ищете в массиве данных. Я сделал несколько изменений в вашем сценарии и объяснил ниже.
function sendEmail() {
// return all data in active spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getDataRange().getValues();
for (var i = 0; i < values.length; i++) {
//iterate over each row
var data = values[i][12];
var emailAddress = "email@address.com";
var subject = "Marshal's Notice detected"
var message = values[2][4] + values[2][5] + values[2][7] //e3, f3 & h3
+ values[2][8] + values[2][9] + values[2][10] //i3, j3 & k3
+ values[2][11] + values[2][12] + values[2][13] //l3, m3 & n3
+ values[2][14]; //o3
// if data cell is greater than one, send an email for this row
if (data > 1 && values[i][15] == '') {
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(i+1, 16).setValue('email sent!');
}
}
}
Я изменил ваш цикл for
, чтобы он работал для длины значений:
for (var i = 0; i < values.length; i++) {
Тогда, когда вы пытались получить доступ к E3 и т. Д., Я дал правильные целые числа для доступа к определенным ячейкам, которые вы искали, например, values[2][4]
, так как они проиндексированы 0, это даст вам ячейку в строке 3 столбец 5 = E3.
Чтобы этот скрипт не отправлял несколько одинаковых писем, я добавил строку, в которой значение столбца P было бы установлено на «Отправлено по электронной почте», а затем добавил проверку в вашем операторе if
, чтобы убедиться, что он не имеет уже отправлен в этот ряд.
if (data > 1 && values[i][15] == '') {
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(i+1, 16).setValue('Email Sent');
}
РЕДАКТИРОВАТЬ ПОСЛЕ ДОПОЛНИТЕЛЬНЫХ КОММЕНТАРИЙ:
Я собрал следующий код, который должен соответствовать всем вашим новым критериям.
function onEdit(e) {
// return all data in active spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getDataRange().getValues();
for (var i = 0; i < values.length; i++) {
//iterate over each row
var editCol = e.range.getColumn();
var emailAddress = "email@address.com";
var subject = "Marshal's Notice detected"
var message = values[i][4] + values[i][5] + values[i][7] //e3, f3 & h3
+ values[i][8] + values[i][9] + values[i][10] //i3, j3 & k3
+ values[i][11] + values[i][12] + values[i][13] //l3, m3 & n3
+ values[i][14]; //o3
// if data cell is greater than one, send an email for this row
if (values[i][13] !== '' && editCol === 13 && values[i][15] === '') {
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(i+1, 16).setValue('email sent!');
}
}
}
- Код теперь проверяет столбец, в который добавляются данные. Для этого мне пришлось поместить его в триггер
onEdit
, затем использовать объект события, чтобы получить столбец, в который были введены данные, и проверить это в моем операторе if
.
- Код захватывал специально строку 3 для данных, теперь он был изменен для использования
i
, который будет захватывать данные для строки, которую он обрабатывает.
- Я также добавил проверку в операторе
if
, чтобы убедиться, что столбец N заполнен, это должно предотвратить отправку электронных писем, если данные еще не рассчитаны.