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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:45:40