允许脚本 运行 作为管理员更新电子表格
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
}
我有一个与其他一些用户共享的电子表格。许多单元格都受到范围保护。但是,通过一个菜单,我允许用户 运行 一个脚本(它访问一个外部库,因此是不可见的,不受用户控制),它将修改一些受保护的范围。但是,脚本抛出没有执行此操作的权限。
是否有任何选项可以使此库 运行 具有库 '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
}