Возникли проблемы при вводе данных из приложения Android в таблицу Google и использовании триггера onChange?

#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. Интересно, что проблема вновь открывается после «не исправить». Может быть, все-таки есть надежда.