Как автоматически удалить все средства защиты, которые существуют в ячейке в Google Sheets, когда я (владелец рабочей книги) очищаю ее содержимое? - PullRequest
1 голос
/ 06 февраля 2020

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

function onEdit(e) {

  var range = e.range;

  var timeZone = Session.getScriptTimeZone();
  var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
  var description = 'Protected on ' + stringDate;
  var protection = range.protect().setDescription(description);

  // below code taken directly from Google's documentation (second comment is my own):

  // Ensure the current user is an editor before removing others. Otherwise, if the user's edit
  // permission comes from a group, the script throws an exception upon removing the group.

  var me = Session.getEffectiveUser();
  //user who installed trigger

  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }      
}

Проблема в том, что я работаю со многими сменами и людей, что делает очень трудным и утомительным удаление любых средств защиты в случае, если кто-то должен отменить по уважительным причинам (листы Google не предоставляют способ поиска по вашим защищенным диапазонам). Я понимаю логику написания сценариев c, но я очень неопытен, работая с ними. Я мог бы действительно использовать некоторую помощь, создавая что-то, что снимет все защиты в любой ячейке, с которой я очищаю данные.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

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

0

Сценарий будет:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0]; // assuming you want the first sheet
var protections = sheet.getProtections();
for (var i = 0; i < protections.length; i++) {
  if (protections[i].getDescription() == 'Protect column A') { //name of protected range
    protections[i].remove();
  }
}  

, а для массовой снятия защиты см. https://webapps.stackexchange.com/a/99304/186471

0 голосов
/ 10 февраля 2020

Вы можете получить все защиты для листа с помощью getProtections [1] и найти, какая защита от всех защит в листах очищается, используя метод getRange [2] для каждого объекта защиты, чтобы узнать диапазон защиты и снимите защиту, если нотация A1 совпадает с отредактированным диапазоном (диапазон от события onEdit), например:

function onEdit(e) {
  var range = e.range;
  var newValue = range.getValue();

  //If cell's new value is empty then remove protection
  if(newValue == '') {
    var sheet = range.getSheet();
    var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);

    //Iterate through all sheet's protections
    for (var i = 0; i < protections.length; i++) {
      var protection = protections[i];
      if (protection.getRange().getA1Notation() == range.getA1Notation()) {
        protection.remove();
      }
    }
  }
  else {
    var timeZone = Session.getScriptTimeZone();
    var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
    var description = 'Protected on ' + stringDate;
    var protection = range.protect().setDescription(description);

    // below code taken directly from Google's documentation (second comment is my own):

    // Ensure the current user is an editor before removing others. Otherwise, if the user's edit
    // permission comes from a group, the script throws an exception upon removing the group.

    var me = Session.getEffectiveUser();
    //user who installed trigger

    protection.addEditor(me);
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }      
  }
}

[1] https://developers.google.com/apps-script/reference/spreadsheet/sheet#getprotectionstype

[2] https://developers.google.com/apps-script/reference/spreadsheet/protection.html#getrange

[3] https://developers.google.com/apps-script/reference/spreadsheet/range#geta1notation

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