Google Sheet уровни защиты и доступа к диапазонам ячеек (все, определенные, на основе email)

Имеется этот Google Sheet : enter image description here

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('здесь нужно указать почту редактора или массив из почт')

Таким образом вы один раз защитите диапазон и потом будете просто удалять редакторов при добавлении пользователей.

→ Ссылка