【问题标题】:How to trigger a Google Cloud Function using a Google Sheets Trigger?如何使用 Google 表格触发器触发 Google Cloud 函数?
【发布时间】:2020-07-22 21:52:46
【问题描述】:

我正在尝试使用来自连接到 Google 表格的 Google Apps 脚本的 HTTP 请求来触发 Google 云功能。

云功能(在 GCP 上使用虚拟请求进行测试,可行)本质上是获取用户使用 Appsheet 前端提交的工作表的最新条目。我希望在发生新提交时触发它。因此,我使用onChange(e) 触发器来发送请求。这是我目前在 appscript 中的代码。

function onChange(e) {
  Logger.log('called');
  var url = "https://MY_REGION-MY_PROJECT.cloudfunctions.net/MY_CLOUD_FUNCTION";
  const token = ScriptApp.getIdentityToken();
  const options = {
    headers: {'Authorization': 'Bearer ' + token}
  }
  const response = UrlFetchApp.fetch(url, options);
  Logger.log('Response Code: ' + response.getResponseCode());
}

当提交新的 Appsheet 时,堆栈驱动程序日志给我以下错误(因此调用 onChange(e)):

Exception: Request failed for https://MY_REGION-MY_PROJECT.cloudfunctions.net returned code 401. Truncated server response: 
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>401 Unauthorized</title>
</head>
<body text=#000000 bgcolor... (use muteHttpExceptions option to examine full response)
    at onChange(Code:9:32)

我已经查看并遵循了解决方案和 cmets herehere,但它们对我帮助不大;也就是说,我已经确保应用脚本连接到我的项目,重新部署了云功能,并将openid添加到清单的范围内。

鉴于它仍然无法正常工作,我想要一些指导。我这里还有什么遗漏吗?

【问题讨论】:

    标签: http google-apps-script google-sheets google-cloud-platform triggers


    【解决方案1】:

    我找到了一个临时修复;将身份验证令牌硬编码到 App 脚本中。身份验证令牌通过在 Google Cloud Shell 脚本中运行 gcloud auth print-identity-token 给出。复制输出并替换onChange(e)方法中的对应行。

    function onChange(e) {
      Logger.log('called');
      var url = "https://MY_REGION-MY_PROJECT.cloudfunctions.net/MY_CLOUD_FUNCTION";
      const token = ScriptApp.getIdentityToken(); //<-- Replace this line!
      const options = {
        headers: {'Authorization': 'Bearer ' + token}
      }
      const response = UrlFetchApp.fetch(url, options);
      Logger.log('Response Code: ' + response.getResponseCode());
    }
    

    API 中似乎存在一个错误,当调用 ScriptApp.getIdentityToken() 时,它没有获取令牌的值。我在issue tracker 中提出了这个问题。希望它很快得到修复。

    请注意,对身份验证令牌进行硬编码可能只是一种临时解决方案,因为该令牌可能会更改。如果您想继续使用此方法,请务必定期在 App Script 中更新。

    【讨论】:

      【解决方案2】:

      根据 Bhairav 的回答,我们不必手动复制和粘贴身份令牌。以下是我们如何调用 getIdentityToken() 函数

      您应该可以毫无问题地调用 ScriptApp.getIdentityToken();

      【讨论】:

        【解决方案3】:

        一些想法:

        GAS 触发器不会监听程序更改

        onChangeonEdit 触发器都不会通过对工作表的编程访问来调用。 (Reference)。我过去曾尝试过构建类似的东西,但遭到了挫败。

        我是如何处理这个问题的

        我通过创建一个专用选项卡来处理此问题,在该选项卡中,其他应用程序(对工作表具有写访问权限)以编程方式将字符串化对象添加到单元格。然后,我有一个 GAS 函数,它每分钟寻找新的活动(字符串化对象),然后根据解析的活动对象内部的内容进行处理。要使用这种方法,您需要:

        • 将“活动处理”功能构建到您的脚本中
        • 设置基于时间的触发器(我每分钟执行一次)来查找这些活动,然后处理它们

        这不是一个完美的解决方案,但对我来说效果很好。

        【讨论】:

          猜你喜欢
          • 2022-07-22
          • 2018-03-27
          • 1970-01-01
          • 2021-02-21
          • 1970-01-01
          • 1970-01-01
          • 2018-03-27
          • 2021-02-04
          • 2020-04-05
          相关资源
          最近更新 更多