Google apps script 使用应用程序脚本URLFetchApp访问Google数据存储数据
我想通过应用程序脚本来试验Google数据存储,因为我有一个基于Google sheets的当前解决方案,该解决方案在不断处理驱动器文件时会遇到超时问题。我已经在谷歌云上创建了一个测试项目,使用一个服务帐户并启用了库MZx5DzNPsYjVyZaR67xXJQai_d-phDA33 (cGoa)处理Oauth2工作。我按照指南启动了它,并得到了所有相关的确认,证明它与我的令牌一起工作(并且删除令牌会引发“身份验证失败提示”) 现在我想从一个基本查询开始,以显示我已经输入的一个实体。我可以使用API资源管理器并运行此查询正文:Google apps script 使用应用程序脚本URLFetchApp访问Google数据存储数据,google-apps-script,oauth-2.0,google-cloud-datastore,urlfetch,Google Apps Script,Oauth 2.0,Google Cloud Datastore,Urlfetch,我想通过应用程序脚本来试验Google数据存储,因为我有一个基于Google sheets的当前解决方案,该解决方案在不断处理驱动器文件时会遇到超时问题。我已经在谷歌云上创建了一个测试项目,使用一个服务帐户并启用了库MZx5DzNPsYjVyZaR67xXJQai_d-phDA33 (cGoa)处理Oauth2工作。我按照指南启动了它,并得到了所有相关的确认,证明它与我的令牌一起工作(并且删除令牌会引发“身份验证失败提示”) 现在我想从一个基本查询开始,以显示我已经输入的一个实体。我可以使用AP
{
"query": {}
}
得到这个结果:
{
"batch": {
"entityResultType": "FULL",
"entityResults": [
{
"entity": {
"key": {
"partitionId": {
"projectId": "project-id-5200707333336492774"
},
"path": [
{
"kind": "Transaction",
"id": "5629499534213120"
}
]
},
"properties": {
"CommentIn": {
"stringValue": "My First Test Transaction"
},
"Status": {
"stringValue": "Closed"
},
"auditStatus": {
"stringValue": "Logged"
},
"User": {
"stringValue": "John Doe"
},
"Start": {
"timestampValue": "2017-08-17T18:07:04.681Z"
},
"CommentOut": {
"stringValue": "Done for today!"
},
"End": {
"timestampValue": "2017-08-17T20:07:38.058Z"
},
"Period": {
"stringValue": "08/16/2017-08/31/2017"
}
}
},
"cursor": "CkISPGogc35whh9qZWN0LWlkLTUyMDA3MDcwODA1MDY0OTI3NzRyGAsSC1RyYW5zYWN0aW9uGICAgICAgIAKDBgAIAA=",
"version": "1503004124243000"
}
],
"endCursor": "CkISPGogc35wcm9qZWN0LWlkLTUyMDAxxDcwODA1MDY0OTI3NzRyGAsSC1RyYW5zYWN0aW9uGICAgICAgIAKDBgAIAA=",
"moreResults": "NO_MORE_RESULTS"
}
}
我尝试用这段代码做同样的事情:
function doGet(e)
{
var goa = cGoa.GoaApp.createGoa('Oauth2-Service-Account',
PropertiesService.getScriptProperties()).execute(e);
if(goa.hasToken()) {var token = goa.getToken();}
var payload = {"query":{}}
;
var result = UrlFetchApp.fetch('https://datastore.googleapis.com/v1/projects/project-id-5200707333336492774:runQuery',
{
method: "POST",
headers: {authorization: "Bearer " + goa.getToken()},
muteHttpExceptions : true,
payload: payload
});
Logger.log(result.getBlob().getDataAsString());
}
并在记录器中获取此错误:
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"query\": Cannot bind query parameter. 'query' is a message type. Parameters can only be bound to primitive types.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"description": "Invalid JSON payload received. Unknown name \"query\": Cannot bind query parameter. 'query' is a message type. Parameters can only be bound to primitive types."
}
]
}
]
}
}
如果我尝试使用另一个词,如“resource”或“GqlQuery”,则会出现以下错误:
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"GqlQuery\": Cannot bind query parameter. Field 'GqlQuery' could not be found in request message.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"description": "Invalid JSON payload received. Unknown name \"GqlQuery\": Cannot bind query parameter. Field 'GqlQuery' could not be found in request message."
}
]
}
]
}
}
我无法从API文档中看出我的语法应该是什么。有谁能告诉我如何将功能性请求体从应用程序脚本编译到数据存储 您需要设置负载的contentType,并按如下方式对JSON负载进行字符串化:
var result = UrlFetchApp.fetch(
'https://datastore.googleapis.com/v1/projects/project-id-5200707333336492774:runQuery',
{
'method':'post',
'contentType':'application/json',
'headers': {authorization: "Bearer " + goa.getToken()},
'payload':JSON.stringify(payload)
}
);
您需要设置负载的contentType,并按照如下方式对JSON负载进行字符串化:
var result = UrlFetchApp.fetch(
'https://datastore.googleapis.com/v1/projects/project-id-5200707333336492774:runQuery',
{
'method':'post',
'contentType':'application/json',
'headers': {authorization: "Bearer " + goa.getToken()},
'payload':JSON.stringify(payload)
}
);
另外:使用空正文运行查询将创建此响应:“错误”:{“代码”:400,“消息”:“必须设置query.query和query.gql_查询中的一个字段”,“状态”:“无效_参数”}}。另外:使用空正文运行查询将创建此响应:“错误”:{“代码”:400,“message”:“Query.Query和Query.gql_Query字段之一必须设置”,“status”:“INVALID_ARGUMENT”}您做到了,Dimu Designs!谢谢现在很好用!那么,这个API有没有我没有找到的参考资料?谷歌的API页面并没有明确说明这一点……通过HTTP发送请求和接收响应对于web开发来说是通用的,所以应用程序脚本文档有点掩盖了这一点。但它确实在UrlFetchApp文档中涵盖了一点这个主题:如果你真的想深入研究这个主题,你可以尝试阅读下面的指南:这有很多东西需要仔细研究,但一旦你搞懂了,你就会更好地理解http是如何工作的。你做到了,Dimu Design!谢谢现在很好用!那么,这个API有没有我没有找到的参考资料?谷歌的API页面并没有明确说明这一点……通过HTTP发送请求和接收响应对于web开发来说是通用的,所以应用程序脚本文档有点掩盖了这一点。但它确实在UrlFetchApp文档中涵盖了一点这个主题:如果你真的想深入研究这个主题,你可以尝试阅读下面的指南:这有很多东西需要仔细研究,但一旦你搞懂了,你就会更好地理解http是如何工作的。