【问题标题】:Add an Editor for script to run, then Remove them - temporary Editor permission添加要运行的脚本的编辑器,然后删除它们 - 临时编辑权限
【发布时间】:2015-04-27 06:09:43
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

好吧,我贴出完整代码,对问题做个总结:

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

因此,如果您是用户而不是管理员,则似乎不可能使用脚本删除受保护的范围。 Sandy Good 先生建议创建一个 Web 应用程序以 ADMIN 身份执行脚本,即使您是 USER 我生成了它,但我不知道如何使用它.... 这是我生成的网络应用的 URL

https://docs.google.com/spreadsheets/d/1DhDo_1A20tWdSaYMknAmuxnVJFW14QY6xBXr9BGyS-g/edit#gid=0

【讨论】:

    【解决方案2】:

    您应该发布项目以像您一样执行脚本。保存版本,然后发布。

    在脚本编辑器中,选择文件、管理版本。保存一个新版本。然后选择,发布,部署为 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);
    }
    

    【讨论】:

    • 嗨。非常感谢您的帮助。我删除了不推荐使用的方法并使用了您的代码,但是如果我以文件的“管理员”身份运行它,则会在“Per proteggere questo foglio, devi rimuovere eventuali intervalli protetti al suo interno” id est ... “要保护这张表,你必须取消里面的范围保护”。如果我午餐脚本中的函数,错误就在“var permission = targetSheet.protect();”的行上
    • 我添加了一些代码来取消所有保护。看看这段代码会发生什么。
    • 我添加了 cicle FOR,现在工作表的红色警报(作为管理员)报告类似于:“要保护此工作表,您必须删除其中的受保护范围”如果我午餐脚本广告 USER 它仍然说:“您正在尝试修改保护单元格或范围”..联系管理员
    • 我尝试了几种代码变体(也是这个stackoverflow.com/questions/28778327/…我创建了一个工作表并把你作为管理员希望你能帮助我.....
    • 收到您的邀请,并查看了您的工作表。尝试发布项目以将应用程序作为“ME”执行。 (你是谁)。
    【解决方案3】:

    我创建了一个简单的工作表来测试脚本。 这里是: 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) 进行测试....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多