Обработка состояния гонки в Google Sheets
Я использую библиотеку Gspread для доступа и редактирования листов Google через Python. Есть ли хороший способ справиться с условиями гонки (не обязательно используя только grald), когда на одном листе могут писать несколько рабочих.
Я использую сервер Django, который будет принимать запросы на редактирование или обновление листа, в случае, если поступает несколько запросов, могу ли я использовать какой-либо механизм блокировки, чтобы у меня был только один работник, обращающийся к листу за раз, в то время как другой будет продолжать ждать получения заблокировать и получить доступ, когда предыдущие работники закончили редактирование листа.
1 ответ
Вы можете использовать Класс защиты для доступа и изменения защищенных диапазонов и листов. Также сообщалось как запрос функции (исправлено).
Защищенный диапазон может защищать либо статический диапазон ячеек, либо именованный диапазон. Защищенный лист может содержать незащищенные области.
Защитите диапазон A1:B10, затем удалите всех остальных пользователей из списка редакторов.
var ss = SpreadsheetApp.getActive(); var range = ss.getRange('A1:B10'); var protection = range.protect().setDescription('Sample protected range');
Убедитесь, что текущий пользователь является редактором, прежде чем удалять других. В противном случае, если пользовательское разрешение на редактирование приходит из группы, сценарий выдает исключение при удалении группы.
var me = Session.getEffectiveUser(); protection.addEditor(me); protection.removeEditors(protection.getEditors()); if (protection.canDomainEdit()) { protection.setDomainEdit(false); }
Удалите все ограничения диапазона в электронной таблице, которые пользователь имеет право редактировать.
var ss = SpreadsheetApp.getActive(); var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE); for (var i = 0; i < protections.length; i++) { var protection = protections[i]; if (protection.canEdit()) { protection.remove(); } }
Защитите активный лист, затем удалите всех остальных пользователей из списка редакторов.
var sheet = SpreadsheetApp.getActiveSheet(); var protection = sheet.protect().setDescription('Sample protected sheet');
Убедитесь, что текущий пользователь является редактором, прежде чем удалять других. В противном случае, если пользовательское разрешение на редактирование приходит из группы, сценарий выдает исключение при удалении группы.
var me = Session.getEffectiveUser(); protection.addEditor(me); protection.removeEditors(protection.getEditors()); if (protection.canDomainEdit()) { protection.setDomainEdit(false); }