我正在构建一个我希望在Fusion Table中托管的数据库,并且我正在开发一些用于与Fusion API接口的测试功能。我正在使用Google Apps脚本,并严重依赖此代码的其他来源。我花了大约一天的时间来研究这个问题,现在我被卡住了。
在脚本编辑器中运行addNewColumn()时,它会进入“fetch ready”日志条目(正如我在日志中看到的那样),然后通过身份验证过程(每次),然后停止(和永远不会进入“获取执行”日志条目)。没有抛出任何错误但它从未完成获取命令。
在调试模式下运行时,它会通过授权然后挂起到获取行。如果我点击“步入”,我会收到一个错误,上面写着“OAuth错误”。我不确定该怎么做。任何帮助将不胜感激。
function googleAuth() {
var scope = "https://www.googleapis.com/auth/fusiontables";
var service = 'fusion';
var oAuthConfig = UrlFetchApp.addOAuthService(service);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
"OAuthGetRequestToken?scope="+scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey('{consumer key}');
oAuthConfig.setConsumerSecret('{secret}');
return {oAuthServiceName:'fusion', oAuthUseToken:"always"};
}
function addNewColumn(){
var p = {
'name' : "newColumn",
'type' : "NUMBER"
};
Logger.log(addColumn(p));
}
function addColumn(parameters) {
var url = "https://www.googleapis.com/fusiontables/v1/";
var fetchArgs = googleAuth();
fetchArgs.method = "POST";
fetchArgs.payload = parameters;
//if the fetch arg payload is set to null it will add an unnamed column
//fetchArgs.payload = null;
url += "tables/"+"{table id}"+"/columns";
url += '?key='+"{key}";
Logger.log("fetch ready");
var result = UrlFetchApp.fetch(url, fetchArgs).getContentText();
Logger.log("fetch executed");
return Utilities.jsonParse(result);
}
Upate
我简化了我要测试的函数,我发现只需在选项体的有效负载字段中插入'null'代替'payload'变量,代码就会成功创建一个无名列。融合表。但是,当我重新插入有效负载变量时 - 它会停止工作。
当不工作时,它要么:每次从编辑器运行它时要求重新授权,或者从Web应用程序运行时要求“遇到错误:执行该操作需要授权”。有效负载如何更改授权?我已经将完全相同的有效负载剪切并粘贴到OAuth2.0游乐场中,并且完美无缺。请帮忙。
function googleAuth() {
var oAuthConfig = UrlFetchApp.addOAuthService(service);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
"OAuthGetRequestToken?scope=" + scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey(clientId);
oAuthConfig.setConsumerSecret(clientSecret);
return {oAuthServiceName:service, oAuthUseToken:"always"};
}
function addColumn() {
googleAuth();
var payload =
{
name : "IT WORKED",
type : "STRING"
};
var options =
{
"oAuthUseToken":"always",
"oAuthServiceName":service,
"method" : "post",
"payload":payload
};
var url = fetchUrl + "tables/" + fusionId + "/columns" + "?key=" + apiKey;
var fetchResult = UrlFetchApp.fetch(url, options);
Logger.log(fetchResult.getContentText());
return Utilities.jsonParse(fetchResult.getContentText());
}
更新#2
我找到了一种方法,可以让它在没有任何错误的情况下运行,但它仍然没有将请求的名称和类型分配给新列。最近添加的是指定内容类型,如下所示。通过将contentType强制为'application'或'json',它将运行但仍未按预期传递有效负载。
var options =
{
"oAuthUseToken":"always",
"oAuthServiceName":service,
"method" : "POST",
"payload" : payload,
'contentType' : 'application'
};
答案 0 :(得分:0)
我遇到了同样的问题,试图从融合表中获取和操作数据。
Google着名的脚本库中有一个融合表库:https://developers.google.com/apps-script/notable-script-libraries?hl=pt-BR
我链接了那个库,但它似乎是错误的。因此(出于调试原因)我将源代码复制到我的项目中并使其工作:
也许你在那里找到答案。
答案 1 :(得分:0)
解决!!!解决方案有两个方面:
这与我在网上找到的多个教程非常不同,但我想分享我的工作解决方案。
function addColumn(authToken) {
googleAuth();
var payload =
{
name : 'YES',
type : 'STRING'
};
var options =
{
payload : JSON.stringify(payload),
oAuthUseToken : "always",
oAuthServiceName : service,
method : "POST",
contentType : "application/json"
};
var url = fetchUrl + "tables/" + fusionId + "/columns";// + "?key=" + apiKey;
var fetchResult = UrlFetchApp.fetch(url, options);
Logger.log(fetchResult.getHeaders());
Logger.log(fetchResult.getContentText());
return Utilities.jsonParse(fetchResult.getContentText());
}
答案 2 :(得分:0)