保护片。 Google Sheet 中的选择性编辑权限

问题描述 投票:0回答:1

我有一张这样的桌子:

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-sheets google-apps-script google-apps spreadsheet-protection
1个回答
0
投票

链接问题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

© www.soinside.com 2019 - 2024. All rights reserved.