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

关于按分组列出任务及VSTO实现带完成占比的任务层级列表的问询

嗨Gilbert,针对你的两个问题,我来一步步给你解答:

一、按分组列出所有任务示例

假设你需要按「Group1(Text1维度)→ 子分组(Text2维度)」的层级来整理任务,这里给你一个具体的分组展示示例:

  • Group1:项目启动(Text1)
    • 子分组:需求调研(Text2)
      • 任务1:完成核心用户需求访谈
      • 任务2:输出需求规格说明书初稿
    • 子分组:项目规划(Text2)
      • 任务3:制定项目里程碑时间表
      • 任务4:确认跨部门资源分配方案
  • Group1:项目执行(Text1)
    • 子分组:功能开发(Text2)
      • 任务5:完成用户管理模块编码
      • 任务6:完成订单模块单元测试
    • 子分组:质量管控(Text2)
      • 任务7:执行系统集成测试
      • 任务8:修复测试阶段发现的优先级缺陷

你可以根据实际的Text1、Text2字段值,替换上面的分组名称和任务内容。

二、通过VSTO获取带层级结构与完成百分比的分组任务列表

完全可以实现!不管你是在Outlook任务还是Project中设置了分组,VSTO都能通过Office对象模型访问任务数据,提取层级结构和完成百分比。下面给你两种常见场景的实现代码:

场景1:Outlook任务分组

假设你的Group1对应Outlook任务的「类别」字段,Group2对应自定义字段「Text2」,代码示例如下:

using Outlook = Microsoft.Office.Interop.Outlook;

public void FetchOutlookGroupedTasks()
{
    // 初始化Outlook应用
    Outlook.Application outlookApp = new Outlook.Application();
    Outlook.Folder tasksFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks) as Outlook.Folder;

    // 按Group1(类别)排序,模拟分组逻辑
    Outlook.Items sortedTasks = tasksFolder.Items;
    sortedTasks.Sort("[Categories]", Outlook.OlSortOrder.olAscending);

    string currentGroup1 = string.Empty;
    string currentGroup2 = string.Empty;

    foreach (Outlook.TaskItem task in sortedTasks)
    {
        // 提取分组标识(根据你的实际分组字段替换)
        string group1 = task.Categories ?? "未分组";
        string group2 = task.UserProperties.Find("Text2")?.Value?.ToString() ?? "无子分组";

        // 输出层级结构
        if (group1 != currentGroup1)
        {
            currentGroup1 = group1;
            Console.WriteLine($"=== Group1: {group1} ===");
            currentGroup2 = string.Empty;
        }
        if (group2 != currentGroup2)
        {
            currentGroup2 = group2;
            Console.WriteLine($"  === 子分组(Text2): {group2} ===");
        }

        // 获取任务完成百分比
        double completionRate = task.PercentComplete;
        Console.WriteLine($"    任务名称: {task.Subject} | 完成百分比: {completionRate}%");
    }
}

场景2:Project任务分组

如果是在Microsoft Project中按Text1、Text2分组,代码会更直接,因为Project本身支持任务层级和自动计算完成率:

using Project = Microsoft.Office.Interop.MSProject;

public void FetchProjectGroupedTasks()
{
    Project.Application projectApp = new Project.Application();
    Project.Project activeProject = projectApp.ActiveProject;

    foreach (Project.Task task in activeProject.Tasks)
    {
        if (task == null) continue;

        // 获取任务层级(OutlineLevel对应分组的嵌套层级)
        int indentLevel = task.OutlineLevel;
        string indent = new string(' ', (indentLevel - 1) * 2);

        // 提取Group1和Group2的字段值
        string group1 = task.GetField(Project.PjField.pjTaskText1);
        string group2 = task.GetField(Project.PjField.pjTaskText2);

        // 完成百分比(摘要任务会自动汇总子任务完成率)
        double completionRate = task.PercentComplete;

        Console.WriteLine($"{indent}Group1: {group1} | Group2: {group2} | 任务: {task.Name} | 完成率: {completionRate}%");
    }
}

额外说明

  • 如果需要自定义计算分组的完成百分比(比如汇总子任务的完成率),可以遍历子任务集合(Outlook的TaskItem.ParentTask、Project的Task.OutlineChildren),自己编写逻辑计算。
  • 代码中的分组字段可以根据你实际设置的Text1、Text2对应字段替换,确保和你的分组配置一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:13:00