#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
Я проверяю посещаемость учащихся с помощью приложения для Android, которое заполняет таблицу Google.
Из приложения поступают различные поля, такие как временные метки, информация о штрих-коде, электронная почта, геолокация и код темы.
Существует onChange
триггер, который создает временную метку и вставляет ее в столбец на листе с именем subject code (ICTE4115).
Проблема
Когда я включаю посещаемость, чтобы учащиеся могли отмечать свою посещаемость, многие пытаются делать это одновременно, особенно в течение первых нескольких минут. Мой код работает нормально, но в некоторых случаях
onChange
триггер не работает, и ввод не вставляется в таблицу Google. Это может произойти из-за проблем с сетью. Не уверен, работают ли службы БЛОКИРОВКИ вообще. Что я могу сделать?
Мой код выглядит следующим образом:
function autoConvert(e) {
try {
LockService.getScriptLock().waitLock(2000);
var ss = e.source;
var sh = ss.getActiveSheet();
var key = sh.getName();
var lastRow = sh.getLastRow();
if (
key.indexOf("0") > -1 ||
key.indexOf("1") > -1 ||
key.indexOf("2") > -1 ||
key.indexOf("3") > -1 ||
key.indexOf("4") > -1 ||
key.indexOf("5") > -1 ||
key.indexOf("6") > -1 ||
key.indexOf("7") > -1 ||
key.indexOf("8") > -1 ||
key.indexOf("9") > -1
) {
if (lastRow > 10) {
sh.getRange(lastRow - 9, 6).setValue(key);
sh.getRange(lastRow - 9, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 8, 6).setValue(key);
sh.getRange(lastRow - 8, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 7, 6).setValue(key);
sh.getRange(lastRow - 7, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 6, 6).setValue(key);
sh.getRange(lastRow - 6, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 5, 6).setValue(key);
sh.getRange(lastRow - 5, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 4, 6).setValue(key);
sh.getRange(lastRow - 4, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 3, 6).setValue(key);
sh.getRange(lastRow - 3, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 2, 6).setValue(key);
sh.getRange(lastRow - 2, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 1, 6).setValue(key);
sh.getRange(lastRow - 1, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow, 6).setValue(key);
sh.getRange(lastRow, 1).setNumberFormat("yyyy-mm-dd");
} else {
for (var i = 2; i <= lastRow; i ) {
sh.getRange(i, 6).setValue(key);
sh.getRange(i, 1).setNumberFormat("yyyy-mm-dd");
}
}
}
LockService.getScriptLock().releaseLock();
} catch (e) {
SpreadsheetApp.flush();
}
}
Ответ №1:
Это известная проблема с триггерами.
Обязательно отметьте проблему «звездочкой», чтобы разработчики Google знали, что это влияет на вас.
Проблема:
Если в листе происходит много изменений в быстрой последовательности (<500 мс — по крайней мере, в моих тестах), то функции запуска будут «потеряны». Похоже, это то, что вы испытываете. Ведение журнала в облачной консоли Google подтверждает это, поскольку не регистрирует ошибок, только те функции запуска, которые были успешно выполнены.
Возможное решение:
Веб-приложение
В зависимости от количества учащихся вы можете попробовать настроить веб-приложение Apps Script. Это может, например, привести к тому, что ваше приложение для Android отправит запрос POST в веб-приложение. Вашему веб-приложению потребуется doPost
функция, которая будет редактировать таблицу Google на основе параметров в запросе POST.
В соответствии с квотами Google может быть только 30 одновременных подключений к веб-приложению. Тем не менее, это должно быть большим улучшением по сравнению с триггерами, которые, AFAIK, могут ставить в очередь только 2 триггера. Тем не менее, как только onEdit
триггеры начнут выполняться, многие другие могут выполняться параллельно.
Комментарии:
1. это триггер onChange, а не onEdit.
2. В этом отношении он будет иметь очень похожее, если не идентичное поведение
onEdit
.3. Интересно, что проблема вновь открывается после «не исправить». Может быть, все-таки есть надежда.