【问题标题】:Using my personal clickup token to make a clickup api call from Google Apps Script使用我的个人 clickup 令牌从 Google Apps 脚本进行 clickup api 调用
【发布时间】:2021-01-19 14:07:53
【问题描述】:
function getClickupTeam() {
  let response = UrlFetchApp.fetch(clickupUrl + "team", {
    "method": "GET",
    "Authorization": clickupToken,
    "muteHttpExceptions": true
  })
  Logger.log(response)
  let json = JSON.parse(response);
  Logger.log(json);
}

此 URLFetchApp 调用返回 {ECODE=OAUTH_017, err=Authorization header required},即使我在请求中包含了我的个人点击令牌。我错过了什么吗?任何帮助将不胜感激。

【问题讨论】:

  • 您确认您的令牌凭据正确吗?
  • 是的,我不确定是否应该在我的个人令牌中包含另一个标有令牌的标头,或者它是否应该是“授权”字段中记录的值。但它是正确的。
  • 我会尝试这样做,因为它在错误消息中指定了“标题”
  • 那行不通。我不确定所需的确切语法,但我在 clickup api 文档中找不到任何内容,并且一些变体都给出了相同的错误代码。

标签: google-apps-script get urlfetch clickup-api


【解决方案1】:

看起来您的请求格式不正确(请务必查看UrlFetchApp.fetch(url, params) 方法的参考文档。)Authorization 标头应位于显式headers 对象中。另外,您不需要将方法设置为GET,因为它是默认值。

发出POST 请求时要记住的其他事项 - Google Apps 脚本有一个有趣的怪癖,您必须使用contentType 属性定义Content-Type 标头。如果您尝试在 headers 对象中设置该标头,则默认情况下会被覆盖(application/x-www-form-urlencoded 我相信)。

以下是您设置GET 请求的方式:

function getClickupTeam() {
    let response = UrlFetchApp.fetch(clickupUrl + "team", {
        "muteHttpExceptions": true,
        "headers": {
            "Authorization": clickupToken
        }
    }
    
    console.log(response.getContentText());
    let json = JSON.parse(response.getContentText());
    
    console.log(json);
   
);

对于带有 JSON 有效负载的 POST 请求,您可以执行以下操作:

function getClickupTeam() {
    let response = UrlFetchApp.fetch(clickupUrl + "team", {
        "method": "POST",
        "contentType": "application/json",
        "muteHttpExceptions": true,
        "headers": {
            "Authorization": clickupToken
        },
        "payload": JSON.stringify({
            "key": "value"
        });
    }
    
    console.log(response.getContentText());
    let json = JSON.parse(response.getContentText());
    
    console.log(json);
   
);

【讨论】:

    【解决方案2】:

    在通过https://clickup.com/api 对该主题进行一些研究时,我偶然发现了一些代码。对于不同的事情有几个不同的,我推荐第一个,JavaScript(因为这是最接近你当前所做的事情)。在评论中你说它是用于编辑任务,所以这就是这段代码的目的。

    javascript

    var request = new XMLHttpRequest();
    
    request.open('PUT', 'https://api.clickup.com/api/v1/task/{task_id}');
    
    request.setRequestHeader('Content-Type', 'application/json');
    request.setRequestHeader('Authorization', '"access_token"');
    
    request.onreadystatechange = function () {
      if (this.readyState === 4) {
        console.log('Status:', this.status);
        console.log('Headers:', this.getAllResponseHeaders());
        console.log('Body:', this.responseText);
      }
    };
    
    var body = {
      'name': 'New Task Name',
      'content': 'New Task Content',
      'assignees': {
        'add': [
          1
        ],
        'rem': [
          2
        ]
      },
      'status': 'Closed',
      'priority': 3,
      'due_date': '1508369194377'
    };
    
    request.send(JSON.stringify(body));
    

    卷曲

    curl --include \
         --request PUT \
         --header "Content-Type: application/json" \
         --header "Authorization: "access_token"" \
         --data-binary "{
        \"name\": \"New Task Name\",
        \"content\": \"New Task Content\",
        \"assignees\": {
            \"add\" : [
                1
            ],
            \"rem\" : [
                2
            ]
        },
        \"status\": \"Closed\",
        \"priority\": 3,
        \"due_date\": \"1508369194377\"
    }" \
    'https://api.clickup.com/api/v1/task/{task_id}'
    

    node.js

    var request = require('request');
    
    request({
      method: 'PUT',
      url: 'https://api.clickup.com/api/v1/task/{task_id}',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': '\'access_token\''
      },
      body: "{  \"name\": \"New Task Name\",  \"content\": \"New Task Content\",  \"assignees\": {    \"add\": [      1    ],    \"rem\": [      2    ]  },  \"status\": \"Closed\",  \"priority\": 3,  \"due_date\": \"1508369194377\"}"
    }, function (error, response, body) {
      console.log('Status:', response.statusCode);
      console.log('Headers:', JSON.stringify(response.headers));
      console.log('Response:', body);
    });
    

    这是针对生产的,如果您需要 mock serverdebugging proxy,请告诉我

    【讨论】:

    • 我也在网上找到了这个,但它对我没有帮助,因为 XMLHttpRequest 在 GAS 上不可用。这也适用于已弃用的 v1 api。
    • 我必须说我不知道​​还有什么可以尝试的,您确定方法是 get not post?
    • 你试过 Curl 了吗?
    • 不幸的是,Google 应用程序脚本不支持 curl。我最终可能只是在 node.js 应用程序中编写它并将其托管在某个地方。
    • 感谢您的帮助,我加了您的答案。我目前正在与 clickup 的支持团队合作。如果他们能够帮助我,我会回答我自己的问题。
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多