当前位置: 首页 > 知识库问答 >
问题:

获取Google Apps脚本以授权Fusion表API

侯向文
2023-03-14

我正在构建一个数据库,我希望它能托管在一个Fusion表中,我正在开发一些与Fusion API接口的测试函数。我正在使用谷歌应用程序脚本,并且在很大程度上依赖于其他源代码。我花了一天的大部分时间研究这个问题,现在我陷入了困境。

当在脚本编辑器中运行addNewColsta()时,它会进入“获取准备就绪”日志条目(正如我在日志中看到的那样),然后它会经历身份验证过程(每次),然后就停止(并且永远不会进入“获取已执行”日志条目)...没有抛出错误,但它永远不会完成提取命令。

在调试模式下运行时,它经过授权,然后挂起在获取行。如果我点击“step in”,我会得到一个简单的错误,上面写着“OAuth error”。我真的不知道该怎么办。任何帮助都将不胜感激。

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);  
}

竖立

我已经简化了我的函数来测试,我发现通过简单地在选项主体的有效载荷字段中插入“null”来代替“有效载荷”变量,代码将成功地在融合表中创建一个无名列。然而,当我重新插入有效载荷变量时-它停止工作。

当不工作时,它或者:每次我从编辑器运行它时,都会要求重新授权,或者当从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'
    };

共有3个答案

鲁宏爽
2023-03-14
  • 这似乎与其他urlFetch POST示例不同的原因是,Fusion表服务期望实际的JSON负载作为请求“主体”。当您添加一个JSON对象(不带Stringify)作为“有效负载”时,UrlFetchApp会将每个名称/值对转换为Url编码的请求字符串(即name=YES)
白宏放
2023-03-14

解决了的!!!解决方案有两个方面:

  1. 有效负载必须通过JSON转换为字符串。stringify()

这与我在网上找到的多个教程非常不同,但我想分享我的工作解决方案。

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());

}
别开诚
2023-03-14

我也遇到了同样的问题,试图从融合表中获取和操作数据。

Google著名的脚本库中有一个融合表库:https://developers.google.com/apps-script/notable-script-libraries?hl=pt-BR

我链接了那个库,但它似乎有问题。所以(出于调试原因)我把源代码复制到我的项目中,让它工作:

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/fusion-tables-class/fusion-source

也许你在那里找到了答案。

 类似资料:
  • 获取授权token 请求地址 https://api.es.xiaojukeji.com/openauth/Service/getToken 返回数据格式 JSON 请求方式 POST 访问授权限制 暂无 请求参数 名称 类型 必选 描述 out_company_id string yes 待授权公司在平台的id out_company_name string yes 待授权公司在平台的名称 ou

  • 获取企业授权 PDF版下载 为了保证信息安全,所有API(包括第三方API及通讯录、发消息等所有API)调用需要验证来源域名。只有在应用开发信息中填写的合法授信域名才能合法调用。 获取第三方应用凭证 该API用于获取第三方应用凭证(suite_access_token)。 由于应用提供商可能托管了大量的企业,其安全问题造成的影响会更加严重,本接口除了合法来源IP校验之外,还额外需要suite_ti

  • 接口说明 获取授权代码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/access/v1.0.0/getHardWareCode 是否需要登录 否 请求字段说明 无 响应字段说明 无 响应成功示例 { "code": 0, "data": "134305892", "message":

  • 接口说明 获取授权代码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /wish3dearth/api/access/v1.0.0/get

  • 请求header POST /v1/activities/{频道id}/getAuthKey Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换您需要获取的频道id 返回 { "status": "y",

  • 我不知道为什么我不能从头AUTHORIZATION中获得值,因为我在Postman(从服务器返回)中看到。 http://img110.xooimage.com/files/1/6/9/postman-567005e.png 我尝试了很多方法,但不知道为什么仍然得到空值。 http://img110.xooimage.com/files/b/c/f/debug-5670075.png 这是我的代码