#google-apps-script #google-sheets
#google-apps-script #google-таблицы
Вопрос:
Цель:
- Добавьте границы в диапазон ячеек в зависимости от того, не является ли ячейка в столбце H следующей таблицы null. В таблице есть имена и общие номера билетов, которые будут появляться или исчезать автоматически в зависимости от определенных дат данных, которые я извлекаю с помощью функции ЗАПРОСА. И я хочу иметь возможность добавлять границы в диапазон ячеек, где имена отображаются в ячейках столбца H.
Например, допустим, впервые в ячейке H3 появляется имя с именем «John A». В этом случае я хочу иметь возможность добавлять границы в H3: I3. И если «John B» появляется под «John A», то я хочу добавить еще одну границу к H4: I4. И так далее.
- Удаление границ зависит от того, были ли удалены значения в ячейках столбца H.
Например, если «John B» был автоматически удален для ячейки H4, то я хочу также удалить границы для H4: I4. И если «John A» также был удален из ячейки H3, то я хочу также удалить границы для H3: I3.
Текущий код: я пытаюсь передать параметры из функции onEdit(), которая находится в другом файле, в функцию insertDynamicBorders(), поскольку я думал, что это будет иметь значение для запуска события.
function insertDynamicBorders(row) {
var statusSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Status");
// Columns
dateColumn = 1;
if (row > 16) {
if (statusSheet.getRange("H3") != null ) {
var cell = statusSheet.getRange("H3:I3");
cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
} else {
var cell = statusSheet.getRange("H3:I3");
cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
}
if (statusSheet.getRange("H4") != null) {
var cell = statusSheet.getRange("H4:I4");
cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
} else {
var cell = statusSheet.getRange("H4:I4");
cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
}
if (statusSheet.getRange("H5") != null) {
var cell = statusSheet.getRange("H5:I5");
cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
} else {
var cell = statusSheet.getRange("H5:I5");
cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
}
if (statusSheet.getRange("H6") != null) {
var cell = statusSheet.getRange("H6:I6");
cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
} else {
var cell = statusSheet.getRange("H6:I6");
cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
}
if (statusSheet.getRange("H7") != null) {
var cell = statusSheet.getRange("H7:I7");
cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
} else {
var cell = statusSheet.getRange("H7:I7");
cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
}
}
}
Проблема:
- Граница не добавляется всякий раз, когда имя появляется в ячейке столбца H, однако границы добавляются, когда я вношу прямые изменения в источник данных, который я извлекаю из функции ЗАПРОСА.
- Когда границы добавляются, они добавляются в диапазоны ячеек, в которые включены имена, а также не включены в ячейки столбца H.
Комментарии:
1. «Выполнение скриптов и запросов API не приводит к запуску триггеров. Например, вызов Range.setValue() для редактирования ячейки не приводит к запуску триггера onEdit электронной таблицы » ссылка
2. Прочитайте документацию по простым триггерам. Они реагируют только на изменения пользователя.
3. Приношу свои искренние извинения и благодарю вас за отзывы. Я пройдусь по документу и попытаюсь подробнее разобраться в простых триггерах.
Ответ №1:
При использовании триггеров Apps Script onEdit
, в частности, важно учитывать следующее:
onEdit(e)
запускается, когда пользователь изменяет значение в электронной таблице.Выполнение скриптов и запросов API не приводит к запуску триггеров. Например, вызов
Range.setValue()
для редактирования ячейки не приводитonEdit
к запуску триггера электронной таблицы.
Принимая во внимание вышесказанное, то, что вы хотите, не может быть достигнуто напрямую.
Обходной путь
Что вы можете сделать в этой ситуации, так это использовать устанавливаемые триггеры и создать триггер, управляемый временем. Вы можете создать скрипт, который будет проверять наличие любых изменений, которые происходят в вашей электронной таблице по сравнению с предыдущей версией. Поскольку это должно быть сделано вами программно, это более громоздкий обход.
Другой вариант (по-прежнему использующий триггер, управляемый временем) — проверить, какая строка является последней в столбцах H
и I
(согласно вашему примеру), а также учитывая тот факт, что в эти столбцы вставляются только нужные значения.
Ссылка
Комментарии:
1. Приношу свои извинения за задержку здесь! Спасибо за объяснение и любезно предоставленный обходной путь!!