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

时间:2015-02-25 09:48:47

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

我与一张名为“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)
}

...如果有人可以帮助我......提前感谢....

3 个答案:

答案 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