Во-первых, вам нужен триггер onEdit для запуска функции каждый раз, когда столбец B редактирует электронную таблицу. Кроме того, поскольку вы хотите отправлять электронные письма, простого триггера будет недостаточно (см. Ограничения простых триггеров здесь ), вам необходимо установить триггер. Вы можете сделать это вручную или программно . Здесь я предоставляю код для программной установки триггера редактирования. Вам нужно будет запустить эту функцию один раз:
function createEditTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('sendEmails')
.forSpreadsheet(ss)
.onEdit()
.create();
}
Это заставит sendEmails
запускаться каждый раз, когда электронная таблица редактируется. Вам нужно будет поставить условие, которое проверяет, находится ли отредактированный диапазон в столбце B. И вы можете сделать это, если используете Объект Event , который будет получен sendEmails
в качестве параметра и который содержит информация о контексте, который запустил триггер.
Допустим, что, как обычно, объект события называется e
. Вы можете получить доступ к диапазону, который был отредактирован, выполнив e.range
. И вы можете знать столбец, который был отредактирован, если вы сделаете e.range.getColumn()
. Кроме того, вы можете узнать, какая строка была обновлена, если вы выполните e.range.getRow()
(что было вашей второй проблемой).
С учетом всего сказанного вам придется изменить функцию sendEmails
следующим образом. Вам нужно изменить это:
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var dataRow = 232; //updated row in spreadhseet
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Rest of the code
}
На это:
function sendEmails(e) {
var range;
if (!e) range = SpreadsheetApp.getActiveRange();
else range = e.range; // Edited range
var sh = range.getSheet(); // Edited sheet
var dataRow = range.getRow(); // Edited row index
var column = range.getColumn(); // Edited column index
var yourSheetName = "Sheet1"; // Please change accordingly
// Check that edited sheet is the one you want to track change from
// and that edited column is B (index 2):
if (sh.getName() == yourSheetName && column == 2) {
// Rest of the code
}
}
Очень важно, чтобы вы написали e
в качестве аргумента для функции, в противном случае код выиграл ' не знаю, что такое e
. Также имейте в виду, что это будет работать только в том случае, если электронная таблица редактируется пользователем вручную, а не программно скриптом.
Кроме того, в этом примере лист, с которого вы хотите отслеживать изменения, называется Sheet1
, пожалуйста, измените его в коде, если это не так.
Наконец, что касается HTML, я думаю, что вы пропускаете некоторые цитаты в нескольких местах, и поэтому он не работает должным образом. В этой строке, например:
'<td width=400px" style="width:400px; background-color:yellow;">'
400px
отсутствует первый ", это может быть width="400px"
.
Я вижу аналогичное, что происходит в этой строке:
'<span style="font-family:"Arial",sans-serif">Best</span> // ...
Здесь вы должны использовать escape-символы (\"
), в противном случае скрипт думает, что вы хотите закрыть блок кавычек, когда вы хотите открыть новый. Вы должны сделать что-то вроде этого:
'<span style="font-family:\"Arial\",sans-serif">Best</span> // ...
Надеюсь, это поможет.