Zoho Projects自动化:状态变更时自动创建依赖任务

在 Zoho Projects 中,您可以设置当任务状态更新时自动创建并分配依赖任务。这有助于团队保持步调一致,确保审核按时完成,并减少人工操作。

本文将介绍如何使用 Deluge 脚本编写的自定义函数轻松完成设置。

用例

例如,当审计员安排一项需要合规性审核的任务时,一旦任务状态从"已安排"更新,系统将自动创建一个依赖任务并将其分配给合规团队。所有相关附件都会自动同步,确保审计员和审核员能够全面了解任务内容,无需手动协调即可继续进行。

要配置此流程,请执行以下操作:

  1. 导航至页面右上角,点击 → 开发者空间 → 连接 → 使用以下范围创建连接:
  • ZohoProjects.portals.READ

  • ZohoProjects.portals.ALL

  • ZohoProjects.projects.READ

  • ZohoProjects.tasks.CREATE

  • ZohoProjects.tasks.UPDATE

  • ZohoProjects.tasks.READ

  • WorkDrive.workspace.ALL

  • WorkDrive.files.ALL

  • ZohoProjects.documents.READ

  • ZohoProjects.documents.CREATE

  1. 导航至 → 开发者空间 → 自定义函数。在"任务"选项卡下,创建一个新的自定义函数,并添加以下 Deluge 脚本。

请确保门户 URL 与您的数据中心一致。否则,该功能可能无法按预期执行。此外,请确保指定的团队已关联到该项目;否则,任务分配将失败。

// TODO : Replace Dependency Type here with "FS, SS, SF, FF"

  1. // scopes: ZohoProjects.portals.READ, ZohoProjects.portals.CREATE, ZohoProjects.projects.READ, ZohoProjects.tasks.CREATE, ZohoProjects.tasks.UPDATE, ZohoProjects.tasks.READ, WorkDrive.workspace.ALL, WorkDrive.files.ALL, ZohoProjects.documents.READ, ZohoProjects.documents.CREATE.

  2. // get team id

  3. endPoint = "https://projects.zoho.in/restapi/portal/";

  4. endPointV3 = "https://projects.zoho.in/api/v3/portal/";

  5. getTaskStatusTimeline = invokeurl

  6. [

  7. url :endPointV3 + portalId + "/projects/" + projectId + "/tasks/" + taskId + "/status-timeline"

  8. type :GET

  9. connection:"connectionprojects"

  10. ];

  11. size = getTaskStatusTimeline.size() - 1;

  12. oldStatusName = getTaskStatusTimeline.get(size).get("previous_status").get("name");

  13. if(oldStatusName.containsIgnoreCase("Scheduled"))

  14. {

  15. teamName = "Compliance Team";

  16. userGroupsResponse = invokeurl

  17. [

  18. url :endPoint + portalId + "/projects/" + projectId + "/usergroups/"

  19. type :GET

  20. connection:"connectionprojects"

  21. ];

  22. teams = userGroupsResponse.get("userGroups");

  23. for each team in teams

  24. {

  25. if(team.get("groupObj").get("group_name").containsIgnoreCase(teamName))

  26. {

  27. teamId = team.get("groupObj").get("group_id");

  28. }

  29. }

  30. teamIds = List();

  31. teamIds.add(teamId);

  32. dependencyType = "FS";

  33. //Create Tasks parameters

  34. values_map = Map();

  35. values_map.put("name","Compliance Audit Verification");

  36. values_map.put("description"," Review task created for the Security and Compliance team to validate requirements, assess risks, and confirm adherence to defined standards. Attachments from the originating task are included for reference.");

  37. values_map.put("associated_teams",teamIds);

  38. //Invoke Create Task

  39. createTaskResponse = zoho.projects.create(portalId,projectId,"tasks",values_map,"connectionprojects");

  40. // Get TaskId From Task response

  41. if(createTaskResponse != null && createTaskResponse.get("tasks") != null)

  42. {

  43. taskInfo = createTaskResponse.get("tasks").get(0);

  44. newTaskId = taskInfo.get("id_string");

  45. // copy attachments to new task

  46. getAttachmentsResponse = invokeurl

  47. [

  48. url :endPointV3 + portalId + "/projects/" + projectId + "/attachments?entity_type=task&entity_id=" + taskId

  49. type :GET

  50. connection:"connectionprojects"

  51. ];

  52. if(getAttachmentsResponse.get("attachment").size() > 0)

  53. {

  54. taskAttachments = getAttachmentsResponse.get("attachment");

  55. for each attachment in taskAttachments

  56. {

  57. associateParam = Map();

  58. associateParam.put("entity_type","task");

  59. associateParam.put("entity_id",newTaskId);

  60. associateToTaskComment = invokeurl

  61. [

  62. url :endPointV3 + portalId + "/projects/" + projectId + "/attachments/" + attachment.get("attachment_id")

  63. type :POST

  64. parameters:associateParam

  65. connection:"connectionprojects"

  66. ];

  67. }

  68. }

  69. //Add Dependancy Between Tasks Parameter

  70. dependencyParam = Map();

  71. dependencyParam.put("taskid",newTaskId);

  72. dependencyParam.put("predids",taskId);

  73. dependencyParam.put("projId",projectId);

  74. dependencyParam.put("toupdate","dependencyset");

  75. dependencyParam.put("childprojId",projectId);

  76. dependencyParam.put("dependencytype",dependencyType);

  77. // invoke task dependency Api

  78. dependency = invokeurl

  79. [

  80. url :endPoint + portalId + "/projects/" + projectId + "/taskdependency/"

  81. type :POST

  82. parameters:dependencyParam

  83. connection:"connectionprojects"

  84. ];

  85. info dependency;

  86. info "-------------------------------------";

  87. }

  88. }

  89. return "success";

