addEditor и removeEditor на определенных условиях для листа Google - PullRequest
0 голосов
/ 07 июня 2019

Я узнал из [этого вопроса] ( Автоматическая блокировка / защита строк / ячеек в Google Sheets в определенное время в других ячейках ) о том, как заблокировать определенные ячейки при определенных условиях, и ответ Джесс работает отлично. ,

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

Здесь код, который я пересмотрел, основываясь на ответе Джесса, блокировка (removeEditor) работает нормально, но условие «иначе, если», которое я добавил, чтобы разблокировать ячейку, не сработало, и ячейки НЕ разблокируются при условии.

Любая помощь будет принята с благодарностью !!

function onEdit(e) { 

 var ss1=SpreadsheetApp.getActiveSpreadsheet();

 var sheet1=ss1.getSheetByName("Sheet Name");  

 var active = sheet1.getActiveCell();

 var nextnum = sheet1.getRange(active.getRow(),8).getValue();

 var shouldbeblocking= sheet1.getRange(active.getRow()-1,7)

 var them = Session.getActiveUser();

 var theiremails = them.getEmail();


// to unlock the cell, NOT WORKING

   if (nextnum == 22) {

 shouldbeblocking.protect().addEditor(theiremails);

 shouldbeblocking.setNote("unLocked") ;
  }

 // to lock the cell (codes working fine)

  else if (nextnum == 1) {

 shouldbeblocking.protect().removeEditor("xxx@xxx.com") ;
 shouldbeblocking.setNote("Locked") ;
  }



}

Согласно предложению @ ross, я добавил Logger.log в свой код (в операторе if), а ниже - скриншот транскрипта выполнения, кажется, что код проходит через оператор if и, как ни странно, «разблокирован» "setNote работает, потому что я могу видеть" разблокированную "заметку на ячейке, но эта ячейка все еще заблокирована:

enter image description here

1 Ответ

1 голос
/ 07 июня 2019

Итак, подведем итог - в документации по методу protect() есть заметка, которая легко игнорируется: « Если диапазон уже защищен, этот метод создает новый защищенный диапазон, который перекрывает существующий ».Это означает, что каждый раз, когда срабатывает ваш onEdit(e) триггер, вместо переопределения создается по крайней мере один новый уровень защиты.

Вместо этого вы должны получить доступ к Protection экземплярам, ​​созданным для Spreadsheet через getProtections()вызовите методы addEditor() и removeEditor() для элемента из результирующего Array (чтобы различать экземпляры Protection, используйте методы getRange() и getEditors() (не менее Logger.log()или console.log() их для отслеживания).

Возможно, вы захотите проверить, может ли пользователь редактировать защищенный Range перед процедурой добавления / удаления - в этом случае используйте метод canEdit() дляa aquired Protection.

Полезные ссылки

  1. canEdit(e) ссылка ;
  2. remove() ссылка ;
  3. getProtections() ссылкаence (защита должна быть отфильтрована по типу );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...