如何通过JIRA REST API获取指定月份的工作日志?
通过JIRA REST API获取指定月份工作日志的正确方法
你之前用GET /rest/api/3/worklog/updated加since参数不行,是因为这个接口的since是筛选工作日志被更新的时间,不是日志记录的开始时间,逻辑完全不对。要获取指定月份的工作日志,应该用JQL结合搜索接口来实现,以下是具体步骤和代码示例:
核心思路
- 用JQL筛选出工作日志开始时间落在目标月份的所有issue
- 调用搜索接口时扩展
worklog字段,同时指定需要的issue字段(key、summary) - 遍历返回结果,提取每个符合时间范围的工作日志的目标字段
具体实现(Google App Script)
步骤1:准备JQL语句
根据目标月份构造时间范围,注意时区要和你的JIRA实例一致(比如东八区用+0800):
# 示例:2024年5月的时间范围(精确到时分秒) worklogStarted >= "2024-05-01T00:00:00.000+0800" AND worklogStarted <= "2024-05-31T23:59:59.999+0800"
如果只需要日期匹配(不精确到时间),也可以用worklogDate字段:
worklogDate >= "2024-05-01" AND worklogDate <= "2024-05-31"
步骤2:Google App Script代码
function getJiraMonthlyWorklogs() { // 替换成你的JIRA信息 const jiraDomain = "your-jira-domain"; // 例如 "company.atlassian.net" const username = "your-email@domain.com"; const apiToken = "your-atlassian-api-token"; // 在Atlassian账户设置生成 // 替换成目标月份的时间范围 const targetStart = "2024-05-01T00:00:00.000+0800"; const targetEnd = "2024-05-31T23:59:59.999+0800"; // 构造请求URL const jql = `worklogStarted >= "${targetStart}" AND worklogStarted <= "${targetEnd}"`; const requestUrl = `https://${jiraDomain}/rest/api/3/search?jql=${encodeURIComponent(jql)}&fields=key,summary&expand=worklog`; // 请求配置 const requestOptions = { method: "GET", headers: { "Authorization": "Basic " + Utilities.base64Encode(`${username}:${apiToken}`), "Accept": "application/json" } }; try { // 发送请求并解析响应 const response = UrlFetchApp.fetch(requestUrl, requestOptions); const responseData = JSON.parse(response.getContentText()); const worklogResults = []; // 遍历每个issue,提取符合条件的工作日志 responseData.issues.forEach(issue => { issue.fields.worklog.worklogs.forEach(worklog => { const logStart = new Date(worklog.started); // 二次校验时间范围(避免JQL返回包含其他时间日志的issue) if (logStart >= new Date(targetStart) && logStart <= new Date(targetEnd)) { worklogResults.push({ issueKey: issue.key, summary: issue.fields.summary, timeSpent: worklog.timeSpent, startDateTime: worklog.started, comments: worklog.comment ? worklog.comment.body : "" }); } }); }); // 输出结果到控制台,或写入Google Sheet console.log("获取到的工作日志:", worklogResults); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 写入表头 sheet.getRange(1, 1, 1, 5).setValues([["IssueKey", "Summary", "TimeSpent", "StartDateTime", "Comments"]]); // 写入数据 sheet.getRange(2, 1, worklogResults.length, 5).setValues( worklogResults.map(item => [item.issueKey, item.summary, item.timeSpent, item.startDateTime, item.comments]) ); } catch (error) { console.error("请求失败:", error.message); } }
注意事项
- 分页处理:如果结果超过默认的50条,需要循环调用接口,每次递增
startAt参数(比如startAt=50、startAt=100),直到total字段等于已获取的条目数 - 权限验证:确保你的JIRA账户有访问目标issue和工作日志的权限,API token需要在Atlassian账户的安全设置中生成
- 评论格式:如果工作日志的评论是富文本格式,
worklog.comment.body会包含HTML标签,需要的话可以用正则替换掉标签提取纯文本 - 时区一致性:JQL中的时间时区必须和JIRA实例的时区一致,否则会出现筛选偏差
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

