允许脚本以管理员身份运行以更新电子表格

时间:2015-01-12 06:46:29

标签: google-apps-script

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

是否可以选择让这个库与库' admin'权利,所以它不会因保护而抛出?

THX!

1 个答案:

答案 0 :(得分:2)

根据documentation:“该库没有自己的功能/资源实例,而是使用由调用它的脚本创建的实例。”

所以图书馆不是可行的方式。

您可以使用独立脚本来实现该行为,该脚本将作为服务运行(部署的webapp中的doGet()函数),您将部署为“正在运行”并且您将使用参数调用以告诉它在目标电子表格范围内进行。


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

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

应使用以下参数部署上述脚本: enter image description here

然后你可以使用如下的简单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
    }
相关问题