【问题标题】:How can I invoke my standalone script in my spreadsheet?如何在我的电子表格中调用我的独立脚本?
【发布时间】:2013-12-17 20:20:23
【问题描述】:

我从 Google Drive 创建了一个独立的 Apps 脚本,但是当我尝试从 Google 电子表格访问它时,我看不到访问脚本的方法(即使我创建脚本时,我将它创建为电子表格脚本)。

在电子表格中,“工具->脚本管理器...”菜单项不显示我的脚本,“工具->脚本编辑器...”也不显示。后者有一个“最近的项目”部分,但它没有列出我新创建的脚本,也没有列出它的相关项目。

如果我从电子表格中创建一个新脚本(即 .Tools->Script editor...)并从独立脚本中剪切和粘贴代码,它可以正常工作。但是,这只能在单个电子表格中使用——要从另一个电子表格中使用它,我必须再次剪切和粘贴/通过身份验证。

有没有办法在不将脚本发布到画廊的情况下做到这一点,我假设它会公开(我没有将它公开的问题,但似乎必须有更好的方法)?脚本是here——它是世界可读的链接。它会在 Google 电子表格中添加一个菜单,让您可以在 BigQuery 中运行查询并将结果转储到您的电子表格中。

【问题讨论】:

    标签: google-apps-script google-spreadsheet-api


    【解决方案1】:

    您描述的行为正是它的预期工作方式......您编写的脚本只有在绑定到电子表格时才能工作。

    您在独立脚本中编写它的事实使其确实是一个独立的应用程序,但它只能从脚本编辑器中执行,在这种情况下,像您编写的那样 onOpen 函数没有意义(它在打开文档/电子表格时运行,而不是脚本)。

    目前,脚本只能通过复制/粘贴代码绑定到电子表格,至少是您想要使用的脚本(带有菜单和直接函数调用和 activeSheet 调用),也许有一天 Google将扩展库的概念,使您的脚本功能可以直接从不同的文档中使用(另请阅读doc about libraries)。

    实际上有两种类型的独立应用程序脚本,一种是您尝试过的仅在编辑器中运行的一种,另一种是自行部署并在浏览器窗口中运行的 web 应用程序。后者始终围绕代表应用程序入口点的doGet 函数构建。您应该阅读documentation on the subject 以获取所有详细信息。

    总结一下:如果您想使用getActiveSpreadsheet() 和类似方法访问您的电子表格,那么您必须在绑定到电子表格的脚本编辑器中编写(或粘贴)脚本。

    如果您想拥有一个独立的脚本,您还可以与电子表格(以及其他文档)进行交互,但您必须通过它们的 ID 访问它们,并且电子表格只能从另一个浏览器窗口中查看,它们之间没有链接,并且不会有“活动电子表格”或“活动工作表”......

    Web 应用程序当然也可以通过用户界面的优势来做到这一点,您可以根据自己的需求进行调整,但这离您的问题范围有点太远了。

    希望我已经(有点)更清楚了,至少我试图让它变得简单;-)

    【讨论】:

    • 感谢您提供的信息丰富的回答。那么,从“驱动器->创建->脚本”中,您可以选择为电子表格创建脚本,这似乎很奇怪,但是没有办法在电子表格中使用该脚本。
    • 我猜你的担心来自脚本编辑器中的模板,这些模板是通用的,这意味着它们应该在任何情况下都可以使用(恐怕这实际上是不可能的)老实说我禁用了该功能很久以前,所以我什至不确定它们的外观。(我应该不时查看我的个人信息 :-) 顺便说一句,谢谢。
    【解决方案2】:

    我按照此处的说明与 Jordan 一起解决了这个问题:

    https://developers.google.com/apps-script/guide_libraries

    • 首先,他必须与我分享他的独立脚本,所以我拥有它的读取权限(可能将脚本设置为公开读取也可以)。
    • 然后他告诉我他的项目密钥。
    • 我将他的项目密钥插入到“管理库”菜单的“查找库”中。
    • 为此,Jordan 必须导出他的库的“一个版本” - 这样第三方就可以依靠稳定的代码并按照自己的节奏进行升级。
    • 由于 Jordan 的脚本在 onOpen() 上自动运行,我的代码必须定义一个函数 onOpen(),该函数调用他的脚本 onOpen()。为此,库管理器为我提供了导入库的标识符。

    导入库后的示例代码,并且库管理器会为您提供库的标识符:

       function onOpen() {
         GivenLibraryIdentifier.onOpen();
       }
    

    【讨论】:

    • 谢谢,Fh。这更接近我想要的,虽然还有很多不直观的步骤,但至少它让我可以使用我曾经编写过的代码,而无需到处剪切和粘贴。
    • 可能更接近您的预期,但它仍然需要电子表格有界脚本中的代码。库(我建议阅读有关它的文档)在开发复杂功能或处理代码版本控制时很有用,但这并不意味着您的独立脚本可以“按原样”使用,您仍然需要一个脚本来实际“调用”库函数。此答案中显示的示例代码清楚地表明了我的意思;-)
    【解决方案3】:

    您还可以使用可安装的触发器。如果您将独立脚本中的可安装触发器(例如 onOpen)安装到文档中,它会获得与简单触发器类似的权限。

    更好的是,当可安装触发器从您的独立脚本调用其函数时,它会在您的独立脚本中执行!因此它可以在您的独立脚本中调用任何其他函数。它的 Logger.log() 条目甚至可以从您的独立脚本中查看,即使它是从您的工作表文档中执行的。

    因此,基本上,如果您的脚本安装了与其功能之一相关的 onOpen() 触发器,那么就好像您的表格文档已经 required() 整个独立脚本文件一样好。

    (假设脚本的所有者对文件有编辑权限。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2013-01-25
      相关资源
      最近更新 更多