Google 向 Trello API 发送 GET 请求并将数据导入 Google Sheet 的脚本

Google Script to send GET request to Trello API and import data to Google Sheet

我有一个小脚本可以从 Trello API 中提取信息。

当我将完整的 URL 分配给一个 String 变量时,脚本工作正常。但是,当我单独传递参数时,出现错误“请求未经授权的权限”。

工作代码:

var url = "https://api.trello.com/1/boards/57c68c1beaab4c676adfaeb1/lists?key=myTrelloKey&token=myTrelloToken";

  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());

有问题的代码:

var url = "https://api.trello.com/1/boards/57c68c1beaab4c676adfaeb1/lists";

  var options = 
 {
  "key": "myTrelloKey",
  "token": "myTrelloToken",
  "muteHttpExceptions" : true
  };
  
  var response = UrlFetchApp.fetch(url,options);
  Logger.log(response.getContentText());

我试图了解这是否是身份验证问题,但无法解决。我在第二个版本中做错了什么吗?提前致谢!

我相信你的现状和目标如下。

  • 根据你的问题,我了解到 Working code: 的脚本有效。
  • 您想使用 "key": "myTrelloKey""token": "myTrelloToken" 作为查询参数。

修改点:

  • UrlFetchApp.fetch(url, params)params没有keytoken的属性。
    • 我认为这就是您遇到问题的原因。
  • 即使在 payload 中使用这些值,在这种情况下,请求也会变成 POST 方法。
  • 当要使用"key": "myTrelloKey""token": "myTrelloToken"作为查询参数时,现阶段需要准备一个脚本。
    • 虽然我测试了keytoken是否可以直接用于请求体和headers而不是查询参数,但不幸的是,这些都没有成功。似乎这些被用作查询参数。 Ref

当以上几点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

function myFunction() {
  // This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
  String.prototype.addQuery = function(obj) {
    return this + Object.keys(obj).reduce(function(p, e, i) {
      return p + (i == 0 ? "?" : "&") +
        (Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
          return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
        },"") : e + "=" + encodeURIComponent(obj[e]));
    },"");
  }

  var url = "https://api.trello.com/1/boards/57c68c1beaab4c676adfaeb1/lists";
  var query = {
    "key": "myTrelloKey",
    "token": "myTrelloToken",
  };
  var endpoint = url.addQuery(query);
  Logger.log(endpoint); // <--- https://api.trello.com/1/boards/57c68c1beaab4c676adfaeb1/lists?key=myTrelloKey&token=myTrelloToken

  var response = UrlFetchApp.fetch(endpoint, {"muteHttpExceptions" : true});
  Logger.log(response.getContentText());
}

参考文献: