【问题标题】:Is there a way to execute google apps script from PostgreSQL or from Bash?有没有办法从 PostgreSQL 或 Bash 执行谷歌应用程序脚本?
【发布时间】:2019-07-12 10:45:36
【问题描述】:

我有数百个谷歌电子表格,其中都有相同的脚本。我想通过 PostgreSQL 或 Bash 的 ID 执行特定的谷歌电子表格。有没有简单的方法来执行脚本?我宁愿不用学python。

例如,我有电子表格 ID 1HGo8V-P5S-z4oCUiAKULrkZRFlzRHEalJqUFLiP,我想通过 Bash 或 Postgresql 执行函数 Refresh()

API 是唯一的途径吗? https://developers.google.com/apps-script/api/how-tos/execute

到目前为止,我的考虑是创建一个 python 可执行文件并从 postgresql 函数执行它。 https://developers.google.com/apps-script/api/quickstart/python

编辑:看起来如果我想执行任何应用脚本,每个电子表格都需要一个谷歌项目(手动创建)。必须有一种更简单的方法来做到这一点,为每个电子表格手动创建一个项目是没有意义的。

参考:https://developers.google.com/apps-script/api/how-tos/execute

被调用的脚本和调用应用程序必须共享一个云 平台项目。

解决方案: 感谢@Tanaike,部署网络应用程序是我最终采用的解决方案

【问题讨论】:

    标签: postgresql google-apps-script google-sheets


    【解决方案1】:
    • 您要执行电子表格的容器绑定脚本。
    • 您想从本地 PC 或 Google 外部执行脚本。
    • 您想从电子表格 ID 执行脚本。

    如果我的理解是正确的,那么这个答案呢?

    获取容器绑定脚本的项目ID:

    我认为这是您遇到的难题。在当前阶段,没有任何方法可以从父 Google Docs(在本例中为电子表格)检索容器绑定脚本的项目 ID。

    • 这已在https://issuetracker.google.com/issues/111149037 报告为功能请求。但遗憾的是,这还没有实现。
    • 因此,需要手动检索项目 ID。
    • 例如,您可以在Developer Hub 检索项目ID。
      • 选择项目时,可以在https://script.google.com/home/projects/### projectId ###的URL看到项目ID。

    根据上述情况,需要从您要运行脚本的每个电子表格中手动检索项目 ID。很抱歉,我找不到解决这种情况的方法。

    执行脚本:

    我认为执行脚本有两种模式。您可以从 2 种模式中进行选择。

    1。使用 Apps Script API 中的 scripts.run 方法

    • 您的问题中也提到了这一点。
    • 脚本中的函数是使用 API 执行的。
    • 您只需要在本地创建 python 脚本。
    • 在这种情况下,本地需要 OAuth2 进程检索到的访问令牌。

    我认为在这种模式下,脚本可以很简单。

    2。使用网络应用

    • 通过访问 Web 应用程序,脚本中的函数被执行。
      • 在这种情况下,为了执行脚本,它使用 Apps Script API 中的 scripts.run,因为您的情况有大量电子表格。当用户访问 Web Apps 时,Spreadsheet 的脚本由 Web Apps 的脚本执行。由于使用了 Google Apps 脚本,因此可以轻松检索访问令牌。
    • 您需要创建一个用于在本地访问 Web Apps 的 Python 脚本,以及在 Google 端(Web Apps)访问的 Google Apps 脚本。
    • 在这种情况下,您可以在本地使用或不使用访问令牌运行脚本。

    我认为在这种模式下,访问的方法可以很简单。

    参考资料:

    如果这不是你想要的,我很抱歉。

    编辑:

    从讨论中,我认为在您的脚本Refresh() 的情况下,以下流程是合适的。 1.使用Refresh()的脚本像API一样部署Web Apps。 2. 使用python脚本和curl调用API。 这样,Web Apps 的脚本就会运行,您可以将Refresh() 的结果反映到所有电子表格中。

    示例脚本:

    function doGet() {
      var spreadsheets = ["spreadsheetId1", "spreadsheetId2",,,]; // Please set spreadsheet ID here.
      for (var i = 0; i < spreadsheets.length; i++) {
        SpreadsheetApp.openById(spreadsheets[i])
          .getSheetByName("Sheet1") // If you want to also put values to other sheet, please modify this.
          .getRange(1, 1)
          .setValue(new Date());
      }
      return ContentService.createTextOutput("Done.");
    }
    
    • 部署 Web 应用程序时,会打开授权屏幕。但这种授权只有一次。

    部署网络应用:

    在您请求网络应用程序之前,请部署网络应用程序。

    • 在脚本编辑器上
    • 发布 -> 部署为 Web 应用程序
      1. 创建新的项目版本
      2. 在“执行应用程序”中,选择“我”
      3. 在“谁有权访问该应用”中,选择“任何人,甚至是匿名的”
      4. 点击“部署”
      5. 复制“当前网络应用 URL”
      6. 点击“确定”

    卷曲示例:

    如果使用 curl 命令,请按如下方式使用。

    $ curl -L "https://script.google.com/macros/s/#####/exec"
    

    注意:

    • 当您修改脚本时,请将 Web 应用程序重新部署为新版本。这样,最新的脚本就会反映到 Web Apps。 这是很重要的一点。

    注意:

    • 您还可以使用电子表格 ID 进行请求,并且可以直接将它们包含在 Web 应用程序中。 (在示例脚本中,使用了后者。)
      • 如果您想使用电子表格 ID 进行请求,请小心。 Web 应用的工作人员数量要求少于 30。Ref

    【讨论】:

    • 感谢您抽出宝贵时间!看起来我需要为每个谷歌电子表格创建一个项目,无论我是在执行 scripts.run 方法还是通过应用程序脚本 api developers.google.com/apps-script/api/how-tos/execute google 的要求是 The script being called and the calling application must share a Cloud Platform project. 为什么 google 对我们这样做为什么。如果有任何其他简单的解决方案,我会留下这个问题..
    • @sojim2 感谢您的回复。我很抱歉我提出了你不想要的方法。我可以问你想要的详细情况吗? 1. 您想在许多电子表格未打开的情况下执行脚本。我的理解正确吗? 2. 能否提供一个您想执行的示例脚本?同样从脚本中,我想找到一种解决方法。因为例如,我认为 Sheets API 可能可以用于您的情况。
    • 我想我误解了.. 创建脚本需要已经创建一个项目,所以我需要做的就是根据https://developers.google.com/apps-script/api/how-tos/execute 创建 python 执行脚本并拥有要执行的应用程序 ID 和函数名它来自python脚本。基本上,我想为这个电子表格远程运行Refresh()docs.google.com/spreadsheets/d/…所以API可以满足我的要求,我只需要使用python。
    • @sojim2 感谢您提供更多信息。对于共享电子表格上的脚本,我认为不需要使用Apps Script API,您可以使用Sheets API将脚本的结果直接反映到这么多电子表格中。在这种情况下,您可以使用电子表格 ID 运行脚本,并且每个电子表格中都不需要绑定脚本。我的理解正确吗?当然,你可以使用python脚本来实现。
    • 明确地说,这里引用的 python 可以工作并且可能是管理数百个电子表格的最简单的方法? developers.google.com/apps-script/api/how-tos/execute
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多