Power of Automation: Automatically notify project owners via email when a project is overdue.
Hello Everyone,
A Custom Function is a user-written set of code to achieve a specific requirement. Set the required conditions needed as to when to trigger using the Workflow rules (be it Tasks / Project) and associate the custom function to it.
Requirement:-
One of our customers wants an automatic email to be triggered to the respective project owner when a project becomes overdue. Specifically for those projects that were due yesterday. This has been implemented using the Schedule functions in Zoho Projects.
Below is the custom function code for reference.
Custom function code:-
endPoint = "https://projects.zoho.com/restapi/portal/";
endPointV3 = "https://projects.zoho.com/api/v3/portal/";
projectOwnerEmailIds = List();
projectNames = List();
// get all project layouts
getAllLayoutsResponse = invokeurl
[
url :endPoint + portalId + "/module/projects/layouts/"
type :GET
connection:"XXXXXXX"
];
layoutId = getAllLayoutsResponse.get("layout").get(0).get("layout_id");
// get project layout details
getAllProjectFieldsResponse = invokeurl
[
url :endPoint + portalId + "/module/projects/layouts/" + layoutId + "/"
type :GET
connection:"XXXXXXX"
];
customFields = getAllProjectFieldsResponse.get("custom_fields");
for each customField in customFields
{
if(customField.get("column_name").containsIgnoreCase("END_DATE"))
{
endDateId = customField.get("cfid");
break;
}
}
// get all custom Views
getAllCustomViewResponse = invokeurl
[
url :endPoint + portalId + "/module/projects/customview/"
type :GET
connection:"XXXXXXX"
];
customViews = getAllCustomViewResponse.get("default_views");
for each customView in customViews
{
if(customView.get("name").containsIgnoreCase("allprojs"))
{
customViewId = customView.get("custom_view_id");
break;
}
}
// get all delayed projects
getAllProjectsParam = Map();
getAllProjectsParam.put("filter",{"criteria":{{"cfid":""+endDateId+"","criteria_condition":"yesterday","value":{"${YESTERDAY}"}}},"pattern":"1"});
getAllProjectsParam.put("custom_view_id",customViewId);
getAllProjectsParam.put("page",0);
getAllProjectsParam.put("per_page",100);
getAllProjectsParam.put("is_gantt",false);
getAllProjectResponse = invokeurl
[
url :endPointV3 + portalId + "/projects"
type :GET
parameters:getAllProjectsParam
connection:"XXXXXXX"
];
projectsList = getAllProjectResponse.get("data").get(0).get("entities");
if(getAllProjectResponse.get("view_count") > 0)
{
for each project in projectsList
{
projectId = project.get("id");
// get project details
getProjectDetailsResponse = invokeurl
[
url :endPoint + portalId + "/projects/" + projectId + "/"
type :GET
connection:"XXXXXXX"
];
projectOwnerEmailIds.add(getProjectDetailsResponse.get("projects").get(0).get("owner_email"));
projectNames.add(getProjectDetailsResponse.get("projects").get(0).get("name"));
}
sendmail
[
from :zoho.loginuserid
to :projectOwnerEmailIds
subject :"Delayed projects"
message :"Names of the delayed projects "+ projectNames
]
}
Make sure to replace XXXXXXX with the Zoho Projects connection link name with scope ZohoProjects.portals.READ and ZohoProjects.projects.ALL. Check this link to learn how to create the connection.
Please note that the email content can be customized as per the requirement by updating the subject and message in the code above. Also, a screenshot of the sample Schedule Function along with arguments to be mapped is attached for reference.
We hope you found this post useful. If you have any questions, feel free to share them in the comments below.