Как можно удалить все защиты для всех пользователей в скрипте Google листа? - PullRequest
1 голос
/ 20 января 2020

У меня есть лист, в котором только столбцы A-C я хочу поделиться с user1, и только столбцы F-H для user2. Я делаю эту работу с Apps Script. Ни user1, ни user2 не являются владельцами. Чтобы выполнить какой-то код, я должен удалить всю защиту для всех пользователей. Я написал код ниже для этого, но он работает только для владельца, а не для других пользователей.

function onOpen (e){
var s1 = SpreadsheetApp.getActive();
var range1 = s1.getRange('A:A');
var range2 = s1.getRange('B:J');
var range3 = s1.getRange('K:Z');
var range4 = s1.getRange('AA:AC');
var range5 = s1.getRange('AD:AE');
var range6 = s1.getRange('A1:AE1');  
var protection1 = range1.protect().setDescription('1');
var protection2 = range2.protect().setDescription('2');
var protection3 = range3.protect().setDescription('3');
var protection4 = range4.protect().setDescription('4');
var protection5 = range5.protect().setDescription('5');
var protection6 = range6.protect().setDescription('6');   
protection1.removeEditors(protection1.getEditors());
protection2.removeEditors(protection2.getEditors());
protection3.removeEditors(protection3.getEditors());
protection4.removeEditors(protection4.getEditors());
protection5.removeEditors(protection5.getEditors());
protection6.removeEditors(protection6.getEditors());  
protection1.addEditor('rafi@gmail.com'); 
protection1.addEditor('naseri@gmail.com');   
protection2.addEditor('sabeti@gmail.com');
protection2.addEditor('chavoshi@gmail.com');
protection2.addEditor('naseri@gmail.com');
protection3.addEditor('naseri@gmail.com');
protection3.addEditor('rezvani@gmail.com');
protection3.addEditor('nurian@gmail.com');
protection3.addEditor('fazeli@gmail.com');
protection4.addEditor('naseri@gmail.com');
protection5.addEditor('naseri@gmail.com');
protection5.addEditor('nurian@gmail.com');
protection5.addEditor('fazeli@gmail.com');
protection5.addEditor('rezvani@gmail.com');  
protection6.addEditor('chavoshi@gmail.com');
protection6.addEditor('naseri@gmail.com');  
if (protection1.canDomainEdit()) {
protection1.setDomainEdit(false);
}
if (protection2.canDomainEdit()) {
protection2.setDomainEdit(false);
}
if (protection3.canDomainEdit()) {
protection3.setDomainEdit(false);
}
if (protection4.canDomainEdit()) {
protection4.setDomainEdit(false);
}
if (protection5.canDomainEdit()) {
protection5.setDomainEdit(false);
}
if (protection6.canDomainEdit()) {
protection6.setDomainEdit(false);
}
}  



}
function onEdit(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = s.getActiveRange(); 

if(s.getName() == "Order List" && r.getColumn() == 30 && r.getValue() == true) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Arrived Complete");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}

var s10 = SpreadsheetApp.getActive(); 
var protections = s10.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {  
protection.remove();
}  
} 

onOpen (e);  
}


function clearFormat() {
var s = SpreadsheetApp.getActiveSpreadsheet();
var ss = s.getActiveSheet();
var sheetname = ss.getName();
var s2c = SpreadsheetApp.getActiveSpreadsheet();
var ss2cc = s2c.getActiveSheet();
var sheetname = ss2cc.getName();
if (sheetname == "Arrived Complete") {
ss.clearConditionalFormatRules();
}
if (sheetname == "Arrived Canceled") {
ss2cc.clearConditionalFormatRules();
}
}

1 Ответ

1 голос
/ 20 января 2020

Боюсь, что нет прямой возможности сделать вашу цель: показывать определенные части листа только некоторым пользователям. Но есть надежда сделать sh нечто подобное, потому что есть два известных обходных пути для этого:

  1. Один из способов - publi sh веб-приложение , которое проверяет имя пользователя (как вы это делали в своем коде) и печатает только нужный столбец.
  2. Другой способ - поделиться различными листами с разными пользователями, используя только те данные, которые вы хотите отобразить. Каждый лист будет автоматически синхронизирован с основным листом , который объединяет их все; но только администратор получит к нему доступ.

Как видите, это два близких обходных пути. Я надеюсь, что они работают на вас. Не стесняйтесь ответить на любой вопрос или сомнение.

...