Как проверить статус защиты листа / диапазонов Google? - PullRequest
1 голос
/ 02 октября 2019

Я создал код с помощью @OMila, чтобы ограничить некоторые диапазоны для определенных пользователей, одновременно защищая все оставшиеся диапазоны в листе от их редактирования. Я хочу проверить состояние защиты листа / диапазона для итерации цикла, еслион защищен ==> итерацией ++ (см. следующий лист), если не защищен, запустите скрипт и защитите диапазоны. Цель состоит в том, чтобы, когда некоторые люди создавали новые листы, я хочу, чтобы скрипт запускался автоматически с помощью триггера, но когда количество листов увеличивается, время выполнения будет увеличиваться для каждой электронной таблицы и, вероятно, достигнет предела котировок Google, поэтому мне нужно сделатьОптимизированный способ выполнения сценария путем установки условия if для проверки состояния защиты листа и выполнения действий, описанных выше. это код:

  function Sheet_Ranges_Protection() {
  var Veranda_Test = SpreadsheetApp.openById("Sheet ID");
  var Veranda_Sheets = Veranda_Test.getSheets();

  for(var SheetNumb = 0; SheetNumb < Veranda_Sheets.length; SheetNumb++) {

    var me = Session.getEffectiveUser();

    // Define ranges that will be protected for everyone
    var range1 = Veranda_Sheets[SheetNumb].getRange(6, 1, 
    Veranda_Sheets[SheetNumb].getMaxRows(), 
    Veranda_Sheets[SheetNumb].getMaxColumns());
    var range2 = Veranda_Sheets[SheetNumb].getRange(1, 8, 5, 
    Veranda_Sheets[SheetNumb].getMaxColumns());
    var range3 = Veranda_Sheets[SheetNumb].getRange(1, 4, 5);
    var ranges = [range1, range2, range3];

    // Set protection for all the sheet minus QC/PLN ranges
    for(var i = 0; i < ranges.length; i++) {
      var rangeProtection = ranges[i].protect().setDescription('Range protection');
      rangeProtection.addEditor(me);
      rangeProtection.removeEditors(rangeProtection.getEditors());
      if (rangeProtection.canDomainEdit()) {
        rangeProtection.setDomainEdit(false);
      }
    }

    var QC_Range         = Veranda_Sheets[SheetNumb].getRange("E1:G5");
    var PLN_Range        = Veranda_Sheets[SheetNumb].getRange("A1:C5");

    // Set protection for QC range
    var QC_protection = QC_Range.protect().setDescription('QC protection');
    QC_protection.removeEditors(QC_protection.getEditors());
    QC_protection.addEditor('Editor1@gmail.com');
    if (QC_protection.canDomainEdit()) {
      QC_protection.setDomainEdit(false);
    }

    // Set protection for PLN range
    var PLN_protection = PLN_Range.protect().setDescription('PLN protection');
    PLN_protection.removeEditors(PLN_protection.getEditors());
    PLN_protection.addEditor('Editor2@gmail.com');
    if (PLN_protection.canDomainEdit()) {
      PLN_protection.setDomainEdit(false);
    }    
    }
    }

1 Ответ

1 голос
/ 02 октября 2019

Вы можете использовать функцию getProtections(), чтобы проверить, какие виды защиты уже установлены, прежде чем создавать новые.

Поскольку вы создаете свою защиту исключительно с помощью диапазонов, вы можете использовать getProtections(SpreadsheetApp.ProtectionType.RANGE) для получениятолько защиты, созданные вашим сценарием (все они - диапазоны, а не защиты всей ширины).

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

var protections = Veranda_Sheets[SheetNumb].getProtections(SpreadsheetApp.ProtectionType.RANGE);
if (protections.length==0) {
   //add protections here
}

Если это небезопасное предположение, вы можете проверить, каких средств защиты не хватает, и создать их позже, например:

var protections = Veranda_Sheets[SheetNumb].getProtections(SpreadsheetApp.ProtectionType.RANGE);
var protectionNames = [];
for (var i=0; i<protections.length; i++) {
    protectionNames.push(protections[i].getDescription());
}

if (!protectionNames.includes('<name of protection i am about to create>') {
    //create protection '<name of protection i am about to create>'
} //else skip;

Надеюсь, этопомогает!

...