小编典典

OAuth,OAuthConfig和Google Apps脚本(融合表API-SQL插入问题)

sql

我正在开发一个Google
Apps脚本函数,它将在融合表中插入一行。我的大多数融合表接口都能正常工作,但这是我第一次尝试使用sql’POST’查询。根据此处的文档我应该能够将sql语句放入POST正文中。我将自己简化为OAuth
Playground
进行故障排除,并且不断收到以下错误。我一直在尝试使用sql
insert语句,sql=INSERT INTO {fusionId} (HeadingName) VALUES (ValueOne)并且尝试了该语句的各种变体但无济于事。请帮助我确定执行此操作的正确语法或方法。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required parameter: sql",
    "locationType": "parameter",
    "location": "sql"
   }
  ],
  "code": 400,
  "message": "Required parameter: sql"
 }
}

一旦弄清楚了,我就需要在我的代码中重复执行Playground操作,(我认为)看起来像这样:

function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusionId} (Heading) VALUES (ONE)",
      contentType : "application/json"
    };
Logger.log(options)
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

我一直在想,内容类型也可能是个问题,但我很茫然。请帮忙。

更新#1 通过使用三亚的建议,我能够使请求在OAuth
Playground中运行。但是,我仍在努力处理代码中的请求。我在运行代码时收到重复的授权请求(或在调试时出现一般的OAuth错误)。从我以前的经验在这里,我相信,这意味着仍然有一些错误与我的有效载荷。任何对此的建议将不胜感激。

var oAuthFields = {
  'clientId' : '523606257547.apps.googleusercontent.com',
  'scope' : 'https://www.googleapis.com/auth/fusiontables',
  'fetchUrl' : 'https://www.googleapis.com/fusiontables/v1/',
  'clientSecret' : 'L-f8DgwK4rs7Qmw9k5IFL7lZ',
  'fusionId' : '1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI',
  'service' : 'fusiontables',
  'queryUrl' : 'https://www.googleapis.com/fusiontables/v1/query/'
};
function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusion id} (\'Heading\') VALUES (\'ONE\')",
      contentType : "application/x-www-form-urlencoded"
    };
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

对于上下文,googleAuth()函数和此函数的总体布局与我用于在融合表中添加列的函数相同(有效)。


阅读 173

收藏
2021-04-22

共1个答案

小编典典

成功!经过大量研究,我已经解决了这个问题。这不是有效载荷或contentType的问题(实际上,我发现.fetch自动默认为“ application /
x-www-form-urlencoded”编码)。问题出在授权上。我使用James Ferreira的Fusion
Table库作为模型,并在代码和库的Logger.log(UrlFetchApp.getRequest(url, fetchArgs))之前插入了该表UrlFetchApp.fetch(url, fetchArgs).getContentText()

//log entry for library
{oAuthServiceName=fusion, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT INTO 1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI ('Heading', 'Heading 2') VALUES ('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.google.com/fusiontables/api/query}

//log entry for my code
{oAuthServiceName=fusiontables, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT+INTO+1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI+('Heading',+'Heading+2')+VALUES+('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.googleapis.com/fusiontables/v1/query}

然后,我将工作库的日志与我自己的日志进行了比较,发现三个不同之处。

  1. 我认为sql语句的编码有所不同(“ INSERT INTO”与“ INSERT + INTO”)。
  2. 请求的“服务”参数不同(“融合”与“融合表”)。
  3. qpi查询网址不同。(“ www.google.com/fusiontables/api/query”与“ www.googleapis.com/fusiontables/v1/query”)。

经过一些实验,我确定…

  1. 假定的编码与我的错误无关。
  2. 服务参数也无关紧要。我在各种文档中都看到过,似乎其中任何一个都行得通。
  3. 令人沮丧的是,这就是问题所在。令人沮丧的是,因为api文档说要使用一种无​​效的方法。显然,www.googleapis.com / fusiontables / v1 / query适用于OAuth2.0。OAuthConfig(我在GAS中使用的临时授权工具)尚未迁移到2.0,因此缺少文档。我已经提交了功能请求,以将OAuthConfig迁移到此处。如果您也想解决这个问题,请给该线程一些爱。
2021-04-22