onEdit(e) не работает в дополнении

Я написал сценарий, который отлично работает при использовании в собственной электронной таблице. Сейчас я пытаюсь опубликовать его как надстройку и обнаружил, что onEdit(e) не работает, тогда как onOpen(e) и onInstall(e) работают нормально.

Я просмотрел документацию по режимам авторизации и установке/включению надстройки, но я думаю, что, вероятно, что-то упускаю (надеюсь, просто), так как я новичок. Должен ли я вызывать функции по-другому? Или размещение onEdit? Любая помощь приветствуется. Спасибо!!

function setup() {
  var ui = SpreadsheetApp.getUi();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Send Auto Emails');

  try {ss.setActiveSheet(ss.getSheetByName('Send Auto Emails'));}
  catch (e) {ss.insertSheet('Send Auto Emails', 0);}

  sheet.getRange(1, 1).setValue('Recipient Email Address');   

  //etc...
}

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = e.source.getActiveSheet();
  var range = e.source.getActiveRange();

  if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" |     range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
    Browser.msgBox(
      'Alert',
      'Feel free to change the title here to something more relevant to you.  But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
      Browser.Buttons.OK
    );
  }
  if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto     Emails") {
    Browser.msgBox(
      'Alert',
      'Only add the email message body.  "Hello, Recipient Name" and "Best, Your Name" will be automatically added.  If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
      Browser.Buttons.OK
    );
  }

  if (range.getA1Notation() == "A2") {
    ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
  }
}

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('BulkEmail beta')
      .addItem('1. Sheet Setup', 'setup')
      .addItem('2. Send Emails', 'sendEmails')
      .addToUi();
  onEdit(e);
}

function onInstall(e) {
  onOpen(e);
}

ИЗМЕНИТЬ 1

Я пытался создать устанавливаемый триггер вместо простого onEdit, но безрезультатно.

function createonEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('installableonEdit')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

function installableonEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = e.source.getActiveSheet();
  var range = e.source.getActiveRange();

  try {
    if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" | range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
      Browser.msgBox(
        'Alert',
        'Feel free to change the title here to something more relevant to you.  But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
        Browser.Buttons.OK
      );
    }
    if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto Emails") {
      Browser.msgBox(
        'Alert',
        'Only add the email message body.  "Hello, Recipient Name" and "Best, Your Name" will be automatically added.  If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
        Browser.Buttons.OK
      );
    }

    if (range.getA1Notation() == "A2") {
      ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
    }
  } catch(err) {
    var errMsg = 'There was an error: ' + err +
        + " \n \n" +
        'from the: onEdit function ' +
        + " \n \n" +
        'The call stack is: ' + err.stack;

    GmailApp.sendEmail('[email protected]', "error", errMsg);
  }
}

person ebreckley    schedule 15.01.2016    source источник
comment
Возможно, он вызывается, но не работает из-за какой-то ошибки. Используйте службу Logger для записи ошибок в различных точках функции. Кроме того, проверьте, не работает ли он из-за упомянутых здесь ограничений: developers.google.com/apps. -скрипт/гиды/триггеры   -  person Sujay Phadke    schedule 16.01.2016
comment
@SujayPhadke Logger не может записывать ошибки. Stackdriver console будет гораздо более удобным инструментом для разработчиков (неотловленные ошибки по умолчанию регистрируются в Stackdriver). Большинство (все?) запускаемых функций будут молча завершаться с ошибкой (и записывать ее в Stackdriver) - только явно выполняемые пользователем функции будут отображать сообщение об ошибке обратно пользователю.   -  person tehhowch    schedule 17.08.2018
comment
Я не могу заставить простой триггер onEdit() вообще запускаться в надстройке Sheets при тестировании, даже с одной строкой кода: Logger.log(onEdit); Я пробовал все режимы AuthModes, назначал проекту стандартный идентификатор проекта облачной платформы, настраивал экран OAuth, но все безрезультатно. Если я запускаю функцию onEdit(), она регистрируется нормально. Я также попытался добавить установленный триггер, но у меня есть только параметр «Календарь» в разделе «Источник событий», для которого требуется адрес электронной почты владельца, хотя листы и календарь настроены в разделе «Дополнительные службы» и в appscript.json в разделе «enabledAdvancedServices». Любые идеи?   -  person jazzwhistle    schedule 19.05.2019
comment
Согласно developers.google.com/gsuite/add- ons/how-tos/, Устанавливаемые триггеры не поддерживаются при тестировании. Функциональность, которая зависит от устанавливаемых триггеров, не тестируется. Кажется, простые триггеры должны работать при тестировании, если я не использую код, требующий авторизации... однако Logger не будет регистрироваться, и developers.google.com/apps-script/guides/triggers/#onedite не работает.   -  person jazzwhistle    schedule 19.05.2019


