Есть ли альтернатива onEdit (e)? - PullRequest
0 голосов
/ 22 февраля 2020

Отказ от ответственности: я относительный новичок.

Я собираю события календаря пользователя и отображаю их в Google Sheet. Один столбец частично заполняется на основе кода. Затем пользователи могут добавлять свои собственные значения. К сожалению, когда они снова запустят мой код, все введенные пользователем значения будут потеряны.

Прошлой ночью я решил "сохранить" введенные пользователем значения на новом листе, связав их с идентификаторы событий. Я пытался реализовать это с помощью onEdit (e), но триггер не работает. (Я предполагаю, потому что я беру календарь пользователя?)

Есть ли альтернатива onEdit (e)? (Было бы довольно легко отследить, какие значения были сгенерированы кодом - и я мог бы сказать добавленные значения таким образом - но чтобы сохранить их значения, пользователям пришлось бы нажимать дополнительную кнопку, которая не очень удобна для пользователя дружеский ...)

1 Ответ

1 голос
/ 22 февраля 2020

Создание триггера onEdit программно

Альтернативой простым триггерам является устанавливаемые триггеры . Простые триггеры не могут выполнять события, которые требуют разрешения. Устанавливаемые триггеры могут, если пользователь, использующий его, обеспечивает авторизацию.

Поскольку я всегда работаю над кодом других людей, у меня есть пара вспомогательных функций, которые упрощают создание устанавливаемого триггера onEdit.

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

function createOnEditTrigger() {
  createOnEditTriggerForSpreadsheet('MyFunctionName');
}

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

function createOnEditTriggerForSpreadsheet(funcname) {
  var ssid=SpreadsheetApp.getActive().getId();
  if(!isTrigger(funcname)) {
    ScriptApp.newTrigger(funcname).forSpreadsheet(ssid).onEdit().create();
  }   
}

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

function isTrigger(funcName){
  var r=false;
  if(funcName){
    var allTriggers=ScriptApp.getProjectTriggers();
    for(var i=0;i<allTriggers.length;i++){
      if(funcName==allTriggers[i].getHandlerFunction()){
        r=true;
        break;
      }
    }
  }
  return r;
}

ScriptApp.newTrigger ()

ScriptApp.getProjectTriggers ()

Хотя это действительно удобно для меня. Я по-прежнему рекомендую вам go на панели триггеров и установить немедленные уведомления, чтобы вы могли быстро получить электронное письмо от Google при отладке нового кода. Они сообщат об ошибках немедленно по электронной почте. Это очень удобно.

Анимация:

enter image description here

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