Есть ли способ динамически добавлять / удалять доступ редакторов к защищенным ячейкам с помощью значений флажков на листе Google? - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в Google Apps Scripts и озадачен проблемой управления доступом различных редакторов. У меня более 10 листов и 20 редакторов, и мне нужно распределить их права доступа в соответствии с их ролями. Я подумываю использовать флажки для добавления и удаления их прав доступа. Пока что это два кода, которые я получил от других. Один для отображения и скрытия меток времени путем установки / снятия флажков, а другой для добавления и удаления редакторов.

Для меток времени

function runEmailAccess(){

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sEditors = ss.getSheetByName('Sheet Name');
var sheet = SpreadsheetApp.openById("Sheet ID");

var nAddEditor = sEditors.getRange('A2').getValue();
if (nAddEditor != 0){
var vAddEditor = sEditors.getRange('A3:A'+nAddEditor).getValues();
sheet.addEditors(vAddEditor);
 }

var nRemoveEditor = sEditors.getRange('B2').getValue();
if (nRemoveEditor != 0){
var vRemoveEditor = sEditors.getRange('B3:B'+nRemoveEditor).getValues();

for (j=0;j<vRemoveEditor.length;j++) {
  sheet.removeEditor(vRemoveEditor[j][0])
}
}

} 

Для флажков

function onEdit(e){
  if (e.range.columnStart == 6 && e.range.columnEnd == 6 && e.range.rowStart <= 20) {
    var ckeckboxRange = "F1:F20";
    var date = new Date();
    var range = e.source.getRange(ckeckboxRange);
    var values = range.getValues().map(function(e) {return e[0] === true ? [date] : [""]});
    range.offset(0, 1).setValues(values);
  }
}

var SpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var editors = SpreadSheet.getEditors();
for (var i = 0; i < editors.length; i++) {
     SpreadSheet.removeEditor(editors[i]);
    };

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

Ожидаемый результат

Большое спасибо за все полезные комментарии.

1 Ответ

1 голос
/ 09 июля 2020

Вам потребуются следующие компоненты:

  • триггер onEdit
  • Проверка того, какой флажок был отредактирован, и подключение к соответствующему листу
  • Получить редактор из строки с флажком
  • Убедитесь, что флажок установлен или не установлен

Ниже приведен образец, обеспечивающий эту функциональность:

function onEdit(e){
  var ss = SpreadsheetApp.getActive();
  //change name of the sheet if necessary!
  var sheetWithCheckBoxes = ss.getSheetByName("Sheet1");
  var column =  e.range.getColumn();
  if (e.range.getSheet().getName() == sheetWithCheckBoxes.getName() && (column == 3 || column == 4 || column == 5)) {
    Logger.log("if");
    var spreadsheet2 = SpreadsheetApp.openById("XXX");
    var sheet;
    switch (column){
      case 3:
        sheet = ss.getSheetByName("name");
        break;
      case 4:
        sheet = ss.getSheetByName("name2");
        break;
      case 5:
        sheet = spreadsheet2.getSheetByName("name3");
        break;
    }       
   
    var protection = sheet.protect();
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
    var editor = sheetWithCheckBoxes.getRange(e.range.getRow(), 2).getValue();
     Logger.log(e.value);
    if(e.value == "TRUE"){
       Logger.log("true");
      protection.addEditor(editor);
    }
    if(e.value == "FALSE"){
            Logger.log("false");
      protection.removeEditor(editor);
    }
  }
}

Примечание: В этом примере первые два листа находятся в той же электронной таблице, что и лист с флажками, а третья таблица находится в другой электронной таблице.

Пожалуйста, адаптируйте листы и таблицы в соответствии с вашими потребностями.

ОБНОВЛЕНИЕ

Для настройки не только защиты листа, но и предоставления доступа к электронной таблице новым пользователям необходимо использовать метод DriveApp.getFileById (id) .addEditor (editor) .

Однако DriveApp.getFileById(id) - это вызов, который не может быть запущен простым триггером onEdit из-за ограничений .

Решение:

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

Пример настройки разрешений для электронной таблицы и листа:

function Edit(e){
  var ss = SpreadsheetApp.getActive();
  //change name of the sheet if necessary!
  var sheetWithCheckBoxes = ss.getSheetByName("Sheet1");
  var column =  e.range.getColumn();
  if (e.range.getSheet().getName() == sheetWithCheckBoxes.getName() && (column == 3 || column == 4 || column == 5)) {
    var spreadsheet2 = SpreadsheetApp.openById("XXX");
    var sheet;
    var id;
    switch (column){
      case 3:
        sheet = ss.getSheetByName("name");
        id = ss.getId();
        break;
      case 4:
        sheet = ss.getSheetByName("name2");
        id = ss.getId();
        break;
      case 5:
        id = spreadsheet2.getId();
        sheet = spreadsheet2.getSheetByName("name3");
        break;
    }       
    var protection = sheet.protect();
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
    var editor = sheetWithCheckBoxes.getRange(e.range.getRow(), 2).getValue();
    Logger.log(e.value);
    if(e.value == "TRUE"){
      DriveApp.getFileById(id).addEditor(editor);
      protection.addEditor(editor);
    }
    if(e.value == "FALSE"){
      protection.removeEditor(editor);
    }
  }
}

...