Http 如何使用GoogleSheets触发器触发GoogleCloud函数?

Http 如何使用GoogleSheets触发器触发GoogleCloud函数?,http,google-apps-script,google-sheets,google-cloud-platform,triggers,Http,Google Apps Script,Google Sheets,Google Cloud Platform,Triggers,我正在尝试使用连接到谷歌表单的谷歌应用程序脚本的HTTP请求触发谷歌云功能 云功能在GCP上通过一个虚拟请求进行了测试,它基本上获得了用户使用前端提交的表单的最新条目。我想它被触发时,新的提交发生。因此,我使用onchange触发器发送请求。这是到目前为止我在appscript中所使用的代码 function onChange(e) { Logger.log('called'); var url = "https://MY_REGION-MY_PROJECT.cloudfunc

我正在尝试使用连接到谷歌表单的谷歌应用程序脚本的HTTP请求触发谷歌云功能

云功能在GCP上通过一个虚拟请求进行了测试,它基本上获得了用户使用前端提交的表单的最新条目。我想它被触发时,新的提交发生。因此,我使用onchange触发器发送请求。这是到目前为止我在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时,stackdriver日志会显示以下错误:

我已经看过并遵循了解决方案和评论,但它们对我没有多大帮助;也就是说,我已确保应用程序脚本已连接到我的项目,重新部署了云功能,并将openid添加到清单的作用域中

鉴于它仍然不起作用,我希望得到一些指导。我还缺少什么吗?

一些想法:

GAS触发器不侦听程序更改 对工作表的编程访问既不会调用onChange触发器,也不会调用onEdit触发器。我过去曾试图构建类似的东西,但遭到了阻挠

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

将活动处理功能构建到脚本中 设置一个基于时间的触发器我每分钟做一次,寻找那些活动,然后处理它们 这不是一个完美的解决方案,但对我来说效果很好。

一些想法:

GAS触发器不侦听程序更改 对工作表的编程访问既不会调用onChange触发器,也不会调用onEdit触发器。我过去曾试图构建类似的东西,但遭到了阻挠

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

将活动处理功能构建到脚本中 设置一个基于时间的触发器我每分钟做一次,寻找那些活动,然后处理它们
这不是一个完美的解决方案,但对我来说效果很好;将身份验证令牌硬编码到应用程序脚本中。通过在Google Cloud Shell脚本中运行gcloud auth print identity token来提供身份验证令牌。复制输出并替换onchange方法中的相应行

API中似乎存在一个bug,在调用ScriptApp.getIdentityToken时,该bug没有获取令牌的值。这是我在办公室里提出来的。希望很快就能修好


请注意,硬编码身份验证令牌可能只是一个临时解决方案,因为该令牌可能会更改。如果要继续使用此方法,请确保在应用程序脚本中定期更新它。

我找到了一个临时修复程序;将身份验证令牌硬编码到应用程序脚本中。通过在Google Cloud Shell脚本中运行gcloud auth print identity token来提供身份验证令牌。复制输出并替换onchange方法中的相应行

API中似乎存在一个bug,在调用ScriptApp.getIdentityToken时,该bug没有获取令牌的值。这是我在办公室里提出来的。希望很快就能修好


请注意,硬编码身份验证令牌可能只是一个临时解决方案,因为该令牌可能会更改。如果要继续使用此方法,请确保在应用程序脚本中定期更新它。

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

将appscript项目与标准GCP项目关联

更新manifest.json以包含以下范围:

oauthScopes:[ https://www.googleapis.com/auth/script.external_request, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile ],


您应该能够调用ScriptApp.getIdentityToken;从Bhairav的答案来看,没有任何问题,我们不必手动复制和粘贴身份令牌。下面是如何调用getIdentityToken函数

将appscript项目与标准GCP项目关联

更新manifest.json以包含以下范围:

oauthScopes:[ https://www.googleapis.com/auth/script.external_request, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.co m/auth/userinfo.profile ],

您应该能够调用ScriptApp.getIdentityToken;没问题

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)
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());
}