我正在开发一个Google Apps脚本函数,它将在融合表中插入一行。我的大多数融合表接口都能正常工作,但这是我第一次尝试使用sql’POST’查询。根据此处的文档,我应该能够将sql语句放入POST正文中。我将自己简化为OAuth Playground进行故障排除,并且不断收到以下错误。我一直在尝试使用sql insert语句,sql=INSERT INTO {fusionId} (HeadingName) VALUES (ValueOne)并且尝试了该语句的各种变体但无济于事。请帮助我确定执行此操作的正确语法或方法。
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()函数和此函数的总体布局与我用于在融合表中添加列的函数相同(有效)。
成功!经过大量研究,我已经解决了这个问题。这不是有效载荷或contentType的问题(实际上,我发现.fetch自动默认为“ application / x-www-form-urlencoded”编码)。问题出在授权上。我使用James Ferreira的Fusion Table库作为模型,并在代码和库的Logger.log(UrlFetchApp.getRequest(url, fetchArgs))之前插入了该表UrlFetchApp.fetch(url, fetchArgs).getContentText()。
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}
然后,我将工作库的日志与我自己的日志进行了比较,发现三个不同之处。
经过一些实验,我确定…