Ответы (2)


Ваш триггер onOpen() запускает триггер onEdit(). opOpen() запускается в AuthMode.LIMITED, когда дополнение установлено и включено.

В этой документации говорится:

Режим (ОГРАНИЧЕННЫЙ), который разрешает доступ к ограниченному подмножеству услуг. Этот (ОГРАНИЧЕННЫЙ) режим возникает, когда надстройка или скрипт, привязанный к документу, выполняет простой триггер onOpen(e) или onEdit(e), за исключением случая, описанного для NONE.

Вы используете onOpen() простой триггер, и он работает в ОГРАНИЧЕННОМ режиме, потому что находится в надстройке.

Итак, в этой части я совершенно уверен.

Я считаю, что вы можете создать устанавливаемый триггер редактирования, который работает в ПОЛНОМ режиме. Итак, я бы попробовал избавиться от простого триггера и установить триггер с ScriptApp.

В документации указано:

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

Документация Google

Таким образом, try/catch включала отправку электронного письма, которое остановило бы работу простого триггера onEdit().

Добавьте try/catch в свой код и отправьте себе электронное письмо, если возникнет ошибка.

function onEdit(e) {try{
  //Code Here

} catch(err) {
  var errMsg = 'There was an error: ' + err +
      + " \n \n" +
      'from the: onEdit function ' +
      + " \n \n" +
      'The call stack is: ' + err.stack;

  GmailApp.sendEmail('[email protected]', "Subject", errMsg);
};
person Alan Wells    schedule 16.01.2016
comment
Только что попробовал это. Я вообще не получал электронные письма при тестировании в качестве надстройки, и функция снова работала, как ожидалось, при тестировании в качестве собственного скрипта. Значит, функция вообще не работает как надстройка? - person ebreckley; 18.01.2016
comment
Я также пытался намеренно заставить его поймать, добавив код, чтобы попытка не удалась, но все равно ничего. - person ebreckley; 18.01.2016
comment
Я попытался как удалить onEdit из onOpen, так и создать устанавливаемый триггер, как показано ниже. Ни один из них не работал, чтобы отправить электронное письмо об ошибке или правильно работать в листе или надстройке. Я начинаю задаваться вопросом, есть ли какая-то ошибка? Это определенно похоже на проблему с разрешениями. - person ebreckley; 18.01.2016
comment
@ Алан Уэллс Спасибо, что поделились. Я получаю ту же ошибку в тестовом режиме, что и надстройка. Ваш код в catch отправляет следующее сообщение по электронной почте: Произошла ошибка: Исключение: Надстройка предприняла попытку действия, которое не разрешено в режиме Тестировать как надстройку. Чтобы использовать это действие, вы должны развернуть надстройку. Как видите, \n не разрывает строку, здесь нужно что-то еще. - person Boris Baublys; 02.02.2021
comment
Я использую связанные файлы проекта для тестирования и разработки. Я давно перестал использовать Test как надстройку. У меня есть специальное веб-приложение, которое я разработал, которое копирует мой файл разработки в другой автономный файл сценария приложений, и этот автономный файл я использую для производства. На самом деле, я пытаюсь опубликовать это приложение в Workspace Marketplace. - person Alan Wells; 02.02.2021

Одна из возможных причин заключается в том, что вы «Тестируете как надстройку».

https://developers.google.com/gsuite/add-ons/how-tos/testing-editor-addons#testing_details

Устанавливаемые триггеры не поддерживаются при тестировании. Функциональность, которая зависит от устанавливаемых триггеров, не тестируется.

Но самое смешное, что он работает с привязанным скриптом.

Это привело меня в замешательство на некоторое время. Таким образом, решение состоит в том, что когда вам нужно протестировать устанавливаемые триггеры, просто придерживайтесь связанного документа.

Если это сработает, сработает и триггер надстройки.

Для других вещей вы можете сделать «Тестировать как надстройку».

person Hoang Trinh    schedule 30.07.2019