Azure DevOps WIQL查询及脚本求助:批量清理7年旧工作项内容
解决Azure DevOps旧工作项清理的WIQL与脚本实现
第一步:修正WIQL查询
你当前的WIQL是筛选状态不等于Done的工作项,完全不符合需求。要筛选出「状态为Done且创建时间超过7年」的工作项,正确的WIQL应该这样写:
Select [System.Id] From WorkItems Where [State] = 'Done' And [System.CreatedDate] <= DateAdd(@Today, -7, 'Year')
解释下关键部分:
[System.CreatedDate]:工作项的创建日期字段DateAdd(@Today, -7, 'Year'):WIQL内置函数,计算当前日期往前推7年的时间点,筛选创建时间早于这个点的工作项
第二步:Google App Script完整实现
下面是可直接复用的脚本,分为「获取目标工作项ID」和「批量更新字段」两部分,记得替换成你的组织、项目和PAT信息:
1. 获取符合条件的工作项ID
function getOldDoneWorkItems() { const orgName = "你的组织名称"; const projectName = "你的项目名称"; const pat = "你的ADO个人访问令牌"; const encodedPat = Utilities.base64Encode(`${pat}:`); const wiqlQuery = `Select [System.Id] From WorkItems Where [State] = 'Done' And [System.CreatedDate] <= DateAdd(@Today, -7, 'Year')`; const url = `https://dev.azure.com/${orgName}/${projectName}/_apis/wit/wiql?api-version=7.1-preview.2`; const options = { method: "POST", headers: { "Authorization": `Basic ${encodedPat}`, "Content-Type": "application/json" }, payload: JSON.stringify({ query: wiqlQuery }) }; const response = UrlFetchApp.fetch(url, options); const result = JSON.parse(response.getContentText()); // 提取工作项ID列表返回 return result.workItems.map(item => item.id); }
2. 批量清除描述与验收标准
验收标准对应的系统字段是Microsoft.VSTS.Common.AcceptanceCriteria,描述是System.Description,用PATCH请求批量清空:
function clearWorkItemFields() { const orgName = "你的组织名称"; const projectName = "你的项目名称"; const pat = "你的ADO个人访问令牌"; const encodedPat = Utilities.base64Encode(`${pat}:`); const workItemIds = getOldDoneWorkItems(); if (workItemIds.length === 0) { console.log("没有符合条件的工作项需要处理"); return; } // 构造字段清空的更新规则 const updateRules = [ { op: "replace", path: "/fields/System.Description", value: "" }, { op: "replace", path: "/fields/Microsoft.VSTS.Common.AcceptanceCriteria", value: "" } ]; // ADO批量更新限制一次最多200个工作项,所以分批处理 const batchSize = 200; for (let i = 0; i < workItemIds.length; i += batchSize) { const batchIds = workItemIds.slice(i, i + batchSize); const batchUrl = `https://dev.azure.com/${orgName}/${projectName}/_apis/wit/workitemsbatch?api-version=7.1-preview.3`; const batchPayload = { ids: batchIds, update: updateRules }; const options = { method: "PATCH", headers: { "Authorization": `Basic ${encodedPat}`, "Content-Type": "application/json-patch+json" }, payload: JSON.stringify(batchPayload) }; try { UrlFetchApp.fetch(batchUrl, options); console.log(`成功处理${batchIds.length}个工作项`); } catch (e) { console.error(`处理失败:${e.message}`); } } }
关键注意事项
- PAT权限:你的个人访问令牌必须拥有「工作项的读取和写入」权限,否则会返回403错误
- 自定义字段检查:如果你的项目用了自定义的验收标准字段,需要替换成对应的字段引用名(可在ADO字段管理页面查看)
- 测试优先:先手动修改WIQL,只筛选少量旧工作项测试,确认无误后再全量执行
内容的提问来源于stack exchange,提问作者Harry Dhillon
相关产品推荐
相关产品推荐

