Как насчет этого ответа?
sendNotification()
установлен как устанавливаемый триггер OnEdit. - Вы хотите запускать
sendNotification()
только когда ячейка столбца "G"обновляется.
Если мое понимание вашей ситуации верное, как насчет этой модификации?
От:
if(sheet.getRange('G'+row).getValue()=='All Components at DC')
До:
if(cell[0] == 'G' && sheet.getRange('G'+row).getValue()=='All Components at DC')
В этой модификации сценарий в if
запускается только тогда, когда столбец «G» был отредактирован путем добавления cell[0] == 'G'
.
. В качестве другой модификации вы также можете использоватьобъект события OnEdit.В следующем примере сценария используется объект события.При использовании объекта события стоимость процесса может быть уменьшена.
Пример сценария с использованием объекта события:
function sendNotification(e) {
var ss = e.source;
var sheet = ss.getActiveSheet();
var range = e.range;
var values = range.offset(0, -6, 1, 6).getValues()[0];
var activeCell = range.getValue();
if (range.getA1Notation()[0] == 'G' && activeCell == 'All Components at DC') {
var recipients = "xxx@xxx.com";
var subject = "Delivered Items";
var message = values[0] + '\n TITLE: ' + values[5] + '\n LANGUAGE: ' + values[4];
var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + '\n ROW: ' + range.getRow() + '\n DATE: ' + message + '\n COMMENT: ' + activeCell;
var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
MailApp.sendEmail(recipients, subject, body);
}
}
Ссылки:
Если это былоне то, что вы хотите, пожалуйста, скажите мне.Я хотел бы изменить его.
Редактировать:
О проблеме этой ситуации:
Объект события имеет старое значение отредактированной ячейки.Но в вашем случае ячейка, используемая в качестве триггера, не является отредактированной ячейкой.Например, при условии, что столбцы "I" - "L" имеют значение Delivered to DC
, когда Delivered to DC
помещается в столбец "M", а значение столбца "G" изменяется с In Progress
наAll Components at DC
, возвращается объект события, который редактируется в столбце «M».Таким образом, старые и новые значения не являются значением столбца "G".А также, когда значение столбца «G» извлекается триггером, это значение является измененным значением.Таким образом, в этой ситуации, когда используется объект события и триггер, извлекается значение столбца «G» после изменения.
Обходной путь:
Чтобы избежать вышеуказанной проблемы, каким образомоб этом обходном пути?В этом обходном пути я хотел бы предложить сохранить значения столбца «G» перед редактированием.Для этого я использую столбец.Хотя есть несколько методов, я думал, что этот обходной путь является более простым.Эта процедура обходится следующим образом.
- Сначала сохраните текущее значение столбца «G» в столбце с помощью функции.Это инициализация этого потока.
- В этом примере столбец «N» используется в качестве столбца для сохранения значений перед редактированием.
- Когда запускается устанавливаемый триггер, он извлекает прошлоезначение из столбца «N» и сравнивает его с новым значением.Когда новое значение изменяется на
All Components at DC
, он запускает скрипт в if
и отправляет электронное письмо. - Обновляет значения столбца "N" до текущих.
Если вышеуказанный поток отражен в вашем сценарии, измените его следующим образом.Также сценарий, использующий объект события, может быть изменен подобно следующему сценарию.
Измененный сценарий:
// Added
function saveCurrentValues() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tracker");
var values = sheet.getRange(2, 7, sheet.getLastRow(), 1).getValues();
sheet.getRange(2, 14, values.length, 1).setValues(values);
}
function sendNotification(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = ss.getActiveCell().getA1Notation();
var row = sheet.getActiveRange().getRow();
var cellvalue = ss.getActiveCell().getDisplayValue().toString();
var beforeEdit = sheet.getRange(1, 14, sheet.getLastRow(), 1).getValues(); // Added
if(sheet.getName()=='Tracker' && sheet.getRange('G'+row).getValue()=='All Components at DC' && beforeEdit[row - 1][0] != 'All Components at DC') // Modified
{
var recipients = "xxx@xxx.com";
var subject = "New Components Delivered to DC"
var message = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n TITLE: ' + sheet.getRange('F'+ sheet.getActiveCell().getRowIndex()).getValue() + '\n LANGUAGE: ' + sheet.getRange('E'+ sheet.getActiveCell().getRowIndex()).getValue()
var body = sheet.getName() + ' has been updated. Visit ' + ss.getUrl() + '\n ROW: ' + row + '\n TVD DATE: ' + message + '\n COMMENT: ' + cellvalue;
var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
MailApp.sendEmail(recipients, subject, body);
}
saveCurrentValues(); // Added
}
Примечание:
saveCurrentValues()
используется длясохранение текущих значений столбца «G».Поэтому после того, как вы скопировали и вставили вышеуказанные скрипты, сначала запустите saveCurrentValues()
.При этом текущие значения сохраняются в столбце «N». - В качестве образца была использована колонка "N".Поэтому, пожалуйста, измените вашу среду.Вы также можете скрыть столбец.
- В этом временном решении, когда значение столбца «G» изменяется с
All Components at DC
на другие и не изменяется, сценарий в if
НЕ запускается.Так что письмо не отправлено.