news 2026/7/7 9:02:24

项目管理中如何项目完成后自动关闭所有任务?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
项目管理中如何项目完成后自动关闭所有任务?

当项目被标记为“已完成”时,可能仍然存在一些未完成的任务,例如未标记为已完成的重复任务、不再相关的任务或项目结束后不再需要关注的任务。

为了确保项目反映其最终状态,您可以使用任务工作流程规则,在项目达到“已完成”状态后自动关闭所有未完成的任务。

要进行此设置,请执行以下步骤:

首先,使用以下权限范围创建与 Zoho Projects 的连接:

ZohoProjects.tasks.ALL

ZohoProjects.projects.READ

ZohoProjects.portals.READ

ZohoProjects.milestones.ALL

创建一个自定义函数并添加以下 Deluge 脚本。将“xxxxxxxxx”替换为您的 Zoho Projects 连接名称,并映射下面列出的参数。

  1. 以下脚本将删除任务重复项并关闭项目中的所有任务。在以下脚本中,连接名称为“closealltasks”。

    / TODO: Please create a connection for the Zoho Projects service with the scopes "ZohoProjects.tasks.ALL, ZohoProjects.projects.READ, ZohoProjects.portals.READ, ZohoProjects.milestones.ALL". Replace 'xxxxxxxxx' with the connection name. Click this link below to learn how to create the connection.

  2. // Link - https://help.zoho.com/portal/en/kb/projects/integration/connections/articles/connections-23-5-2022#How_to_establish_a_Connection

  3. // TODO: Replace the status name (Closed status type) in Line No. 6, if needed.

  4. projectsAPIEndPoint = "https://projectsapi.zoho.com/restapi";

  5. projectsv3APIEndPoint = "https://projectsapi.zoho.com/api/v3";

  6. statusName = "Closed";

  7. statusId = null;

  8. /* Close all tasks */

  9. //Fetch task layouts

  10. taskLayoutDetails = invokeurl

  11. [

  12. url :projectsAPIEndPoint + "/portal/" + portalId + "/projects/" + projectId + "/tasklayouts"

  13. type :GET

  14. connection:"closealltasks"

  15. ];

  16. // info taskLayoutDetails;

  17. if(taskLayoutDetails != null && taskLayoutDetails.get("status_details") != null)

  18. {

  19. statusDetails = taskLayoutDetails.get("status_details");

  20. for each status in statusDetails

  21. {

  22. if(status.get("name").equalsIgnoreCase(statusName))

  23. {

  24. // Fetch task status id based on status name

  25. statusId = status.get("id");

  26. info status.get("name") + " : " + statusId;

  27. break;

  28. }

  29. }

  30. }

  31. if(statusId != null)

  32. {

  33. indexValue = 1;

  34. rangeValue = 100;

  35. loop = {1,2,3,4,5,6,7,8,9,10};

  36. predStatusMap = Map();

  37. // This loop fetches up to 300 tasks. Increase the count as needed, e.g., loop = {1,2,3,4,5}; to fetch 500 tasks.

  38. for each i in loop

  39. {

  40. taskParameter = Map();

  41. taskParameter.put("index",indexValue);

  42. taskParameter.put("range",rangeValue);

  43. taskParameter.put("status","notcompleted");

  44. // info taskParameter;

  45. taskResponse = zoho.projects.getRecords(portalId,projectId,"tasks",taskParameter,0,"closealltasks");

  46. // info taskResponse;

  47. if(taskResponse.containKey("tasks"))

  48. {

  49. taskIds = list();

  50. for each task in taskResponse.get("tasks")

  51. {

  52. taskId = task.get("id");

  53. if(task.get("is_recurrence_set"))

  54. {

  55. updateTaskParameter = Map();

  56. updateTaskParameter.put("json_string",{"recurrence":{"recurring_frequency":"none","time_span":"1","number_of_occurrences":"2","is_comments_recurred":false,"recurrence_type":"after_current_task_completed"}});

  57. updateTaskResponse = zoho.projects.update(portalId,projectId,"tasks",taskId,updateTaskParameter,"closealltasks");

  58. info updateTaskResponse;

  59. }

  60. if(task.containsKey("dependency") && task.get("dependency").containsKey("predecessor"))

  61. {

  62. predTasks = task.get("dependency").get("predecessor");

  63. predList = list();

  64. for each predTaskId in predTasks

  65. {

  66. predList.add(task.get("dependency").get("dependencyDetails").get(predTaskId).get("IS_COMPLETED"));

  67. }

  68. if(!predList.contains(false))

  69. {

  70. taskIds.add(taskId);

  71. }

  72. }

  73. else

  74. {

  75. taskIds.add(taskId);

  76. }

  77. info "taskIds : " + taskIds;

  78. }

  79. bulkUpdateParams = Map();

  80. bulkUpdateParams.put("taskids",taskIds.toText().remove("[").remove("]"));

  81. bulkUpdateParams.put("status",{"id":statusId});

  82. info bulkUpdateParams;

  83. /* Bulk update */

  84. taskBulkUpdate = invokeurl

  85. [

  86. url :projectsv3APIEndPoint + "/portal/" + portalId + "/projects/" + projectId + "/tasks/bulk-update"

  87. type :PATCH

  88. parameters:bulkUpdateParams.toString()

  89. connection:"closealltasks"

  90. ];

  91. info taskBulkUpdate;

  92. }

  93. else

  94. {

  95. break;

  96. }

  97. }

  98. }

  99. return "success";

