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