允许脚本 运行 作为管理员更新电子表格

Allow script to run as admin to update spreadsheet

我有一个与其他一些用户共享的电子表格。许多单元格都受到范围保护。但是,通过一个菜单,我允许用户 运行 一个脚本(它访问一个外部库,因此是不可见的,不受用户控制),它将修改一些受保护的范围。但是,脚本抛出没有执行此操作的权限。

是否有任何选项可以使此库 运行 具有库 'admin' 权限,这样它就不会因保护而抛出?

谢谢!

根据 documentation :“库没有自己的 feature/resource 实例,而是使用调用它的脚本创建的实例。”

所以图书馆不是要走的路。

您可以使用独立脚本实现该行为,该脚本将 运行 作为服务(部署的 webapp 中的 doGet() 函数)部署为 "running as you" 并调用使用参数告诉它在目标电子表格范围内做什么。


编辑:在最基本的实现中,您可以使用像这样的简单脚本作为服务器应用程序:

function doGet(e) {
  if(e.parameter.mode==null){return ContentService.createTextOutput("error, wrong request").setMimeType(ContentService.MimeType.TEXT)};
  var coord = e.parameter.coord;
  var mode = e.parameter.mode;
  var value = e.parameter.value;
  var ss = SpreadsheetApp.openById('11myX1YX_________________FS6BesaBEnQ');
  var sh = ss.getSheetByName(e.parameter.sN);
  if(mode=='r'){
    var sheetValue =  JSON.stringify(sh.getRange(coord).getValue());
    var valToReturn = ContentService.createTextOutput(sheetValue).setMimeType(ContentService.MimeType.JSON);
    return valToReturn;
    }
  if(mode=='w'){
    sh.getRange(coord).setValue(value);
    return ContentService.createTextOutput(value).setMimeType(ContentService.MimeType.JSON);
    }
  return ContentService.createTextOutput('error').setMimeType(ContentService.MimeType.TEXT);
}

应使用以下参数部署上述脚本:

然后您可以将它与如下所示的简单 urlFetch 一起使用:

    var url = "https://script.google.com/macros/s/AKfycbxs9M0ib-VRmmcVJ0UUJXmHITOrWcoG8bYrK4EK7Tvl0krzsYc/exec"

function testServerLink(){
  var coord = 'A3';//coordinates in A1 notation
  var sheetName = 'Sheet1';
  var data = 'test value';
  var mode = 'w';// w for "write" and r for "read"
  var write = sheetService(mode,coord,sheetName,data);
  Logger.log(write);//shows the result in logger
  var read = sheetService('r','A1',sheetName,data);
  Logger.log(read);//shows the value that was in A1 cell
}


    function sheetService(mode,coord,sheetName,data){
      Logger.log(url+"?mode="+mode+"&coord="+coord+"&sN="+sheetName+"&value="+data);// shows the actual url with parameters, can be tested in a browser
      var result = UrlFetchApp.fetch(url+"?mode="+mode+"&coord="+coord+"&sN="+sheetName+"&value="+data);
      return result
    }