Как сделать проверку условий protect?

Рейтинг: 0Ответов: 1Опубликовано: 25.01.2023

Всем привет! Функция блокирует ячейку, когда в "D22" значение не 25. Как добавить условие проверки определенной ячейки, что она уже защищена? если защищена – ничего не делать, если не защищена – защитить (код добавил).

если не добавить проверку - будет создано, каждый раз, бесконечное количество правил на "D22", когда там значение не 25 :(

function test6666() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var test7 = ss.getSheetByName('ТЕСТ7');
  var d22 = test7.getRange('D22').getValue();
  var d222 = test7.getRange('D22');

  if (d22 == 22) {

  } else {

    var protection = d222.protect().setDescription('Protect Sheet');
    var editors = ["test@gmail.com.ua"];
    protection.addEditors(editors);
    protection.removeEditors(protection.getEditors());
  }
}

Ответы

▲ 0

Как вариант, можно просто проверять, является ли адрес диапазона адресом, который уже находится в списке защит. Это очень примитивный способ, но должен быть эффективным, когда идет попытка защитить колонку/строку/ячейку/конкретный диапазон

function test6666() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var test7 = ss.getSheetByName('ТЕСТ7');
  var d22 = test7.getRange('D22').getValue();
  var d222 = test7.getRange('D22');
  const a1notation = d222.getA1Notation();


  if (d22 == 22) {

  } else if (
    !test7.getProtections(SpreadsheetApp.ProtectionType.RANGE)
      .some(p => () => isSameProtection_(p, a1notation))
  ) {
    var protection = d222.protect().setDescription('Protect Sheet');
    var editors = ["ai@contributor.pw"];
    protection.addEditors(editors);
    protection.removeEditors(protection.getEditors());
  }
}

/**
 * 
 * @param {globalThis.SpreadsheetApp.Protection} protection
 * @param {string} rangeA1Notation
 * @param {checkCallback} checkCallback
 */
function isSameProtection_(protection, rangeA1Notation, checkCallback = undefined) {
  const a1Notation = protection.getRange().getA1Notation();
  return a1Notation === rangeA1Notation && (checkCallback ? checkCallback(protection) : true);
}

/**
 *
 * @callback checkCallback
 * @param {globalThis.SpreadsheetApp.Protection} protection
 * @returns {boolean}
 */

Пример в Таблице https://docs.google.com/spreadsheets/d/1A7Vm_TBMnIpxwkcE6wsLdiHJuioS52gWh6Gd9YvaYnI/edit?usp=sharing