お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の
英語版を参照してください。
Zoho ProjectsのCodeXスクリプトは、特定のルールや検証を適用するための高度な条件ロジックスクリプトです。タスクを作成、編集、または遷移できる条件やタイミングを制御できます。これにより、コンプライアンスの向上とプロセスの整合性を確保できます。
CodeXスクリプトは、CN、JP、AEを除くすべてのデータセンターで利用できます。
活用例:
サブタスクの作成を1階層に制限
タスク階層をシンプルで管理しやすい状態に保つため、サブタスクの配下に別のサブタスクを作成できないようにし、サブタスクを1階層のみに制限します。
- function main() {
- if(current.record.parent_task !== current.record.root_task) {
- throw new ScriptError('サブタスクは2階層以上作成できません');
- }
- }
保留中のプロジェクトにおけるタスク作成の無効化
関連付けられているプロジェクトが保留中の場合、タスクの作成を制限します。
- function main() {
- const projectId = current.record.projectId;
- const moduleItr = client.getModules();
- let module
- console.log('開始');
- for (let mod of moduleItr) {
- console.log(`${mod}`);
- if (mod.name === 'Projects') {
- module = mod;
- }
- }
- if (!module) {
- return;
- }
- let projectDtl = client.getRecordById(module.id, projectId);
- let statusDtl = client.getStatusDetails(module.id, projectDtl.layoutId, projectDtl.status.id);
- console.log(statusDtl)
- if (statusDtl.name === 'zp.projstatus.onhold') {
- throw new ScriptError('保留中のプロジェクトではタスクを作成できません');
- }
- }
ステータス更新後の手動による日付変更の制限
ステータスがレイアウトのデフォルトステータスではない場合、開始日、終了日、または期間の編集を制限します。
- function main() {
-
- //base 条件 #1
- if (!current.affectedFields.start_date
- && !current.affectedFields.end_date
- && !current.affectedFields.duration_value
- && !current.affectedFields.duration_unit) {
- return;
- }
-
- const statusDtl = client.getStatusDetails(current.module.id, current.record.layoutId, current.record.status);
- console.log(`${statusDtl}`);
-
- if (!statusDtl.isLayoutDefault) {
- throw new ScriptError('開始日と終了日はデフォルトステータスの場合のみ変更できます');
- }
- }
-
未完了のサブタスクがある場合のタスク完了の制限
未完了のサブタスクがある場合、親タスクのステータスを完了に変更できないようにします。これにより、すべてのサブタスクが完了するまで、親タスクを完了として設定できません。
-
- function main() {
-
- console.log(current.affectedFields.toString());
-
- //base 条件の処理
- if (!current.affectedFields?.status) {
- return;
- }
-
- const url = `https://projects.zoho.com/restapi/portal/${current.org.zohoOrgId}/projects/${current.record.projectId}/tasks/${current.record.id}/subtasks/`;
- let hasMore = true;
- const range = 200;
- let index = 1;
- console.log(url);
-
- while (hasMore) {
- let request = new HttpRequest();
- request.url(url);
- request.connection('zprojects');
- request.params({ index, range });
-
- const response = request.execute();
-
- console.log(response.asText());
- /**
- * @type {[]}
- */
- const tasks = response.asJson()?.statusMessage?.responseText?.tasks;
-
- //no 現在のタスクにサブタスクが存在するか確認
- if (!tasks || tasks.length == 0) {
- console.log('現在のタスクにサブタスクはありません');
- return;
- }
-
- hasMore = tasks.length == range;
- index += range;
-
- console.log(tasks);
- console.log(tasks.length);
-
- for (let task of tasks) {
- console.log(task.completed);
- if (!task.completed) {
- throw new ScriptError('未完了のサブタスクがあるため、タスクを完了できません');
- }
- }
- }
-
-
- }
先行タスクが未完了の場合のステータス変更の制限
依存関係の整合性を維持するため、先行タスクのいずれかが未完了の場合はステータスの更新を制限します。これにより、後続タスクは先行タスクが完了した後にのみ進行できます。
- function main() {
- console.log(current.affectedFields.toString());
-
- //base 条件の処理
- if(!current.affectedFields?.status) {
- return;
- }
- const url = `https://projects.zoho.com/restapi/portal/${current.org.zohoOrgId}/projects/${current.record.projectId}/tasks/${current.record.id}/`;
- console.log(url);
-
- let request = new HttpRequest();
- request.url(url);
- request.connection('zprojects');
- const response = request.execute();
- const taskDependencyDtl = response.asJson()?.statusMessage?.responseText?.tasks[0]?.dependency;
- //no 前のタスクに依存関係があるか確認
- if(!taskDependencyDtl || !taskDependencyDtl?.predecessor) {
- return;
- }
- console.log(taskDependencyDtl);
- for(let predecessorId of taskDependencyDtl.predecessor) {
- console.log(predecessorId);
- if(!taskDependencyDtl.dependencyDetails[predecessorId]?.IS_COMPLETED) {
- throw new ScriptError('未完了の先行タスクがあります。続行するには先行タスクを完了してください');
- }
- }
- }
サブタスク作成の制限
タスク構造をフラットに保つため、サブタスクの作成を制限します。
- function main() {
- let task = current.record;
- let startDate = task.start_date;
- if(task.parent_task || task.root_task) {
- Logger.info('サブタスクの作成は無効です');
- throw new ScriptError('サブタスクの作成は無効です');
- }
- }
-
条件に基づくタスクの期間とステータスの更新
特定のカスタム項目と現在のステータスに基づいて、タスクの期間とステータスを更新します。
たとえば、このスクリプトでは、特定の条件を満たした場合にタスクの期間とステータスを更新します。
- タスクの現在のステータスが「保留中」の場合、ステータスを特定のID(例:「進行中」)に自動的に変更します。
- 複数選択カスタム項目で特定の値が選択されている場合、期間を30日に設定します。
- また、タスクの請求タイプと影響を受ける項目を確認し、ログに記録します。
- function main() {
- let task = current.record;
- const statusDetails = client.getStatusDetails(task.moduleId, task.layoutId, task.status);
- if(statusDetails.name === 'On Hold') {
- task.status = '5000000000362';
- client.save(task);
- }
- console.log(JSON.stringify(statusDetails));
- if(task.weightage.includes('Medium') {//check 複数選択項目がいずれかの選択肢の場合
- console.log('ステータスを進行中に設定');
- task.duration_unit = TaskDurationUnit.DAYS;
- task.duration_value = 30;
- }
- }
アーカイブ済みプロジェクトの編集制限
プロジェクトがアーカイブされている場合、そのプロジェクト内のタスクが編集されないよう、タスクの更新を制限します。
- function main() {
- let task = current.record;
- let projectId = task.projectId;
- const moduleItr = client.getModules(0, 10);
- 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.project_type == 'archived') {
- throw new ScriptError('アーカイブ済みプロジェクトは編集できません');
- }
- }
過去の開始日の設定制限
正確なスケジュールを維持するため、選択した開始日が過去の日付の場合にエラーを表示します。
- function main() {
- let task = current.record;
- let date = Date.now();
- for(let key of Object.keys(current)) {
- console.log(key);
- }
- const startDate = new Date(task.start_date)
- if(date > startDate) {
- console.log('開始日が過去の日付です');
- throw new ScriptError('開始日を過去の日付に更新することはできません');
- }
- }
条件に基づくタスク編集の制限
チェックボックス項目が有効な場合、チェックボックス自体の変更を除き、タスクの更新を制限します。これにより、意図しない変更を防止できます。
- function main() {
-
- const affectedFields = current.affectedFields;
- const task = current.record;
-
- if(affectedFields && typeof affectedFields['checkbox_cf'] != 'undefined') {
- return; //Do チェックボックス自体が更新された場合は何もしません。
- }
-
- //boolean チェックボックス形式の項目の値
- if(task.checkbox_cf) {
- throw new ScriptError('チェックボックスが有効なため、タスクはロックされています。')
- }
- }
-
カスタムステータス時のタスク日付の更新制限
タスクがカスタムステータスの場合、タスクの開始日と終了日の更新を制限します。
- function main() {
- try {
- if (!current.affectedFields.start_date
- && !current.affectedFields.end_date
- && !current.affectedFields.duration_value
- && !current.affectedFields.duration_unit) {
- return;
- }
- const statusDtl = client.getStatusDetails(current.record.moduleId, current.record.layoutId, current.record.status.id);
- console.log(`${statusDtl}`);
- if (!statusDtl.isLayoutDefault) {
- throw new ScriptError('開始日と終了日は、初期設定のステータスでのみ変更できます');
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
プロジェクトの設定でCodeXをどのように活用したいか、アイデアはありますか?以下のコメント欄でユースケースをお知らせください。
関連情報