CodeX Scripts for Projects
CodeX Scripts in Zoho Projects are advanced conditional logic scripts that help enforce specific rules and validations. Users can control how and when a project can be created, edited, or transitioned. This ensures better compliance and process alignment.
Use Cases:
Create a New Project
Creates a new project with populated project records with owner, dates, budget, and custom fields filled in.
- function main() {
- try {
- const layoutId = current.record.layoutId;
- const moduleId = current.record.moduleId;
- const layout = client.getLayoutById(layoutId, moduleId);
- const newProject = new Record(layout);
- newProject.name = "Explore Zoho ";
- const projectOwnerId = variables.projectowner.value;
- const user1 = variables.user1.value; // ZPUID of user1 is stored in variables
- const user2 = variables.user2.value; // ZPUID of user2 is stored in variables
- const addedProject = client.save(newProject);
- addedProject.name = "Explore Zoho Projects";
- addedProject.description =
- "Explore Zoho Projects features and functionalities";
- addedProject.owner = projectOwnerId;
- addedProject.status = "242942000000027095"; // status Id based on layout. Here, 242942000000040005 corresponds to 'In Progress' status
- addedProject.start_date = "2025-12-08";
- addedProject.end_date = "2025-12-25";
- addedProject.project_group = "242942000000025001"; // project group Id
- addedProject.completed_time = "2025-12-31T00:00:00+05:30"; // completed time should be proivded in ISO date and time formate
- addedProject.currency = "INR"; // Currency code
- addedProject.budget_type = "1"; // Budget Type
- addedProject.hourly_budget = "5.000";
- addedProject.hourly_budget_threshold = "3.000";
- addedProject.cost_budget = "5600";
- addedProject.cost_budget_threshold = "5000";
- addedProject.revenue_budget = "4000";
- addedProject.billing_method = "1"; // Billing Method Ref: BillingMethod enum in IDE.
- addedProject.rate_per_hour = "800";
- addedProject.cost_per_hour = "600";
- addedProject.single_line_text = "Sample Single Line Text";
- addedProject.pick_list = "Option 1"; // Value based on picklist options in layout
- addedProject.multi_line_text =
- "Lorem sunt Duis dolor laborum \n eu magna incididunt ipsum qui sit pariatur \n aute officia nisi irure nostrud sit commodo esse";
- addedProject.multi_select_field = ["Option 1", "Option 2", "Option 3"]; // Values based on multi select options in layout
- addedProject.user_pick_list_all_users = user1;
- addedProject.user_pick_list_select_roles = "242942000000082031"; // Role Id based on org roles
- addedProject.user_pick_list_selected_users = user2;
- addedProject.multi_user_picklist_all_users = [user1, user2];
- addedProject.multi_user_picklist_selected_roles = [
- "242942000000082031",
- "242942000000082001",
- ];
- addedProject.multi_user_picklist_selected_users = [user1, user2];
- addedProject.date_field = "2025-12-08"; // Date field value in ISO Date format
- addedProject.checkbox_field = "true";
- addedProject.currency_field = "4300";
- addedProject.percentage_field = "25"; // Percentage value without % symbol
- addedProject.decimal_field = "130.24";
- addedProject.number_field = "430020";
- addedProject.email_field = "vishal@yahoo.com";
- addedProject.phone_field = "1234567890";
- addedProject.url_field = "https://zlyker.com/";
- client.save(addedProject);
- } catch (err) {
- console.log(err);
- throw new ScriptError(err);
- }
- }
Create a New Entity
Creates a blank record in any module with just a name field set to use it for debugging or validation.
- function main() {
- try {
- let layout = client.getLayoutById(current.record.layoutId, current.record.moduleId);
- let record = new Record(layout);
- record.name = "created project from script"
- client.save(record);
- } catch (err) {
- throw new ScriptError(err);
- }
- }
-
Restrict Task Edits in Archived Projects
Restricts task edits when the associated project is archived.
- function main() {
- let task = current.record;
-
- let projectId = task.projectId;
- const moduleItr = client.getModules(0, 10);
- //projects module id: 5000000000380
- let moduleId;
- console.log(JSON.stringify(current.affectedFields));
- while(moduleItr.hasNext()) {
- let moduleObj = moduleItr.next();
- if(moduleObj.name == 'Projects') {
- moduleId = moduleObj.id;
- }
-
- }
- let project = client.getRecordById(moduleId, projectId);
-
- if(project._status == 'archived') {
- throw new ScriptError("Edits are disabled for archived projects");
- }
-
-
- }
-
Got an idea for how you would like CodeX to work in your project setup? Drop your use case in the comments below!
More Reads