我确实尝试使用 Office.context.document.getSelectedDataAsync(),但我需要单击行才能从任务中获取数据。
我需要在不单击加载项项目中使用 Javascript 的情况下获取所有任务。
您可以在 MSDN 中找到针对 Office.Document 类描述的所有可用方法。
getTaskAsync
或 getTaskByIndexAsync
方法允许获取给定 taskId
的任务名称、WSS 任务 ID 和资源名称:
// Get data for the specified task.
function getTaskAsync() {
if (taskGuid != undefined) {
_projDoc.getTaskAsync(
taskGuid,
function (asyncResult) {
if (asyncResult.status === Office.AsyncResultStatus.Failed) {
logMethodError("getTaskAsync", asyncResult.error.name,
asyncResult.error.message);
} else {
var taskInfo = asyncResult.value;
var taskOutput = "Task name: " + taskInfo.taskName +
"\nGUID: " + taskGuid +
"\nWSS Id: " + taskInfo.wssTaskId +
"\nResourceNames: " + taskInfo.resourceNames;
text.value = taskOutput;
}
}
);
} else {
text.value = 'Task GUID not valid:\n' + taskGuid;
}
}
请参阅使用文本编辑器为 Microsoft Project 创建第一个任务窗格加载项了解更多信息。
我正在尝试,但是不知道为什么不存储在数组中,然后返回一个对象数组,其中包含我想要为每个任务选择的字段。 通过这个函数,我获取最大id来创建for循环并迭代所有任务,然后获取GUID来获取字段,所有这些都使用office.js,在控制台中显示检查for循环并成功获取值,问题正在存储数据并返回。
async function getMaxTaskIndex() {
const taskGuids = [];
let fieldValues = [];
let myObject = {};
const targetFields = [
Office.ProjectTaskFields.TaskGUID,
Office.ProjectTaskFields.ID,
Office.ProjectTaskFields.Name,
Office.ProjectTaskFields.Text29, //LIST OF PLAN BASELINE RISK ID´S
Office.ProjectTaskFields.Text30, //LIST OF MONITORING RISK ID´S
Office.ProjectTaskFields.BaselineStart,
Office.ProjectTaskFields.BaselineFinish,
Office.ProjectTaskFields.PercentComplete,
Office.ProjectTaskFields.Summary,
Office.ProjectTaskFields.Start,
Office.ProjectTaskFields.Finish,
Office.ProjectTaskFields.ActualStart,
Office.ProjectTaskFields.ActualFinish,
Office.ProjectTaskFields.Milestone,
];
const keyFields = [
"taskGUID",
"idTask",
"Name",
"Text29", //LIST OF PLAN BASELINE RISK ID´S
"Text30", //LIST OF MONITORING RISK ID´S
"BaselineStart",
"BaselineFinish",
"PercentComplete",
"Summary",
"Start",
"Finish",
"ActualStart",
"ActualFinish",
"Milestone",
];
let maxTaskIndex = 0;
Office.context.document.getMaxTaskIndexAsync(async function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
maxTaskIndex = result.value;
for (let index = 0; index <= maxTaskIndex; index++) {
Office.context.document.getTaskByIndexAsync(index, (result) => {
if (result.status === Office.AsyncResultStatus.Succeeded) {
taskGuids.push(result.value);
for (let i = 0; i <= targetFields.length; i++) {
// desde aca comienza el error actual ------------------------------------------------------------------
Office.context.document.getTaskFieldAsync(result.value, targetFields[i], (r) => {
if (r.status === Office.AsyncResultStatus.Succeeded) {
console.log(keyFields[i], r.value.fieldValue);
myObject[keyFields[i]] = r.value.fieldValue;
} else {
i--;
console.log(r.error);
}
});
}
fieldValues.push(myObject);
} else {
console.log(result.error);
}
return fieldValues;
});
}
// console.log(taskGuids);
} else {
console.log(result.error);
}
});
}