我与一张名为“times”的工作表共享了一个电子表格。 此表格对其他用户范围受保护,但他们必须查看并必须以多种方式对其进行排序。 我用menuEntries.push等创建了一些菜单...... 编写脚本以我需要的所有方式对此工作表进行排序, 但只有我设置为管理员的人才能使用我的菜单排序。 其他人不能这样做,因为他们无法在受保护的范围内执行脚本。 我想只在脚本执行期间给予每个人许可, 代码应该听起来像上面这样(不起作用)
function Editors() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = ss.getSheetByName("times");
var user = SpreadsheetApp.getActive().getEditors();
var permission = targetSheet.getSheetProtection();
permission.addUser(user);
SpreadsheetApp.flush();
var tableRange = "orario!b7:ap209";
var tableRange = "times";
var range = ss.getRange(tableRange);
range.sort( { column: 2, ascending: true } );
permission.removeUser(user)
targetSheet.setSheetProtection(permission)
}
...如果有人可以帮助我......提前感谢....
答案 0 :(得分:0)
您应该发布项目以执行脚本。保存一个版本,然后发布。
在脚本编辑器中,选择FILE,MANAGE VERSIONS。保存新版本。然后选择,发布,部署为WEB APP。进行设置。这是我唯一能想到的。
不推荐使用getSheetProtection()
方法。不要使用它。
另外,
sheet.setSheetProtection(permission);
也已弃用。不要使用它。
var user = ss.getEditors();
获取用户数组。那不是你想要的。你想要当前的用户。为此,您必须使用Session
类。
var user = Session.getActiveUser().getEmail();
您需要使用addEditor()
而不是addUser()
permission.addEditor(user);
function Editors() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = ss.getSheetByName("Sheet1");
var user = Session.getActiveUser().getEmail();
//Cancel all protections
var protections = targetSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET);
for (var i = 0; i < protections.length; i++){
var thisProtection = protections[i];
if (thisProtection && thisProtection.canEdit()) {
thisProtection.remove();
};
};
var permission = targetSheet.protect();
permission.addEditor(user);
SpreadsheetApp.flush();
var tableRange = "orario!b7:ap209";
var tableRange = "times";
var range = ss.getRange(tableRange);
range.sort( { column: 2, ascending: true } );
permission.removeEditor(user);
}
答案 1 :(得分:0)
我创建了一个简单的工作表来测试脚本。 这里是: https://docs.google.com/spreadsheets/d/1DhDo_1A20tWdSaYMknAmuxnVJFW14QY6xBXr9BGyS-g/edit#gid=0
如果我使用“menuTeacher”2.和3.作为管理员对工作表进行排序 它工作正常。 但作为用户,它不起作用
(仅使用菜单“1.sortSURNAME”来测试权限) 我保护columnA:B和columnE:M
我把Sandy Good先生当作我这样的管理员(用他的邮件xxxtrashmatXXX@gmail.com) 进行测试......
答案 2 :(得分:0)
好吧,我发布了完整的代码并总结了问题:
function onOpen() {
var ss = SpreadsheetApp.getActive();
// also tried with var ss = SpreadsheetApp.getActiveSpreadsheet();
menuEntries.push({name: "1. sortSURNAME", functionName: "Cognome"});
ss.addMenu("menuTeacher", menuEntries);
}
function Cognome(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = ss.getSheetByName("orario");
var user = Session.getActiveUser().getEmail();
var protections = targetSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET);
var permission = targetSheet.protect();
permission.addEditor(user);
SpreadsheetApp.flush();
for (var i = 0; i < protections.length; i++)
{
var thisProtection = protections[i];
if (thisProtection && thisProtection.canEdit()) {
thisProtection.remove();
}
}
var tableRange = "orario!b7:ap209";
var range = ss.getRange(tableRange);
range.sort( { column: 2, ascending: true } );
permission.removeEditor(user);
}
执行此代码红色警报提示: &#34;为了保护这份表,你必须删除受保护的范围&#34;并且脚本中标记的行是这一行:
var ss = SpreadsheetApp.getActiveSpreadsheet();
因此,如果您是用户而不是管理员,则似乎无法使用脚本删除受保护的范围。 Sandy Good先生建议创建一个Web应用程序,即使您是USER,也可以将脚本作为ADMIN执行 我生成它但我不知道如何使用它.... 这是我生成的Web应用程序的URL
https://docs.google.com/spreadsheets/d/1DhDo_1A20tWdSaYMknAmuxnVJFW14QY6xBXr9BGyS-g/edit#gid=0