Устанавливаемые триггеры для использования нескольких onEdit

#google-apps-script #google-sheets #triggers

#google-apps-script #google-таблицы #триггеры

Вопрос:

  • Я создал 2 функции, которые запускают onEdit (протестированы и работают при имени onEdit)

  • Первый устанавливает значение (новую дату) строки>7 в столбце D onEdit столбца C.

 function CompleteTime() { //Function to add a time stamp to Complete Time Column D
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row>7 amp;amp; col==3){
    sheet.getRange(row, 4).setValue(new Date());
    
  }
}
  
  • Второй задает формулу в строке 8 столбца E onEdit строки 8 столбца D
 function Duration() { //Function to set formula in column E to calculate duration from start time to first complte time
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 amp;amp; col==4){
    sheet.getRange(row, 5).setFormula("=SUM(D8-B3)");
    
  }
}
  
  • Я создал 2 устанавливаемых триггера для запуска этих функций onEdit, и первый работает нормально, но второй не запускает первый. Значение, введенное первой функцией, не запускает вторую функцию.

  • Все, что я прочитал, предполагает, что это способ заставить несколько onEdits работать на одном листе, но я застрял здесь.

Комментарии:

1. Вы хотите, чтобы редактирование, сделанное с помощью CompleteTime() , запускалось Duration() ?

2. @Diego это правильно!

3. Приведенный ниже ответ должен помочь. Пожалуйста, также учтите, что «выполнение скриптов и запросов API не приводит к запуску триггеров» ( источник ). So CompleteTime() никогда не вызовет onEdit.

4. @Diego Спасибо за эту информацию. Это разочаровывает, но объясняет, почему это не работало у меня раньше. Есть ли у вас какие-либо идеи о том, как или если это возможно каким-либо другим способом?

Ответ №1:

Одним из ограничений триггеров является то, что «выполнение скриптов и запросов API не приводит к запуску триггеров», что означает, что вам нужно вручную включить Duration() вызов после вставки времени завершения.

Приведенный ниже пример — не единственный способ добиться этого, но он должен дать вам представление о том, что я пытаюсь описать.

 function onEdit(e) {
  var row = e.range.rowStart;
  var col = e.range.columnStart;
  
  if (row == 8 amp;amp; col == 4) {
    insertDurationFormula(e.range.offset(0, 1));
  } else if (row > 7 amp;amp; col == 3) {
    insertCurrentTime(e.range.offset(0, 1));
    insertDurationFormula(e.range.offset(0, 2));
  }
}

function insertCurrentTime(cell) {
  cell.setValue(new Date());
}

function insertDurationFormula(cell) {
  cell.setFormula("=SUM(D8-B3)");
}
  

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

Комментарии:

1. Спасибо за информацию @Diego! Я думаю, что я следую, и я попробую этот метод.

Ответ №2:

Не рекомендуется использовать несколько onEdit триггеров в одной электронной таблице

В случае простых onEdit триггеров невозможно иметь более одного для каждого проекта Apps Script, в случае устанавливаемых — это может привести к конфликтам.

Вместо этого привязать только одну функцию к триггеру и вызывать оттуда другую функцию в зависимости от условия.

Пример:

 function bindmeOnTrigger() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 amp;amp; col==4){
    function1();    
  } else if(row>7 amp;amp; col==3){
    function2();    
  }
}
function function1(){
  ...
}
function function2(){
  ...
}
  

Или просто:

 function bindmeOnTrigger() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 amp;amp; col==4){
    sheet.getRange(row, 5).setFormula("=SUM(D8-B3)");    
  } else if(row>7 amp;amp; col==3){
    sheet.getRange(row, 4).setValue(new Date());    
  }
}