Правильно ли я использую службу блокировки скриптов Google Apps? - PullRequest
2 голосов
/ 07 марта 2019

У меня есть 3 функции скриптов приложений в скрипте. Сценарий развернут как веб-приложение общего доступа.

Каждая функция читает из своего собственного листа Google. Каждая функция ничего не записывает на листы.

Я применил скрипт Script Apps к каждой функции, чтобы предотвратить одновременный доступ нескольких пользователей к электронным таблицам через веб-приложение. По сути, заставляя каждого пользователя ждать, пока скрипт предыдущего пользователя не закончит чтение. Им дается прочитать 3 листа.

Я обнаружил, что иногда это может создать небольшую задержку в 4 или 5 секунд для пользователей перед обновлением приложения, что совершенно неуместно.

Мой вопрос, должен ли я - а) возиться с LockService, так как я просто читаю данные электронной таблицы, и, возможно, основная цель LockService - предотвратить конфликты между одновременным чтением и записью

Или

б) Правильно ли это реализовать, так как одновременное чтение данных может также вызвать конфликты, такие как значения диапазона и т. Д.

спасибо

РЕДАКТИРОВАТЬ: если опция «а», то мне интересно, какова цель LockService? Возможно, это одна из причин (как и в других сценариях), когда вы используете несколько «google.script.run». Один за другим для доступа к одной и той же электронной таблице с помощью различных функций, а затем - поскольку они выполняются асинхронно - могут возникнуть конфликты, если оба запроса пытаются получить данные.

просто размышляю на самом деле ....

1 Ответ

0 голосов
/ 08 марта 2019

Вам не нужно использовать LockService, если все, что вы делаете, это чтение данных.Следовательно, опция (a).

Нет необходимости защищать Apps Script или Google Sheets от параллелизма, даже операций записи от того же пользователя.Каждый параллельный доступ, который вы делаете из Apps Script, выполняется полностью независимо друг от друга, это новый экземпляр вашего приложения, который ничего не делит с другими, он может даже работать на другом сервере полностью.А Google Sheets прекрасно справляется с параллелизмом, а совместная совместная работа - вот и весь смысл приложений G Suite.

Итак, когда вам нужно LockService?

Когда логика вашего приложения требует этого.Например, чтобы защитить себя от путаницы собственных данных.Допустим, вы хотите подсчитать, сколько кликов у вас было, и сохранить это число на листе, например, Sheet1!B2.Таким образом, ваш код будет выглядеть следующим образом:

function countClicks() {
  var r = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('B2');
  var clicks = r.getValue();
  clicks = clicks + 1;
  r.setValue(clicks);
}

Если эта функция запускается одновременно, вы не собираетесь испортить память или сломать листы Google, все, что может произойти, это то, что вы можете перезаписать себя, какесли бы у вас было несколько пользователей, пытающихся набрать одну и ту же ячейку: выигрывает последняя.

Но ваша логика будет нарушена, то есть несколько одновременных кликов могут быть засчитаны как один.Вот когда приходит LockService , чтобы защитить вашу логику:

function countClicks() {
  var r = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('B2');
  var lock = LockService.getDocumentLock();
  lock.waitLock(10000); //throws exception if fails to acquire lock
  //you could try-catch it, but that's irrelevant in this example
  r.setValue(r.getValue()+1);
  SpreadsheetApp.flush(); //forces the script to actually send the values to Sheets
  lock.releaseLock();
}

Надеюсь, это прояснит это.

Кстати, это просто очень неудачный пример.Это не то, как вы должны считать клики, потому что, как вы указали, блокировка добавляет значительную задержку в вашей системе.Поэтому вы должны искать альтернативы, возможно, разделить ваши данные на пользователя или использовать атомарные операции, такие как appendRow .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...