0

提前为这个冗长的问题道歉。我正在尝试创建一个 Google 表格,告诉我每个承包商每个月登录 Clockify 的小时数。(完整代码在底部)

简而言之,我的问题是使用来自谷歌表的输入为对 Clockify API 的 UrlFetchApp.fetch() 请求创建 JSON 文件。

我希望 JSON 看起来像这样:

var newJSON = {
        "dateRangeStart": "2022-01-01T00:00:00.000",
        "dateRangeEnd": "2022-01-31T23:59:59.000",
        "summaryFilter": {
          "groups": ["USER"],
          "sortColumn": "GROUP"
        }
      }
var payload = JSON.stringify (newJSON);

当我使用此代码时,它可以完美运行。但是,开始日期和结束日期是我在 google 表格中计算的变量,因为我需要每个月更改这些日期。我写了一个函数,它给了我正确的输出(“2022-01-01T00:00:00.000”,“2022-01-31T23:59:59.000”),但是当我引用谷歌表格中的单元格时,我得到一个 400错误提示 API 无法解析 JSON。

脚本中的功能:

function GetHours(userName, startDate, endDate) {

  var newJSON = {
        "dateRangeStart": startDate,
        "dateRangeEnd": endDate,
        "summaryFilter": {
          "groups": ["USER"],
          "sortColumn": "GROUP"
        }
      }

  var payload = JSON.stringify (newJSON); 
...}

在工作表中调用函数:

=GetHours(C3,$D$45,$D$46)

输出错误信息:

例外:对https://reports.api.clockify.me的请求失败,返回代码 400。截断的服务器响应:{"code":400,"message":"generateSummaryReport.arg1.dateRangeEnd: 字段 dateRangeEnd 是必需的,generateSummaryReport.arg1 .dateRangeStart: Field da...(使用 muteHttpExceptions 选项检查完整响应)

当我使用 Logger.log(payload) 时发生了一件奇怪的事情,这可能是问题的根源。看起来代码运行了两次,第一次有效载荷 JSON 是正确的,但第二次是不正确的。

第一次: {​​"dateRangeStart":"2022-01-01T00:00:00.000","dateRangeEnd":"2022-01-31T23:59:59.000","summaryFilter":{"groups":["USER"] ,"sortColumn":"GROUP"}}

第二次: {"summaryFilter":{"groups":["USER"],"sortColumn":"GROUP"}}

我尝试了很多解决方案,但实际上归结为在 JSON 中引用 Google 工作表。当我将日期计算的输出复制并粘贴到 JSON 中时,它可以工作。当我使用日期计算输出在脚本中创建变量时,它可以工作。当我返回 startDate 时,它​​给了我“2022-01-01T00:00:00.000”,这是正确的。我只是不明白出了什么问题。谢谢你的帮助!

完整代码:

const APIbase = "https://api.clockify.me/api/v1"
const APIreportsbase = "https://reports.api.clockify.me/v1"
const myAPIkey =  "[HIDDEN FOR PRIVACY]"
const myWorkspaceID = "[HIDDEN FOR PRIVACY]"

function GetHours(userName, startDate, endDate) {

  var newJSON = {
        "dateRangeStart": startDate,
        "dateRangeEnd": endDate,
        "summaryFilter": {
          "groups": [
            "USER"
          ],
          "sortColumn": "GROUP"
        }
      }

var payload = JSON.stringify (newJSON);
  var headers = {"X-Api-Key" : myAPIkey, "content-type" : "application/json"};
  var url = APIreportsbase + '/workspaces/' + myWorkspaceID + '/reports/summary'

  var options = {
    "method": "post",
    "contentType": "application/json",
    "headers": headers,
    "payload": payload,
    "muteHttpExceptions" : false
  };


  var response = UrlFetchApp.fetch(url, options)
  var json = response.getContentText();
  var data = JSON.parse(json);
  var people = data.groupOne;


  for (let i = 0; i < people.length; i++) {

    if (people[i].name == userName) {

      if (people[i].duration == 0) {
        return 0;
      } else {
        return people[i].duration/3600;
      }
   } 
  }
}

GetHours();
4

1 回答 1

1

我通过添加过滤器使程序正常工作,以便程序第二次运行时,它不会影响返回值。

if (startDate != null) {
  var response = UrlFetchApp.fetch(url, options)
  var json = response.getContentText();
  .....
}
于 2022-01-09T22:28:45.550 回答