dollar
@dollar
Делай добро и бросай его в воду.

Можно ли нормальным способом запретить редактировать всё, кроме диапазона?

Например, запретить всю книгу или хотя бы весь лист, но открыть отдельную ячейку или диапазон.

Сейчас, если два диапазона перекрываются, приоритет запрета больше. Таким образом, если запретить весь лист, то никакие разрешительные диапазоны не работают. Приходится делать примерно так:
spoiler
5e3285aa20e48842166308.png

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

Кроме того, при таком способе у редактора остаётся возможность вставлять новые столбцы, менять ширину столбца, добавлять новые листы. И если редактора удалить из списка тех, кто имеет доступ к таблице, то каким-то чудом доступ останется для чтения (доступа по ссылке нет) из-за того, что редактор остался в каком-то диапазоне.

Получается довольно странно:
1) С одной стороны, нельзя создавать новые диапазоны (разрешительные), которые перекрывают вышестоящие (запретительные). Было бы удобно.
2) С другой стороны, когда дело касается самого главного - доступа к документу вообще, внезапно оказывается, что приоритет доступа всё же есть, хотя здесь он уже не нужен.
  • Вопрос задан
  • 324 просмотра
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Sheets
Google Products Expert
Вы можете защитить лист и добавить исклюючения в защиту листа, а не добавлять "разрешительный" диапазон.

Например, вы не можете создать новый лист или изменить структуру текущего листа, но можете редактировать A1 https://docs.google.com/spreadsheets/d/1nleri9Tedl...

Я в своих проектах делаю скрипты, которые качественно обрабатывают несколько слоев защиты. Это намного быстрее, чем руками.

/**
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
 */
function protectSheet_(sheet) {
  var protection = sheet.protect().setDescription('Autoprotection');
  var unprotected = sheet.getRangeList(getCommonNotasList_()).getRanges();
  protection.setUnprotectedRanges(unprotected);

  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());
  protection.addEditors(editors);
  if (protection.canDomainEdit()) protection.setDomainEdit(false);
};

var getCommonNotasList_ = function() {
  var a1Notations = [
    'B2:B4',
    'B6:B7',
    'A14:E30',
    'I3:Q26',
    'S2:V21',
    'T33:W264'
  ];
  return a1Notations;
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы