Google电子表格脚本 - 仅授予对一个工作表的访问权限

时间:2015-01-30 07:16:45

标签: javascript arrays google-apps-script permissions google-sheets

如何仅为当前电子表格用户授予访问权限?我的想法是使用用户电子邮件命名工作表,并且只授予对与用户电子邮件同名的工作表的访问权限。

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();
    }
  };
}

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

1 个答案:

答案 0 :(得分:1)

这行代码:

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

正在检索包含所有工作表的数组。 (并且每次运行该代码行时它都会检索该数据。可能最好只在代码中的其他位置读取该数据)。您还可以使用[i]的索引,该索引仅从阵列中获取其中一个工作表。但这是一个对象。它不会返回名称。你想要这个名字。您需要使用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();
    }
  };
}