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

如何在Microsoft Project的VSTO插件中为任务添加员工多时段工时

解决Microsoft Project VSTO插件添加多时段工时的问题

你的代码问题在于:循环中反复修改同一个Assignment对象的Start、Finish和Work属性,每次修改都会覆盖之前的设置,最终只有最后一条日期的工时生效。要给任务-资源分配添加多日期分段的工时,需要使用TimeScaleData方法来逐段设置单日工时,而非修改分配的整体属性。

修正后的代码示例

Project project = Globals.ThisAddIn.Application.ActiveProject;
project.DefaultTaskType = PjTaskFixedType.pjFixedWork;

// 创建任务和资源
Task testTask = project.Tasks.Add("Test Task");
Resource resource = project.Resources.Add("Sridhar Netha");
// 仅添加一次资源分配(同一个资源对应同一个任务只需要一个Assignment)
Assignment newAssignment = testTask.Assignments.Add(ResourceID: resource.ID);

var entryDates = new List<EntryDate>()
{    
    new EntryDate{ DateEntered=DateTime.Parse("2023-09-05"), Hours=(decimal)2 },
    new EntryDate{ DateEntered=DateTime.Parse("2023-09-12"), Hours=(decimal)5 },
    new EntryDate{ DateEntered=DateTime.Parse("2023-09-19"), Hours=(decimal)4 }
};

foreach (EntryDate entryDate in entryDates)
{
    // 获取对应日期的时间刻度数据对象
    TimeScaleValues timeScaleValues = newAssignment.TimeScaleData(
        StartDate: entryDate.DateEntered,
        EndDate: entryDate.DateEntered,
        TimeScaleUnit: PjTimescaleUnit.pjTimescaleDays,
        Type: PjAssignmentTimescaleData.pjAssignmentTimescaleWork
    );
    
    // 设置当日工时:将小时转换为分钟(Project内部以分钟为单位存储工时)
    if (timeScaleValues.Count > 0)
    {
        timeScaleValues[1].Value = (double)entryDate.Hours * 60;
    }
}

关键说明

  • TimeScaleData方法用于获取分配在指定时间范围内的时间刻度数据,这里按天获取单日内的工时记录
  • Project内部工时以分钟为单位存储,所以需要将小时数乘以60转换为分钟后赋值
  • 同一个任务-资源分配只需要创建一次Assignment对象,通过TimeScaleData可以给这个分配添加多个日期的分段工时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:50:03