如何仅为当前电子表格用户授予访问权限?我的想法是使用用户电子邮件命名工作表,并且只授予对与用户电子邮件同名的工作表的访问权限。
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();
}
};
}
但问题是电子邮件是在一个数组中。如何使用数组来匹配当前用户?还有另一种解决方法吗?
答案 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();
}
};
}