根据需要自定义第 36 行和第 37 行中的任务名称和描述,然后保存函数。

将 Deluge 文件中第 10、21、51 和 84 行中的"connectionprojects"替换为您的 Zoho Projects 连接名称。

  1. 配置时添加以下参数。

    完成参数映射后,保存函数并在提示时输入任务 ID。此自定义函数将在问题状态从"已安排"更改为其他状态时自动执行,并根据工作流规则创建依赖任务。

  2. 保存自定义函数后,导航至 → 自动化 → 工作流规则 → 项目选项卡 → 新建工作流规则,并使用以下设置。

  3. 配置工作流,使其在任务更新时根据用户操作触发,并将自定义函数关联起来,以便在状态更改时自动执行。

有了这种自动化机制,任务会自动触发,依赖关系会自动分配,支持附件也会自动传输,从而确保无需人工干预即可完成交接。

相关推荐
有想法的py工程师9 分钟前
PostgreSQL 字符集双重转义击穿 磁盘 I/O
数据库·postgresql
头发还在的女程序员14 分钟前
【无标题】
网络·数据库·短剧小程序·短剧系统·海外短剧·短剧后台
千千寰宇16 分钟前
[数据库系统] 数据库系统的设计原理研究
数据结构·数据库·database-opengemini/influxdb·database-dament/达梦
麦壳饼32 分钟前
SonnetDB SQL 分页查询:LIMIT/OFFSET 与 FETCH 语法
数据库·sonnetdb
是jin奥36 分钟前
Ubuntu 访问 Windows 共享目录
linux·运维·ubuntu
Gauss松鼠会37 分钟前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结
星恒随风1 小时前
Linux基础IO万字详解:从文件描述符fd到重定向、FILE缓冲机制及MiniShell升级
linux·运维·笔记·学习·状态模式
l1t1 小时前
DeepSeek总结的PostgreSQL因选择而宽松,因偶然而永久
数据库·postgresql
Nturmoils1 小时前
数据同步中断后,KFS 怎么把链路接回来
数据库
yunwei371 小时前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化