使用Apps Script URLFetchApp访问Google Datastore数据

时间:2017-08-17 23:19:43

标签: google-apps-script oauth-2.0 google-cloud-datastore urlfetch

我想通过Apps脚本试验Google Datastore,因为我有一个基于Google表格的当前解决方案,这些解决方案遇到了与Drive文件不断交易所固有的超时问题。我已经在Google云中创建了一个测试项目,其中包含一个服务帐户和已启用的库 MZx5DzNPsYjVyZaR67xXJQai_d-phDA33  (cGoa)处理Oauth2的工作。我按照指南启动它here并得到了所有相关的确认信息,它与我的令牌一起工作(并且删除令牌会导致认证失败提示')。

现在我想从一个基本查询开始,显示我已经放入的一个实体。我可以使用API​​ Explorer here并运行此查询体:

{
   "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."
           }
         ]
       }
     ]
   }
 }

如果我尝试使用其他词语,例如“资源”和“资源”。或者' 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文档中了解我的语法应该是什么。谁能告诉我如何从Apps脚本到数据存储编译功能请求体?

1 个答案:

答案 0 :(得分:2)

您需要设置有效负载的 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)
    }
);