Google 传播sheets 脚本 - 仅授予一个 sheet 访问权限

Google spreadsheets script - grant access to only one sheet

如何仅将访问权限授予当前 spreadsheet 用户的特定 sheet?我的想法是让 sheet 以用户电子邮件命名,并且只授予对与用户电子邮件同名的 sheet 的访问权限。

function protectSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var email = Session.getActiveUser().getEmail();
  var num_sheets = ss.getNumSheets();

  for (var i = 0; i < num_sheets; i++){
    //setting permission to each sheet
    SpreadsheetApp.setActiveSheet(ss.getSheets()[i]);
    var sheet = SpreadsheetApp.getActiveSheet();
    var permissions = sheet.getSheetProtection();
    permissions.setProtected(true);
    sheet.setSheetProtection(permissions);

    // hiding all sheets wich not allowed
    if (ss.getSheets()[i] != email) {
     sheet.hideSheet();
    }
  };
}

但问题是电子邮件在数组中。如何使用数组来匹配当前用户?还有其他方法可以解决这个问题吗?

这行代码:

if (ss.getSheets()[i] != email) {

正在检索包含所有工作表的数组。 (并且每次该行代码为 运行 时它都会检索该数据。最好只在代码的其他地方读取一次该数据)。您还使用了 [i] 的索引,它只是从数组中获取一张工作表。但那是一个对象。它没有 return 这个名字。你想要这个名字。您需要使用 getSheetName() 方法。

if (ss.getSheets()[i].getSheetName() != email) {

我重写了您的代码,使代码中的工作表数组位于 FOR 循环之外。

function protectSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var email = Session.getActiveUser().getEmail();
  var num_sheets = ss.getNumSheets();

  var arryAllSheetNames = ss.getSheets();
  var thisSheetName = "";

  for (var i = 0; i < num_sheets; i++){
    //set permissions to each sheet
    SpreadsheetApp.setActiveSheet(ss.getSheets()[i]);
    var sheet = SpreadsheetApp.getActiveSheet();
    var permissions = sheet.getSheetProtection();
    permissions.setProtected(true);
    sheet.setSheetProtection(permissions);

    thisSheetName = arryAllSheetNames[i].getSheetName();

    // hide all sheets which are not allowed
    if (thisSheetName != email) {
      sheet.hideSheet();
    }
  };
}