Google Sheet уровни защиты и доступа к диапазонам ячеек (все, определенные, на основе email)
SourceSheet (источник) доступен: SourceSheet
Правила защиты ячеек:
- Диапазоны B2:B10 и B13:B21 могут редактировать все.
- Диапазоны D2:D10 и F2:F10 могут редактировать только пользователи, указанные в учетной записи по электронной почте.
- Все остальные оставшиеся ячейки защищены и никто не может их редактировать.
Код:
function setEditPermissions() {
var sheetUrl = 'https://docs.google.com/spreadsheets/d/1r3nQZ1ZS0Y9zUv1ZfdjQlWIVHSqf-wF4neNDksCse6Y/edit?usp=drive_link';
var sheetName = 'Sheet1';
protectAllCells(sheetUrl, sheetName )
setEditable(sheetUrl, sheetName)
setEmailAccess(sheetUrl, sheetName)
}
function protectAllCells(sheetUrl, sheetName ) {
var ss = SpreadsheetApp.openByUrl(sheetUrl);
var sheet = ss.getSheetByName(sheetName);
// Защищаем все ячейки на листе
var protection = sheet.protect().setDescription('Защита всего листа');
// Устанавливаем права доступа на редактирование
var me = Session.getEffectiveUser();
protection.addEditor(me);
}
function setEditable(sheetUrl, sheetName) {
var ss = SpreadsheetApp.openByUrl(sheetUrl);
var sheet = ss.getSheetByName(sheetName);
var editableRanges = ['B2:B10', 'B13:B21'];
editableRanges.forEach(function(rangeStr) {
var range = sheet.getRange(rangeStr);
var protection = range.protect().setDescription('Защита диапазона ' + rangeStr);
protection.remove();
});
}
function setEmailAccess(sheetUrl, sheetName) {
var ss = SpreadsheetApp.openByUrl(sheetUrl);
var sheet = ss.getSheetByName(sheetName);
// Диапазоны, которые нужно защитить
var rangesToProtect = ['D2:D10', 'F2:F10'];
// Пользователи, которым разрешено редактировать диапазоны
var allowedUsers = ['[email protected]'];
rangesToProtect.forEach(function(rangeStr) {
var range = sheet.getRange(rangeStr);
var protection = range.protect().setDescription('Защита диапазона ' + rangeStr);
// Удаляем все предыдущие редакторы
protection.removeEditors(protection.getEditors());
// Запрещаем редактирование всем, кроме указанных пользователей
protection.addEditors(allowedUsers);
// Разрешаем только указанным пользователям редактировать
//protection.setWarningOnly(true);
});
}
Первый шаг (защита листа работает с функцией ProtectAllCells ). Следующие 2 шага (функции: setEditable, setEmailAccess ) не сработали. Но логика кажется верной.
Можно ли это реализовать с помощью Google Apps Script и Google Sheets по кодам?
Ответы (1 шт):
А что именно не сработало? Насколько позволяет мне судить мой опыт работы со скриптами, при каждом вызове функции protect() накладывается защита. Эту проблему я решила просто заранее определив в отдельную переменную диапазоны с вызовом функции protect() и уже работала с этой переменной. В вашем случае примерно так: var protectRange=sheet.getRange(rangeStr).protect()
и уже потом: protectRange.removeEditors(protectRange.getEditors()) protectRange.addEditors('здесь нужно указать почту редактора или массив из почт')
Таким образом вы один раз защитите диапазон и потом будете просто удалять редакторов при добавлении пользователей.
