Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 获取Google Apps脚本以授权Fusion表API_Google Apps Script_Google Fusion Tables - Fatal编程技术网

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

Google apps script 获取Google Apps脚本以授权Fusion表API,google-apps-script,google-fusion-tables,Google Apps Script,Google Fusion Tables,我正在构建一个数据库,我希望它能托管在一个Fusion表中,我正在开发一些与Fusion API接口的测试函数。我正在使用谷歌应用程序脚本,并且在很大程度上依赖于其他源代码。我花了一天的大部分时间研究这个问题,现在我陷入了困境 在脚本编辑器中运行addNewColumn()时,它会进入“fetch ready”日志条目(正如我在日志中看到的),然后它会经历身份验证过程(每次),然后停止(并且永远不会进入“fetch executed”日志条目)。没有抛出错误,但它从未完成fetch命令 在调试模

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

在脚本编辑器中运行addNewColumn()时,它会进入“fetch ready”日志条目(正如我在日志中看到的),然后它会经历身份验证过程(每次),然后停止(并且永远不会进入“fetch executed”日志条目)。没有抛出错误,但它从未完成fetch命令

在调试模式下运行时,它经过授权,然后挂起在获取行。如果我点击“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);  
}

Upate

我已经简化了要测试的函数,并发现通过简单地在选项主体的payload字段中插入'null'来代替'payload'变量,代码将成功地在fusion表中创建一个无名列。但是,当我重新插入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'
    };

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

谷歌著名的脚本库中有一个fusion表库:

我链接了那个图书馆,但似乎有问题。因此(出于调试原因),我将源代码复制到我的项目中并使其正常工作:


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

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

  • 必须通过JSON.stringify()将有效负载转换为字符串
  • contentType必须手动设置为“application/json”
  • 这与我在网上找到的多个教程非常不同,但我想分享我的工作解决方案

    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());
    
    }
    
    • 这似乎与其他urlFetch帖子不同的原因 示例是因为Fusion表服务需要实际的JSON 作为请求“BODY”的有效负载。添加JSON对象时 (不带Stringify)作为“有效负载”,UrlFetchApp将转换每个名称/值对 转换为Url编码的请求字符串(即name=YES&type=String)。 但是,当有效负载是字符串时(如您正在使用的情况) stringify),UrlFetch将只对您提供的字符串进行URL编码(在 本例是一个JSON字符串)。如果您正在“发布”到服务 如果需要名称/值参数,则不会使用Stringify
    • 注意:只是为了让您了解并澄清您的其他相关信息 您发布的问题,您正在使用Oauth 1.0 示例(addOAuthService仅支持Oauth1.0端点和 协议)
    • 还有一个注意事项:您正在混合Utilities.jsonParse和 JSON.stringify。我会使用JSON.parse来保持一致

    谢谢。该网站是我获得一些动机的地方,但它使用客户机登录和sql(我认为这是不推荐的)。我仍在与错误作斗争。事实上,我广泛使用了该库。不幸的是,这仍然是一个问题。请看我的更新(和澄清)线程以上。再次感谢你的帮助。