Apps Script - снять защиту - PullRequest
       12

Apps Script - снять защиту

0 голосов
/ 20 июня 2019

Я хочу ограничить редактирование ячеек в Google Sheet, разрешив пользователю редактировать только пустые ячейки или ячейки, заполненные им, но не ячейки, заполненные другими редакторами.Проще говоря:

  1. Если ячейка пуста, любой редактор документов может записать в нее содержимое
  2. Как только редактор поместит содержимое в ячейку, только он и владельцы документов должна иметь возможность редактировать его дальше
  3. Если ячейка очищена ее автором или одним из владельцев документа, защита должна быть автоматически удалена, так что любой редактор теперь может ее редактировать (вернуться к шагу1)

Я пытаюсь использовать Apps Script для этого, но похоже, что вы не можете удалить a Защита, а также не получите список защит, применимых к конкретной ячейке.

Возможно ли это сделать?

Ответы [ 2 ]

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

Типы защиты

Protection необязательно устанавливать в целом Sheet, вы можете вызвать метод protect() для Range по вашему выбору, будь то одна ячейка или пользовательский Range.

Снятие защиты

Существует метод, предназначенный для удаления Protection из Sheet / Range, он называется remove(). Его можно вызывать для любого Protection, ранее полученного с помощью вызова метода getProtections() (getProtections() метод возвращает Array всех Protection экземпляров).

В вашем случае результирующий поток будет выглядеть так:

  1. Ячейка очищается редактором -> вызов getProtections() -> проверка целевой ячейки -> remove();
  2. Ячейка получила значение -> вызов protect() -> добавить редакторы через addEditor() / addEditors();

Оба шага можно поместить в устанавливаемый триггер onEdit(), например, для запуска на редактируемой ячейке.

Пример сценария

Еще раз, то, что вы пытаетесь достичь, возможно, попробуйте следующий сценарий (не забудьте включить его в качестве обратного вызова устанавливаемого триггера). Он лишает других редакторов возможности редактировать эту ячейку до тех пор, пока текущий пользователь ее не очистит, и наоборот [UPD: оптимизированное использование getRow () и getColumn ()]. ​​

/**
 * Protects and unprotects ranges;
 * @param {Object} e event object;
 */
function protect(e) {

  //access edited range, value and sheet;
  var rng = e.range;
  var val = e.value;
  var sh  = rng.getSheet();

  //access edited range row and column;
  var row = rng.getRow();
  var col = rng.getColumn();

  //access protections;
  var ps = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE);

  //filter out other cells protections;
  ps = ps.filter(function(p){
   var ptd = p.getRange();
   if(row===ptd.getRow()&&col===ptd.getColumn()) {
     return p;
   }
  })[0];

  //if protection not set -> protect;
  if(!ps) {
    var protection = rng.protect(); //protect Range;
    var users = protection.getEditors(); //get current editors;

    protection.addEditor(Session.getEffectiveUser());
    protection.removeEditors(users); //remove other editors' access;
  }else {
    if(!val) { ps.remove(); } //if cell is empty -> remove protection;
  }

}

Предположения

Это объяснение и пример сценария предполагают среду, в которой getEffectiveUser() имеет значение (например, проект сценария не развернут как WebApp + execute as me и т. Д.).

О важности addEditor()

Согласно нашему обсуждению в комментариях, следует остерегаться возможности заблокировать себя при редактировании ячейки, если не использовать метод addEditor() до removeEditors() (условия тестирования для репликации: владелец таблицы GSuite, пользователь редактора Gmail , разрешения установлены на «Выкл.», устанавливается onEdit() триггер). Посмотрите, что может произойти:

enter image description here

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

  1. addEditor() ссылка ;
  2. remove() ссылка ;
  3. getProtections() ссылка ;
0 голосов
/ 21 июня 2019

Использование реальной защиты - нет.

Что вы могли бы сделать.

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

При каждом редактировании ячейки он проверяет наличие этих метаданных, и, если пользователь не совпадает с / admin, он возвращает содержимое текста к значению, которое было сохранено для ячейки ранее (возможно, с всплывающим сообщением «что не ваша клетка для редактирования ").

Добавьте что-то внизу функции, которая говорит, что если редактирование не имеет значения, очистите метаданные.

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