sendNotification продолжает отправлять электронные письма, если обновляется какая-либо ячейка в строке со значением триггера - PullRequest
0 голосов
/ 22 октября 2018

Я использую sendNotification для запуска электронной почты, когда столбец «G» имеет значение «Все компоненты для DC».Но проблема, с которой я сталкиваюсь, заключается в том, что когда в столбце уже есть данные «Все компоненты в DC», а другой столбец в той же строке обновляется (с любым значением), сценарий снова проверяет столбец «G» и видит «Все компоненты в DC 'и повторная отправка одного и того же электронного письма.

Как потребуется переписать сценарий, чтобы уведомление отправлялось только при обновлении столбца G и игнорировании других ячеек втот же ряд?

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();

  if(sheet.getRange('G'+row).getValue()=='All Components at DC')
  {
    var recipients = "xxx@xxx.com";
    var subject = "Delivered Items"
    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 DATE: ' + message + '\n COMMENT: ' + cellvalue;
    var valColB=e.range.getSheet().getRange(e.range.getRow(),2).getValue();
    MailApp.sendEmail(recipients, subject, body);
  }
}

1 Ответ

0 голосов
/ 23 октября 2018

Как насчет этого ответа?

  • 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» перед редактированием.Для этого я использую столбец.Хотя есть несколько методов, я думал, что этот обходной путь является более простым.Эта процедура обходится следующим образом.

  1. Сначала сохраните текущее значение столбца «G» в столбце с помощью функции.Это инициализация этого потока.
    • В этом примере столбец «N» используется в качестве столбца для сохранения значений перед редактированием.
  2. Когда запускается устанавливаемый триггер, он извлекает прошлоезначение из столбца «N» и сравнивает его с новым значением.Когда новое значение изменяется на All Components at DC, он запускает скрипт в if и отправляет электронное письмо.
  3. Обновляет значения столбца "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 НЕ запускается.Так что письмо не отправлено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...