You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lockify API无法提取全年数据,请求协助排查代码问题

无法通过Clockify API提取全年数据的排查与修复

问题分析

你使用Clockify API(注:原文误写为Lockify)两年,此前正常提取数据,近期无法获取2023全年数据,对比官方导出确认问题出在代码中。结合你提供的VBA代码,核心问题大概率是分页限制未处理,其次可能存在时区格式不明确的问题。

代码问题点拆解

  1. 分页覆盖不全:你的请求仅指定page:1和pageSize:1000,若全年数据条目超过1000条,只会返回第一页数据,无法获取全部内容。
  2. 时区模糊:请求中的日期未标注UTC时区(Z后缀),Clockify默认使用UTC时间,可能导致实际日期范围与预期不符(比如本地时区与UTC的偏差会截断部分数据)。
  3. 缺少响应校验:代码未检查API响应状态、错误信息及总数据量,无法快速定位问题。

修复方案

1. 先排查API响应状态与数据总量

先添加代码获取API返回内容,确认是否有错误提示及总数据量:

Dim httpCaller As MSXML2.XMLHTTP60, body As String
Dim responseText As String

Set httpCaller = New MSXML2.XMLHTTP60

body = "{\"dateRangeStart\": \"2023-01-01T00:00:00.000Z\", " & vbLf & _
       " \"dateRangeEnd\": \"2023-12-31T23:59:59.000Z\", " & vbLf & _
       " \"detailedFilter\": {\"page\": 1,\"pageSize\": 1000}} "

httpCaller.Open "POST", "https://reports.api.clockify.me/v1/workspaces/你的工作区ID/reports/detailed"
httpCaller.setRequestHeader "X-Api-Key", "你的API密钥"
httpCaller.setRequestHeader "Content-Type", "application/json"
httpCaller.send body

' 打印响应信息用于排查
responseText = httpCaller.responseText
Debug.Print "响应状态: " & httpCaller.Status & " " & httpCaller.statusText
Debug.Print "响应内容: " & responseText

执行后查看立即窗口,若返回total字段大于1000,说明需要分页获取;若有错误信息,根据提示调整参数。

2. 分页获取全部数据

若数据总量超过1000条,需循环请求每一页。以下是完整修复代码(需提前导入VBA-JSON库用于解析JSON):

Dim httpCaller As MSXML2.XMLHTTP60
Dim body As String, responseText As String
Dim jsonResp As Object
Dim totalCount As Long, totalPages As Long, currentPage As Long
Dim ws As Worksheet
Dim rowNum As Long, entry As Object

Set httpCaller = New MSXML2.XMLHTTP60
Set ws = ThisWorkbook.Sheets("数据导出") ' 替换为你的工作表名
rowNum = 2 ' 表头行设为1,数据从第2行开始

' 初始化请求,获取总数据量
currentPage = 1
body = "{""dateRangeStart"": ""2023-01-01T00:00:00.000Z"", " & _
       """dateRangeEnd"": ""2023-12-31T23:59:59.000Z"", " & _
       """detailedFilter"": {""page"": " & currentPage & ", ""pageSize"": 1000}}"

With httpCaller
    .Open "POST", "https://reports.api.clockify.me/v1/workspaces/你的工作区ID/reports/detailed"
    .setRequestHeader "X-Api-Key", "你的API密钥"
    .setRequestHeader "Content-Type", "application/json"
    .send body
End With

' 解析总数据量
Set jsonResp = JsonConverter.ParseJson(httpCaller.responseText)
totalCount = jsonResp("total")
totalPages = WorksheetFunction.Ceiling(totalCount / 1000, 1)

' 循环获取所有分页数据
For currentPage = 1 To totalPages
    body = "{""dateRangeStart"": ""2023-01-01T00:00:00.000Z"", " & _
           """dateRangeEnd"": ""2023-12-31T23:59:59.000Z"", " & _
           """detailedFilter"": {""page"": " & currentPage & ", ""pageSize"": 1000}}"
    
    With httpCaller
        .Open "POST", "https://reports.api.clockify.me/v1/workspaces/你的工作区ID/reports/detailed"
        .setRequestHeader "X-Api-Key", "你的API密钥"
        .setRequestHeader "Content-Type", "application/json"
        .send body
    End With
    
    ' 解析当前页数据并写入工作表
    Set jsonResp = JsonConverter.ParseJson(httpCaller.responseText)
    For Each entry In jsonResp("timeentries")
        ws.Cells(rowNum, 1).Value = entry("description")
        ws.Cells(rowNum, 2).Value = entry("timeInterval")("start")
        ws.Cells(rowNum, 3).Value = entry("timeInterval")("end")
        ws.Cells(rowNum, 4).Value = entry("duration")
        rowNum = rowNum + 1
    Next entry
Next currentPage

MsgBox "数据导出完成,共获取 " & totalCount & " 条记录"

关键调整说明

  • 日期添加Z后缀:明确使用UTC时间,确保日期范围完全覆盖2023全年
  • 循环分页:根据total字段计算总页数,逐页请求并合并数据
  • 数据写入:示例中将时间条目写入工作表,可根据需求调整字段

内容的提问来源于stack exchange,提问作者Spark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:03:10