Вам не нужно использовать 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 .