【发布时间】:2017-10-05 15:26:49
【问题描述】:
我有一个与同事共享的谷歌电子表格来跟踪任务状态。我想通过菜单设置一个功能来阻止完成任务的一些范围。保护权限设置为只允许我(所有者)对其进行编辑。
我使用UrlFetch 为这个共享电子表格构建了一个独立的脚本run as me。我已经尝试了多种代码,但它没有工作。以下是我尝试过的 3 个版本。
当然,我在独立脚本中设置了“谁有权访问应用程序:任何人,甚至是匿名的”。 Photo 1: Standalone script setting
非常感谢!
第一版:不使用内容服务
//In standalone script
function doGet(e){
var taskRange = e.parameter.taskRange;
var ss = SpreadsheetApp.openById('SHARING_SPREADSHEET_ID');
var sh = ss.getSheetByName('Sheet1');
var protection = sh.getRange(taskRange).protect().setDescription('Completed Task')
var result = protection.removeEditors(protection.getEditors())
return result
}
//In sharing spreadsheet script
var url = "https://script.google.com/macros/s/STANDALONE_SCRIPT_ID/exec"
function onOpen(){
SpreadsheetApp.getUi().createMenu('TASK')
.addItem('Protect Task', 'protectTask')
.addToUi();
}
function protectTask(){
var taskRange = SpreadsheetApp.getActiveSheet().getActiveRange()
var response = UrlFetchApp.fetch(url+"?taskRange="+taskRange);
Logger.log(response);
}
第二版:使用内容服务
//In standalone script
function doGet(e){
var taskRange = e.parameter.taskRange;
var ss = SpreadsheetApp.openById('SHARING_SPREADSHEET_ID');
var sh = ss.getSheetByName('Sheet1');
var protection = sh.getRange(taskRange).protect().setDescription('Completed Task')
var result = protection.removeEditors(protection.getEditors())
return ContentService.createTextOutput(result)
}
//In sharing spreadsheet script
var url = "https://script.google.com/macros/s/STANDALONE_SCRIPT_ID/exec"
function onOpen(){
SpreadsheetApp.getUi().createMenu('TASK')
.addItem('Protect Task', 'protectTask')
.addToUi();
}
function protectTask(){
var taskRange = SpreadsheetApp.getActiveSheet().getActiveRange()
var response = UrlFetchApp.fetch(url+"?taskRange="+taskRange).getContentText();
Logger.log(response);
}
第 3 版:将内容服务与 JSON 结合使用
//In standalone script
function doGet(e){
var taskRange = e.parameter.taskRange;
var ss = SpreadsheetApp.openById('SHARING_SPREADSHEET_ID');
var sh = ss.getSheetByName('Sheet1');
var protection = sh.getRange(taskRange).protect().setDescription('Completed Task')
var result = protection.removeEditors(protection.getEditors())
return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON)
}
//In sharing spreadsheet script
var url = "https://script.google.com/macros/s/STANDALONE_SCRIPT_ID/exec"
function onOpen(){
SpreadsheetApp.getUi().createMenu('TASK')
.addItem('Protect Task', 'protectTask')
.addToUi();
}
function protectTask(){
var taskRange = SpreadsheetApp.getActiveSheet().getActiveRange()
var response = UrlFetchApp.fetch(url+"?taskRange="+taskRange).getContentText();
var result = JSON.Parse(response)
Logger.log(result);
}
【问题讨论】:
-
什么不起作用?范围是否受到保护?响应是否无法返回?是否返回了响应,但不是您想要的?在独立脚本中,记录字符串化的
result。var resultStr = JSON.stringify(result); Logger.log('resultStr: ' + resultStr); -
嗨桑迪好。感谢您的评论。该范围没有得到保护,也没有返回任何内容。版本 3 出现错误“SyntaxError: Unexpected token: e”。我试过你的建议,但还是不行。
-
这可能与您实际调用脚本的方式有关。
doGet(e)表示它是由某种触发器调用的,但是由于它是独立的,因此您不能使用与电子表格本身关联的任何触发器。 -
@Vytautas 你是对的。 “standalone script 也可以部署为 Web 应用程序或设置为从可安装的触发器自动运行”。不幸的是,我找不到任何可以从 Google 电子表格调用脚本的触发器。您对此有什么建议吗?
-
每次更改代码,无论多么小的更改,都必须重新发布Web App,否则运行的
doGet(e)函数将是过时的代码。 “exec”版本与“dev”版本不同。 “开发”版本始终运行最新的更改。 “exec”版本只运行最后发布的代码。
标签: google-apps-script google-sheets