Как изменить диапазон защиты в зависимости от значения? - PullRequest
1 голос
/ 15 апреля 2020

Я делюсь электронной таблицей с коллегами на двух листах «Мои настоящие проекты», «Новые проекты», и я хотел бы заблокировать эти листы, открыв (более или менее работ), но мне нужно оставить ячейку A3 свободной для изменений, в A3 - это выпадающее меню, если пользователь выбирает один элемент из списка, он открывает следующие три ячейки, если пользователь удаляет значение из ячейки A3, он снова блокирует 3 ячейки. Ниже приведен код, я действительно сумасшедший (провел 5 часов). Я вижу, что заблокированные диапазоны изменились как владелец, но другие не видят никаких изменений. Не могли бы вы мне помочь. Thx

function onOpen(e) {
  var myActualProjectsSheet = SpreadsheetApp.getActiveSheet();
  var myActualProjectsProtection = myActualProjectsSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET);

  for (var j = 0, jLen = myActualProjectsProtection.length; j < jLen; j++) {
    myActualProjectsProtection[j].remove();
  }

  var newProjectsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('New projects');
  var newProjectsProtection = newProjectsSheet.protect();
  var newProjectsUnprotected = newProjectsSheet.getRange('A3');
  newProjectsProtection.setUnprotectedRanges([newProjectsUnprotected]);
  newProjectsProtection.removeEditors(newProjectsProtection.getEditors());

  var myActualProjectsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('My actual projects');
  var myActualProjectsProtection = myActualProjectsSheet.protect();
  var myActualProjectsUnprotected = myActualProjectsSheet.getRange('A3');
  myActualProjectsProtection.setUnprotectedRanges([myActualProjectsUnprotected]);
  myActualProjectsProtection.removeEditors(myActualProjectsProtection.getEditors());

}

function onEdit(e){

  var myActualProjectsSheet = SpreadsheetApp.getActiveSheet();
  var Protection = myActualProjectsSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET);
  var myActualProjectsUnprotected1 = myActualProjectsSheet.getRange('A3');
  var myActualProjectsUnprotected2 = myActualProjectsSheet.getRange('A17');
  var myActualProjectsUnprotected3 = myActualProjectsSheet.getRange('A19');
  var myActualProjectsUnprotected4 = myActualProjectsSheet.getRange('A21');

  for (var j = 0, jLen = Protection.length; j < jLen; j++) {
    Protection[j].remove();
  }

    var myActualProjectsProtection = myActualProjectsSheet.protect();

  if(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('My actual projects').getRange('A3').getValue() != ''){
    myActualProjectsProtection.setUnprotectedRanges([myActualProjectsUnprotected1,myActualProjectsUnprotected2,myActualProjectsUnprotected3,myActualProjectsUnprotected4]);
  }
  else{
    myActualProjectsProtection.setUnprotectedRanges([myActualProjectsUnprotected1]);
  }
  myActualProjectsProtection.removeEditors(myActualProjectsProtection.getEditors());
}

1 Ответ

1 голос
/ 15 апреля 2020

Боюсь, этого невозможно достичь из-за того, как защищенные диапазоны работают на листах.

Защита действий для каждого объекта Range, поэтому, если вы не защитите каждую ячейку одну за другой, вы не сможете «снять защиту» их по отдельности, поскольку Protect является свойством Range, который вы определили. Добавление новой защиты с редакторами для определенной ячейки также не работает, поскольку наиболее ограничивающее правило защиты (первое) имеет больший приоритет.

Кроме того, это плохая идея. Как вы можете прочитать в документации :

Если вы не хотите, чтобы люди меняли содержимое в электронной таблице, вы можете защитить его. Это не должно использоваться в качестве меры безопасности . Люди могут печатать, копировать, вставлять, а также импортировать и экспортировать копии защищенной электронной таблицы. Делитесь электронными таблицами только с теми, кому доверяете.

Добавление защищенных диапазонов в функции onEdit или onOpen также не подходит. Защищенные диапазоны не перезаписываются, они создают новый слой для каждого запуска редактирования или запуска. В конечном итоге это будет очень запутанным и не будет работать, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...