参数映射:

  1. portalId - Portal System ID

  2. projectId - Project System ID

保存自定义函数后,创建一个工作流程规则,并进行以下设置:

规则保存后,每当项目被标记为“已完成”时,所有未完成的任务都会自动完成。这确保项目能够准确反映其真实的完成状态,避免手动清理,并使您的项目保持最新状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 15:38:44

高效量子电路设计秘籍(R驱动的3种前沿优化策略)

第一章:高效量子电路设计的R语言赋能在传统认知中,R语言主要用于统计分析与数据可视化,然而其在复杂系统建模中的潜力正逐步被挖掘。近年来,随着量子计算研究的深入,研究人员开始探索使用R语言辅助量子电路的设计与仿真…

作者头像 李华
网站建设 2026/7/6 21:04:02

分分钟带你杀入Kaggle Top 1%,大牛带队,100%拿牌!

Kaggle是业界普遍承认的竞赛平台,能从Kaggle上的一些高质量竞赛获取好名次,是对自己实力极好的证明,还能给自己的履历添上光辉的一笔。如果能获得金牌,杀入奖金池,那更是名利兼收。尤其是对于正在学习或者想要留学申请…

作者头像 李华
网站建设 2026/7/7 8:11:11

IP6808至为芯支持PD快充输入的15W无线充电方案SOC芯片

英集芯IP6808是一款用于无线充电底座、智能家居、车载无线充电的无线充电发射端控制SOC芯片、兼容WPC Qi v1.2.4最新标准,支持5W基础充电、苹果7.5W协议、三星10W快充以及EPP 15W增强功率模式。通过analog ping技术自动识别设备类型,实现“一板多用”。支…

作者头像 李华
网站建设 2026/7/3 20:31:24

大型地源热泵机组多高

大型地源热泵机组高度解析:从选型到安装的完整指南在规划地源热泵系统时,机组高度是工程设计中必须考虑的关键参数。作为地源热泵技术领先企业,瑞冬集团凭借在地源热泵领域的技术积淀,为您详细解析大型地源热泵机组的高度特性及其…

作者头像 李华
网站建设 2026/7/2 22:48:26

别墅供暖地源热泵

别墅供暖地源热泵:节能环保的理想选择随着人们对居住舒适度和节能环保要求的不断提高,别墅供暖系统的选择成为业主关注的重点。地源热泵作为一种高效、环保的供暖方式,正逐渐成为别墅供暖的首选方案。地源热泵系统的工作原理地源热泵系统通过…

作者头像 李华