使用CSOM,我可以了解如何使用SetCustomFieldValue方法更新与项目关联的自定义字段,但对于Project Online中的任务,是否不可能这样做?我没有看到任何允许这样做的东西,但它确实在文档中列出了这应该是可能的。
谢谢!
你看过这个线程吗?使用CSOM更新项目的自定义字段
这是项目级别的,但它可能会提供一些进一步的线索。事实上,这篇文章的底部有任务级别的代码,所以希望这就是你所需要的。
我也在寻找更新任务级自定义字段的方法,但找不到解决方案。出于这个原因和其他一些原因,我决定通过实现projectdrilldown扩展来实现这一点。这意味着直接在项目网格中更新值,并让项目服务器完成其余的内部处理:
_grid=window.projectDrilldownComponent.get_GridSatellite(); // get the grid
// Update the datavalue of a column (taskfield)
_grid.WriteDataValueByKey(...)
// Update the localizedvalue of a column (taskfield)
_grid.WriteLocalizedValueByKey(rec_key, fieldkey, fieldvalue,
function () {
console.log("Post Update task:" + rec_key);
cbSuccess(); // callback after update });
我可以给您举一个JSOM示例来实现这一点:
var projContext = PS.ProjectContext.get_current();
var projects = projContext.get_projects();
var project = projects.getByGuid(projUid).get_draft();
var tasks = project.get_tasks();
var task = tasks.getByGuid(taskUid);
task.set_item(cfIntName, newValue);
var queueJob = project.update();
projContext.waitForQueueAsync(queueJob, 60,
Function.createDelegate(this, function(res) {
// Publish project here
}), function(error) {
console.error(error);
});
这应该是完整的(尽管我从脚本中提取了它,所以检查我截断的成功/失败处理程序)
从CSOM中的内存来看,没有"set_item(cf,val)"辅助方法可供使用,但它是类似的,我认为该属性是通过索引器在对象实例上设置的,例如:
(sudo c#代码)
var draftTask = [get task instance];
draftTask[cfInternalName] = "Some value";
等等。
如果这没有帮助,那么您可以始终反映ProjectServer.Client.DLL,并且您将看到未公开的"SetCustomFieldValue"的内部实现。
希望这能帮助到别人。