Javascript 为要运行的脚本添加编辑器,然后删除它们-临时编辑器权限

Javascript 为要运行的脚本添加编辑器,然后删除它们-临时编辑器权限,javascript,google-apps-script,permissions,google-sheets,Javascript,Google Apps Script,Permissions,Google Sheets,我与一张名为“时代”的表格共享了一份电子表格。 此工作表对其他用户是受范围保护的,但他们必须以多种方式查看和排序。 我用menuEntries.push等创建了一些菜单。。。 以我需要的方式编写了该表的排序脚本, 但只有我设置为管理员的人才能使用我的菜单进行排序。 其他人无法执行此操作,因为他们无法在受保护的范围内执行脚本。 我只想在脚本执行期间授予每个人权限, 代码听起来应该与上面的类似(不起作用) …如果有人能帮我。。。。提前感谢……您应该发布项目以在需要时执行脚本。保存一个版本,然后发布

我与一张名为“时代”的表格共享了一份电子表格。 此工作表对其他用户是受范围保护的,但他们必须以多种方式查看和排序。 我用menuEntries.push等创建了一些菜单。。。 以我需要的方式编写了该表的排序脚本, 但只有我设置为管理员的人才能使用我的菜单进行排序。 其他人无法执行此操作,因为他们无法在受保护的范围内执行脚本。 我只想在脚本执行期间授予每个人权限, 代码听起来应该与上面的类似(不起作用)


…如果有人能帮我。。。。提前感谢……

您应该发布项目以在需要时执行脚本。保存一个版本,然后发布

在脚本编辑器中,选择“文件”、“管理版本”。保存新版本。然后选择、发布、部署为WEB应用程序。进行设置。这是我唯一能想到的

getSheetProtection()
方法已被弃用。不要用它。 而且

也不推荐使用。不要用那个

及 获取一个用户数组。那不是你想要的。您需要当前用户。为此,必须使用
会话

var user = Session.getActiveUser().getEmail();
您需要使用
addEditor()
而不是
addUser()

代码
函数编辑器(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var targetSheet=ss.getSheetByName(“Sheet1”);
var user=Session.getActiveUser().getEmail();
//取消所有保护
var保护=targetSheet.getProtections(电子表格app.ProtectionType.SHEET);
对于(变量i=0;i<0.length;i++){
无功保护=保护[i];
if(thisProtection&&thisProtection.canEdit()){
此保护。删除();
};
};
var permission=targetSheet.protect();
权限。添加器(用户);
SpreadsheetApp.flush();
var tableRange=“orario!b7:ap209”;
var tableRange=“次”;
变量范围=ss.getRange(tableRange);
排序({列:2,升序:true});
权限。removeEditor(用户);
}

我创建了一个简单的工作表来测试脚本。 这是:

如果我使用“menuTeacher”2。三,。作为管理员对工作表进行排序 它工作正常。 但作为用户,它不起作用

(仅使用菜单“1.sortSURNAME”测试权限) 我保护columnA:B和columnE:M

我把桑迪先生当作和我一样好的管理员(带着他的邮件)xxxtrashmatXXX@gmail.com )
为了进行测试……

好吧,我发布了完整的代码,并对问题进行了总结:

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);
}
因此,如果您是用户而不是管理员,似乎不可能使用脚本删除受保护的范围。 Sandy Good先生建议创建一个web应用程序,以管理员身份执行脚本,即使您是用户 我生成它,但我不知道如何使用它。。。。 下面是我生成的web应用程序的URL


您是否查看了执行记录以查看代码是成功还是失败?您可以尝试一个可安装的触发器-请参阅Hi。非常感谢你的帮助。我剪切了不推荐的方法并使用了您的代码,但是如果我以文件“管理员”的身份运行它,则在“Per Protegger questo foglio,devi rimuovere eventuali intervalli protetti al-suo interno”id est的工作表上会出现红色错误。。。“为了保护这张纸,你必须取消里面的范围保护”。如果我在脚本中使用函数,那么错误就在“var permission=targetSheet.protect();”行上。我添加了一些代码来取消所有保护。看看代码会发生什么。我添加了cicle,现在工作表的红色警报(作为管理员)报告类似于:“要保护此工作表,您必须删除其中的受保护范围”如果我与脚本广告用户共进午餐,它仍然会说:“您正在尝试修改保护单元格或范围”。。请联系管理员我尝试几种代码变体(也是这一次,我创建了一个工作表,并将你作为管理员,希望你能帮助我……。收到了你的邀请,并查看了你的工作表。尝试发布项目,以“我”的身份执行应用程序。(就是你)。
var user = ss.getEditors();
var user = Session.getActiveUser().getEmail();
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);
}
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);
}
var ss = SpreadsheetApp.getActiveSpreadsheet();