【问题标题】:How to access data from an external spreadsheet with Google Apps Script如何使用 Google Apps 脚本访问外部电子表格中的数据
【发布时间】:2020-12-15 17:13:13
【问题描述】:

我有一个电子表格,其中包含一些我想在其他电子表格脚本中使用的数据表。如何通过 ID 调用此电子表格并访问数据?\

documentation,我知道自定义函数不允许访问其他电子表格,解决方案是将此函数放在菜单中并运行它,因为它会要求用户授权。但这不是一个选项,因为我使用的是内置方法 onEdit() 的数据。\

另外,我尝试通过onOpen() 访问电子表格,因为它不是自定义函数,但仍然没有成功。还有其他解决方案吗?

我的代码:

function onOpen(){
  ss = SpreadsheetApp.getActiveSpreadsheet();
  src = SpreadsheetApp.openById("spreadsheetID");

错误信息:

Exception: You do not have permission to call SpreadsheetApp.openById. Required permissions: https://www.googleapis.com/auth/spreadsheets

还有appscript.json

{
  "timeZone": "Europe/Paris",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets"
    ]
}

最后,我还尝试使用以下代码创建installable trigger

function createSpreadsheetOpenTrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onOpen()
      .create();
}

但是在打开工作表时似乎没有调用触发器。

【问题讨论】:

  • 您能否将您的问题限制为 1 个问题:最好只有​​从“最后,我也尝试过 cr...”开始的最后一部分。是什么让您认为触发器不起作用?
  • @TheMaster 毕竟这是一个问题。我只是提出了我的尝试。而且我不知道为什么它不起作用。我尝试使用 myFunction 从仪表板中的触发器页面手动创建触发器,它似乎工作
  • 那么问题解决了吗?

标签: javascript google-apps-script google-apps


【解决方案1】:

正如您已经意识到的那样,自定义函数和简单触发器无法执行需要授权的请求

  • SpreadsheetApp.openById("spreadsheetID"); 是这些请求之一

  • 您在可安装触发器的正确​​轨道上 - 它们可以触发需要授权的请求的执行

  • 我认为您的问题是可安装触发器的正确​​实现

  • function createSpreadsheetOpenTrigger 创建一个可安装的onOpen 触发器,在工作表打开时调用函数myFunction

  • 这意味着你需要先创建函数myFunction
  • 另外,您需要手动运行一次function createSpreadsheetOpenTrigger() - 以安装触发器

示例完整代码:

function createSpreadsheetOpenTrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onOpen()
      .create();
}


function myFunction(){
  ss = SpreadsheetApp.getActiveSpreadsheet();
  src = SpreadsheetApp.openById("spreadsheetID");
  Logger.log(src.getActiveSheet().getName());
}

注意:

除了实现函数createSpreadsheetOpenTrigger(),您可以通过继续Edit->My project's triggers 手动安装触发器并将所需类型的触发器绑定到所需函数,另见Managing triggers manually

【讨论】:

  • 最后一点是我所缺少的。我没有意识到我必须首先手动运行该函数才能实际实现触发器。此外,最好直接在项目的触发器中实现它,这样我就不必手动运行该函数!谢谢你的回答!
【解决方案2】:

首先,在 src = SpreadsheetApp.openById("spreadsheetID");您是否将 id 替换为实际的电子表格 ID? 这是网址末尾的数字。我假设你做到了,但它并没有表明你在你的例子中做到了。

其次,只是为了测试,尝试在常规函数(不是触发器)中执行此操作以使事情正常工作。你这样做了吗?然后,您可以专注于电子表格访问,而不必担心触发器是否会导致问题。

【讨论】:

  • 是的,我确实更换了 ID,只是在帖子中被压制,忘了提及。好吧,我确实尝试过没有触发器的函数,但是自定义函数无法访问openById 方法
  • 当他们说“自定义函数”时,我认为他们的意思是工作表单元格中的公式中调用的东西,而不是触发器或您自己编写的东西。我不认为'自定义功能'是你的意思。我一直使用触发器来打开/引用其他电子表格。
  • 您希望电子表格实际打开吗?如果是这样,那就不同了。为此,您需要打开一个浏览器窗口。那是创建弹出窗口的javascript和html。 'openbyid' 允许您访问电子表格,但它不会使用该表格打开新的浏览器窗口。
  • 不,我知道它不会使用 UI 打开电子表格。我只需要阅读它并获取要在运行脚本的当前电子表格中使用的数据。但是自定义函数无法访问openbyId。请参阅我链接的参考文献
  • 你为什么不直接将范围导入隐藏表?你知道怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多