【问题标题】:Can not run standalone Google App Script from a Google Spreadsheet无法从 Google 电子表格运行独立的 Google App 脚本
【发布时间】: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);
}

【问题讨论】:

  • 什么不起作用?范围是否受到保护?响应是否无法返回?是否返回了响应,但不是您想要的?在独立脚本中,记录字符串化的resultvar 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


【解决方案1】:

一个问题是这一行:

var taskRange = SpreadsheetApp.getActiveSheet().getActiveRange()

应该是:

var taskRange = SpreadsheetApp.getActiveSheet().getActiveRange().getA1Notation();

目前,变量taskRange 是一个“类”,它不是一个字符串。你需要发送一个字符串。

【讨论】:

  • 感谢指正。实际上我已经尝试了一个特定的范围(例如'A5:E5'),但没有任何结果。你能告诉我如何发送一个字符串吗?
【解决方案2】:

终于成功了。我认为脚本运行不正常,因为我用多种代码修改了很多次。因此,我创建了一个新日志,并按照@SandyGood 的建议使用了“字符串化”日志。 非常感谢大家,特别是@SandyGood。

最终脚本

//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());
var resultStr = JSON.stringify(result);
Logger.log('resultStr: ' + resultStr);
}

//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().getA1Notation();
var response = UrlFetchApp.fetch(url+"?taskRange="+taskRange).getContentText();
Logger.log(response);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多