#google-apps-script #google-sheets #google-sheets-formula
Вопрос:
Я сделал этот простой скрипт, чтобы автоматически ставить флажки при вводе данных определенных имен. Это хорошо работает, но кажется очень медленным (полная секунда, может быть, больше) для такого простого сценария. Мне было интересно, есть ли более эффективный/элегантный/быстрый способ написать это, я абсолютный новичок в JS и кодировании в целом, и я хотел бы получить совет о том, как более эффективно писать это для сценариев Google.
Два условия заключаются в том, чтобы предотвратить запуск макроса, если имя введено в другом столбце, и оператор else просто для быстрой коррекции, если введено неправильное имя, так как целевая ячейка связана с большим количеством условного форматирования.
Сценарий таков
function onEdit() {
var current = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getCurrentCell();
var name = current.getValue();
var nameRow = current.getColumn();
if(name == "Russell" amp;amp; nameRow == 7) {
current.offset(0,6).setValue(true);
}
else if(nameRow == 7) {
current.offset(0,6).setValue(false);
}
}
Спасибо!
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Вы хотите снизить стоимость процесса вашего сценария.
В этом случае, как насчет следующего измененного сценария?
Измененный сценарий:
function onEdit(e) {
var { range, value } = e;
if (range.rowStart != 7) return;
range.offset(0, 6).setValue(value == "Russell" ? true : false);
}
- При использовании объекта события стоимость процесса может быть немного снижена. Итак, я изменил ваш сценарий, используя объект события. Ссылка
- И, когда используется троичный оператор, стоимость процесса может быть немного снижена. Ссылка
- В
The two conditions are to prevent the macro from firing if the name is input in another column, and the else statement simply to correct quickly if the wrong name is entered, as the target cell is linked to a lot of conditional formatting.
этом случае может подойти услуга блокировки. Когда вы используете его, пожалуйста, протестируйте следующий сценарий.function onEdit(e) { var lock = LockService.getDocumentLock(); if (lock.tryLock(10000)) { try { var { range, value } = e; if (range.rowStart != 7) return; range.offset(0, 6).setValue(value == "Russell" ? true : false); } catch(err) { throw new Error(err); } finally { lock.releaseLock(); } } }
Примечание:
- Когда вы используете этот скрипт, пожалуйста, отредактируйте ячейку электронной таблицы. Потому что этот измененный сценарий запускается с использованием объекта события. При непосредственном запуске этого скрипта возникает ошибка. Пожалуйста, будьте осторожны с этим.
Рекомендации:
Ответ №2:
function onEdit(e) {
const sh = e.range.getSheet();
if (if sh.getName() == 'SheetName' amp;amp; e.range.rowStart == 7) {
if (e.value == "Russell") {
e.range.offset(0, 6).setValue(true);
} else {
current.offset(0, 6).setValue(false);
}
}
}
На самом деле я никогда не находил onEdit() особенно быстрым. Если запуск занимает всего секунду, то, вероятно, вы ничего не сможете сделать, чтобы улучшить его. Это серверная система, а не ваш личный ноутбук или рабочий стол.
Комментарии:
1. Если вы хотите, чтобы он работал быстрее, купите Google и вышвырните всех остальных.
2. это время больших мозгов