Как добавить редакторы для защиты всего листа для определенных вкладок? - PullRequest
0 голосов
/ 07 октября 2018

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

У меня есть таблица с вкладками (A, B, C, D, ....), эти вкладки содержат много защищенных диапазонов (например, A! 12) и должен оставаться защищенным для всех, кроме меня.Тем не менее, каждая вкладка также имеет (целую) защиту листа, где я бы выбирал (вручную) пользователя, которому разрешено редактировать на этой вкладке (что я обнаружил здесь, чтобы предотвратить редактирование одной и той же электронной таблицы многими редакторами).редактировать защищенные вкладки).

Демонстрация электронных таблиц

Использование сценария: можно ли настроить лист, где я буду вводить электронные письма текущих редакторов вопределенный порядок (например, столбец, содержащий названия вкладок и рядом с ними электронные письма тех, кому разрешено их редактировать)?

ДОБАВЛЕН СЛЕДУЮЩИЙ СЦЕНАРИЙ

function SetProtection() {

var ss = SpreadsheetApp.getActive();
  //removes sheet protection
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
 protection.remove();
}
}

var sh7 = ss.getSheetByName("Sheet1");
var protection = sh7.protect().setDescription('Whole Sheet Protected');  
//protects whole sheet
protection.addEditors(['test@gmail.com']); 
  }

Большое спасибо

1 Ответ

0 голосов
/ 19 октября 2018

С огромной помощью я получил все, что хотел, вот основной код:

Особая благодарность RENO BLAIR за его огромную помощь и всем, кто тоже пытался помочь (@Tanaike++)

Я делюсь кодом, может быть, это может быть полезно для некоторых людей:

Примечания:

  • Сценарий запускается каквскоре вы отредактируете лист Setup_Protection
  • Если вы не упомянете некоторые вкладки на листе настроек, по умолчанию они будут защищены
  • , если вы перечислите их, но оставите ячейку рядом сбез электронной почты скрипт запустится и остановится на вкладке, где не упоминается электронная почта.

CODE.gs

var environment = {
protectionConfigSheetName: "Setup_Protection",
};

// Script fires when the Setup_Protection SHEET is edited

function onEdit(e) {
if (e.range.getSheet().getName() === environment.protectionConfigSheetName) resetSpreadsheetProtections();
}



function removeSpreadsheetProtections(spreadsheet) {
    [
        SpreadsheetApp.ProtectionType.SHEET,
                                           //SpreadsheetApp.ProtectionType.RANGE,   // I don't want to remove the Range Protections that I will set up in each tab
    ].forEach(function (type) {
        return spreadsheet.getProtections(type).forEach(function (protection) { return protection.remove(); });
    });
}

  function getProtectionConfig(spreadsheet) {

      var protectionConfigSheetName = "Setup_Protection";
      var sheet = spreadsheet.getSheetByName(environment.protectionConfigSheetName); 

      var values = sheet.getDataRange().getValues();
      var protectionConfig = values
          .slice(1)
          .reduce(function (protectionConfig, _a) {
          var targetSheetName = _a[0], emailAddress = _a[1];
          var config = protectionConfig.find(function (_a) {
              var sheetName = _a.sheetName;
              return sheetName === targetSheetName;
          });
          var editors = emailAddress.split(",");
          if (config)
              config.editors = config.editors.concat(editors);
          else
              protectionConfig.push({
                  sheetName: targetSheetName,
                  editors: editors.slice()
              });
          return protectionConfig;
      }, []);
      return protectionConfig;
  }


function setSpreadsheetProtections(spreadsheet, protectionConfig) {
    spreadsheet.getSheets().forEach(function (sheet) {
        var protection = sheet.protect();
        protection.removeEditors(protection.getEditors().map(function(editor) {
            return editor.getEmail();
        }));
        var currentSheetName = sheet.getName();
        var config = protectionConfig.find(function (_a) {
            var sheetName = _a.sheetName;
            return sheetName === currentSheetName;
        });
        if (config)
            protection.addEditors(config.editors);
    });
}
  function resetSpreadsheetProtections() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var protectionConfig = getProtectionConfig(spreadsheet);
  removeSpreadsheetProtections(spreadsheet);
  setSpreadsheetProtections(spreadsheet, protectionConfig);
  }

Существует еще один файл, также называемый Polyfill (и также необходимый):

Polyfill.gs

// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, "find", {
    value: function(predicate) {
      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== "function") {
        throw new TypeError("predicate must be a function");
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return undefined.
      return undefined;
    },
    configurable: true,
    writable: true,
  });
}
...