SourceSheet(示例数据)可用:SourceSheet
我需要保护所有单元格,但某些范围可以由每个人编辑,某些范围只能由电子邮件指定的用户编辑。
var rangesToEdit = [
"D5:G11",
"L5:O11",
"D16:G22",
"L16:O22",
"D27:G33"
];
以上范围任何人都可以编辑。
var ranges = ["H5:H11", "P5:P11", "H16:H22", "P16:P22", "H27:H33"];
以上范围只能由某些用户通过电子邮件编辑。
现在我保护了整个工作表,然后授予任何人编辑rangesToEdit范围的权限。
但是当我指定只能由某些用户编辑的范围时,它不起作用。
我有代码:
function editSheet() {
try {
var sheetUrl = "https://docs.google.com/spreadsheets/d/1jxDEj894Ir_BQx1uEHo1D3SBmC6_Rd0zo2locLN9KAE/edit?usp=drive_link";
var sheetName = "February";
var spreadsheet = SpreadsheetApp.openByUrl(sheetUrl);
var sheet = spreadsheet.getSheetByName(sheetName);
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
protections[i].remove();
}
var rangesToEdit = [
"D5:G11",
"L5:O11",
"D16:G22",
"L16:O22",
"D27:G33"
];
var protection = sheet.protect().setDescription('Protected Range');
var unprotectedRanges = protection.getUnprotectedRanges();
for (var i = 0; i < rangesToEdit.length; i++) {
unprotectedRanges.push(sheet.getRange(rangesToEdit[i]));
}
protection.setUnprotectedRanges(unprotectedRanges);
var emailList = ["[email protected]"]; // Замените адресами электронной почты нужные адреса
var ranges = ["H5:H11", "P5:P11", "H16:H22", "P16:P22", "H27:H33"]; // Укажите нужные диапазоны
for (var i = 0; i < ranges.length; i++) {
var range = sheet.getRange(ranges[i]);
var protection = range.protect().setDescription('Редактирование доступно только определенным пользователям.');
protection.addEditor(emailList[0]);
}
} catch (error) {Logger.log(error.toString());}
}
因此所有单元格都受到保护,rangesToEdit可以由任何人编辑,但ranges由于某种原因无法由指定的电子邮件编辑。如何通过电子邮件设置可以编辑范围的用户。其他保护规则也必须保留。
链接问题: Google Sheet 不同的单元格范围保护和访问级别(所有、特定、基于电子邮件)
基于@Tanaike的回答:
function myFunction() {
// Please set variables for your situation.
var sheetUrl = 'https://docs.google.com/spreadsheets/d/1veORLw3OrcIAtv83n4Vn1E4bhj4gYqV9N2ebtRjztrA/edit?usp=drive_link'; // Please set your Spreadsheet ID.
var sheetName = 'February';
var editableRanges = ["D5:G11","L5:O11","D16:G22","L16:O22","D27:G33"];
var rangesToProtect = ["H5:H11", "P5:P11", "H16:H22", "P16:P22", "H27:H33"];
var allowedUsers = ['[email protected]']; // Please set email address you want to permit to edit the cells "rangesToProtect".
// Remove all protections.
var sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);
[...sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET), ...sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE)].forEach(p => p.remove());
// Protect a sheet and set unprotect ranges.
var editableRangesObj = sheet.getRangeList(editableRanges).getRanges();
var rangesToProtectObj = sheet.getRangeList(rangesToProtect).getRanges();
var p1 = sheet.protect().setDescription('Защита всего листа');
p1.removeEditors(p1.getEditors());
p1.setUnprotectedRanges([...editableRangesObj, ...rangesToProtectObj]).setDescription('Защита диапазона ' + editableRanges.join(","));
// Protect ranges with emails.
rangesToProtectObj.forEach(r => {
var p2 = r.protect().setDescription('Защита диапазона ' + r.getA1Notation());
p2.removeEditors(p2.getEditors());
p2.addEditors(allowedUsers);
});
}
结果:
["D5:G11","L5:O11","D16:G22","L16:O22","D27:G33"]
任何人都可以编辑。
["H5:H11", "P5:P11", "H16:H22", "P16:P22", "H27:H33"]
只能由指定用户编辑
所有其他单元均受到保护。
感谢@Tanaike。