Запустить функцию при изменении значения ячейки (функция onEdit) - PullRequest
0 голосов
/ 06 февраля 2020

на приведенном ниже листе:

https://docs.google.com/spreadsheets/d/1F22Z19gi9WRaYbsrvlDyuiJX5VXfppAlCPzB5bjdMN8/edit?usp=sharing

Из редактора сценариев я добавил следующий код:

function onEdit(e) {
  var sheetName = 'Sheet2'
  var cellName = 'C2'

  var sortSheet = e.range.getSheet()

  if (sortSheet.getName() === sheetName) {
    if (e.range.getValue().length === cellName) {
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
      var e = sh.getRange(2, 3).getValues();
      var m = 'Test Message';
      var subject = 'Test Subject';
      MailApp.sendEmail(e, subject, m);
    }
  }
}

Цель состоит в том, чтобы вызвать функцию MailApp при изменении значения ячейки «C2» в sheet2

Я тестировал тот же сценарий, но на sheet1 (где я добавляю значения ячеек), и он работал, но, однако, когда я пытаюсь применить на листе 2 (где значения копируются из листа 1), скрипт не работает. Любая помощь, спасибо заранее

Обратите внимание, что лист редактируемый, поэтому вы можете редактировать скрипт

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Как запустить триггер при редактировании, не принадлежащем человеку

  • И простые, и устанавливаемые приложения Сценарий onEdit Триггеры ретрицированы на изменения, сделанные человеком
  • Кроме того, простые триггеры

не могут получить доступ к службам, требующим авторизации. Например, простой триггер не может отправить электронное письмо, поскольку службе Gmail требуется авторизация, но простой триггер может перевести фразу с помощью языковой службы, которая является анонимной.

Обходной путь будет для замены триггера onEdit через устанавливаемый onChange trigger

  • Триггер onchange имеет меньше ограничений, например, его можно запустить по формуле листов IMPORTRANGE
  • Вам нужно создать новую пустую электронную таблицу и вставить формулу IMPORTRANGE("paste here the spreadsheet_url of the original spreadsheet", "Sheet2!E2") в ячейку E2.
  • . Нажмите Allow access

Просто измените свой код следующим образом:

function onChange() { 
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var e = sh.getRange(2, 3).getValue();
  var m = 'Test Message';
  var subject = 'Test Subject';
  Logger.log("sending");
  MailApp.sendEmail(e, subject, m);
}
0 голосов
/ 06 февраля 2020

После чата мы решили включить почтовое сообщение в уже доступную функцию doPost ().

function doPost (e) {


.... 

var doc = SpreadsheetApp.getActive();
var sheet = doc.getSheetByName(sheetName)
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
  return header === 'Timestamp' ? new Date() : e.parameter[header]
})

sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
var email = newRow[1];
var subject = 'XXXXXXXXX';
var body = 'XXXXXXX';
MailApp.sendEmail(email, subject, body);

...... //rest of the code

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...