お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の
英語版を参照してください。
CodeX Scripts in Zoho プロジェクト are 詳細 conditional logic scripts that ヘルプ enforce specific rules and validations. ユーザー can control how and when タスク are 作成, 編集, or transitioned. This ensures better compliance and process alignment.
詳しくはこちらfor CodeX Scripts for プロジェクト.
使用する Cases :
作成 a タスク
選択済み のレイアウトとタスクリストを使用して タスク を作成し、必要な情報で タスク を更新します。
- function main() {
- try {
- const layoutId = 現在。データ。layoutId; // 選択したレイアウト ID
- const moduleId = 現在。データ。moduleId; // 選択したタブ ID
- const layout = client。getLayoutById(layoutId, moduleId);
- const newTask = 新規 データ(layout);
- newTask。projectId = 現在。データ。projectId;
- newTask。名前 = 'Roles and responsib';
- newTask。tasklistId = '242942000000297017'// タスクリスト ID
- const user1 = variables。user1。値; // user1 の ZPUID は変数に保存されています
- const user2 = variables。user2。値; // user2 の ZPUID は変数に保存されています
- const addedTask = client。保存(newTask);
- addedTask。名前 = 'Roles and responsibilities';
- addedTask。ステータス = '242942000000040005'; // レイアウトに基づくステータス ID。ここでは 242942000000040005 は「進行中」ステータスに対応します
- addedTask。説明 =
- 'This is a タスク to define roles and responsibilities.';
- addedTask。start_date = '2025-12-09T12:00:00+05:30'; // 開始日 は ISO 日付と時間形式で指定する必要があります
- addedTask。end_date = '2025-12-12T12:00:00+05:30'; // 終了日 は ISO 日付と時間形式で指定する必要があります
- addedTask。owners_and_work = {
- work_unit: 'hours_per_day', // 使用可能な値: %, 時間, %_per_day, hours_per_day
- total_work_value: '2160', // 作業単位に基づく合計作業値
- work_type: 'standard_work', // 使用可能な値: standard_work, flexible_work
- owners: [
- {
- 担当者: {
- id: user1,
- },
- work_value: '540', // 作業単位に基づく、この担当者の作業値
- },
- ],
- };
- addedTask。teams = ['242942000000090845', '242942000000090855']; // チーム ID
- addedTask.completion_percentage = '50'; // 完了率(%)の値は 0 から 100 の間で指定します
- addedTask。billing_type = '1'; // 使用可能な値: 0 (なし), 1 (請求対象), 2 (Non-請求対象)
- addedTask。single_line = 'A single 折れ線グラフ カスタム 項目';
- addedTask。pick_list = 'Option 1'; // ピッキングリストのオプション名
- addedTask。multi_line = 'A multi 折れ線グラフ\ncustom 項目';
- addedTask。multi_select = ['Option 1', 'Option 2', 'Option 3']; // 複数選択ピッキングリストのオプション名
- addedTask。user_pick_list_select_roles = '242942000000082031'; // 役割 ID
- addedTask。user_pick_list_all_users = user1;
- addedTask。user_pick_list_select_users = user2;
- addedTask。multi_user_pick_list_all_users = [user1, user2];
- addedTask。multi_user_pick_list_select_users = [user1, user2];
- addedTask。date_field = '2025-12-09'; // 日付は ISO 日付形式で指定する必要があります
- addedTask。date_time_field = '2025-12-09T12:00:00+05:30'; // 日付時間は ISO 日付と時間形式で指定する必要があります
- addedTask。checkbox_field = '真';
- addedTask。currency_field = '40000'; // 通貨値
- addedTask。percentage_field = '25'; // 割合(%)の値は 0 から 100 の間で指定します
- addedTask。number_field = '450'; // 数値
- addedTask。decimal_field = '1。234'; // 小数値
- addedTask。email_field = 'zylker@zoho.com'; // メールアドレス
- addedTask。phone_field = '1234567890'; // 電話番号
- addedTask。url_field = 'https://zylker.com/';// URL
- client。保存(addedTask);
- } catch (エラー) {
- console。log(エラー);
- throw 新規 ScriptError(エラー); // エラーを ScriptError として再スローし、プロジェクト UI に表示します。
- }
- }
Restrict タスク Creation When プロジェクト Baseline is set:
プロジェクト の元の内容 プラン の整合性を維持するため、プロジェクト にベースラインが 既存 する場合は タスク の作成を制限します。
Restrict Subtask Creation Beyond One Level
サブタスクの階層を 1 レベルのみに制限し、シンプル で管理しやすい タスク 階層を維持するため、サブタスクの下にさらにサブタスクを作成できないようにします。
- function main() {
- if(現在。データ。parent_task !== 現在。データ。root_task) {
- throw 新規 ScriptError('サブタスクの階層を 1 レベルより深く作成することはできません');
- }
- }
-
- 未完了の課題があるタスクの完了を制限する
- 関連付けられている課題のステータスが「完了」または「キャンセル」となっていない場合はタスクをクローズできないようにし、すべての関連課題が解決済みであることを保証します。
-
- function main() {
-
- console。log('started');
- console。log(`${現在。affectedFields}`);
-
- if (!現在。affectedFields。ステータス) {
- 返品する;
- }
-
- const statusDtl = client。getStatusDetails(現在。タブ。id, 現在。データ。layoutId, 現在。affectedFields。ステータス。newValue);
-
- if (!statusDtl。isClosedStatus) {
- 返品する;
- }
-
- const タスク = 現在。データ;
- const url = `https://projects.zoho.com/api/v3/portal/${current.org.zohoOrgId}/projects/${task.projectId}/tasks/${current.record.id}/associated-bugs`;
-
- const request = 新規 HttpRequest();
- request。url(url);
- request。connection('zprojects');
- const response = request。実行する();
- const associatedBugs = response。asJson()?.statusMessage?.responseText?.associated_bugs;
-
- if(!associatedBugs) {
- 返品する;
- }
-
- for(let bug of associatedBugs) {
- if(bug。issue。status_name !== '完了済み' || bug。issue。status_name !== 'キャンセル済み') {
- throw 新規 ScriptError('このタスクには未解決の課題があります');
- }
- }
-
- console。log(response。asJson()?.statusMessage?.responseText);
- }
オンホールドのプロジェクトでのタスク作成を無効にする
関連付けられているプロジェクトが「保留」に設定されている場合、タスクを作成できないように制限します。
- function main() {
-
- const projectId = 現在。データ。projectId;
- const moduleItr = client。getModules();
-
- /**
- * @種類 {タブ}
- */
- let タブ
-
- console。log('started');
- for (let mod of moduleItr) {
- console。log(`${mod}`);
- if (mod。名前 === 'プロジェクト') {
- タブ = mod;
- }
- }
-
- if (!タブ) {
- 返品する;
- }
-
- let projectDtl = client。getRecordById(タブ。id, projectId);
- let statusDtl = client。getStatusDetails(タブ。id, projectDtl。layoutId, projectDtl。ステータス);
-
- if (statusDtl。名前 === 'zp。projstatus。onhold') {
- throw 新規 ScriptError('オンホールドのプロジェクトではタスクを作成できません');
- }
- }
-
ステータス更新後の手動での日付変更を制限する
ステータスがレイアウトの初期ステータスと異なる場合、開始日、終了日、または期間を編集できないように制限します。
- function main() {
-
- //base 条件 #1
- if (!現在。affectedFields。start_date
- && !現在。affectedFields。end_date
- && !現在。affectedFields。duration_value
- && !現在。affectedFields。duration_unit) {
- 返品する;
- }
-
- const statusDtl = client。getStatusDetails(現在。タブ。id, 現在。データ。layoutId, 現在。データ。ステータス);
- console。log(`${statusDtl}`);
-
- if (!statusDtl。isLayoutDefault) {
- throw 新規 ScriptError('開始日と終了日の変更は、初期ステータスのときのみ許可されます');
- }
- }
-
未完了のサブタスクがある場合はタスクをクローズできないようにする
親タスクに未完了のサブタスクがある場合、親タスクのステータスを「完了済み」に変更できないように制限します。これにより、すべてのサブタスクが完了するまで親タスクを完了としてマークできないようにします。
-
- function main() {
-
- console。log(現在。affectedFields。toString());
-
- //ベース条件の処理
- if (!現在。affectedFields?.ステータス) {
- 返品する;
- }
-
- const url = `https://projects.zoho.com/restapi/portal/${current.org.zohoOrgId}/projects/${current.record.projectId}/tasks/${current.record.id}/subtasks/`;
- let hasMore = 真;
- const range = 200;
- let index = 1;
- console。log(url);
-
- while (hasMore) {
- let request = 新規 HttpRequest();
- request。url(url);
- request。connection('zprojects');
- request。params({ index, range });
-
- const response = request。実行する();
-
- console。log(response。asText());
- /**
- * @種類 {[]}
- */
- const タスク = response。asJson()?.statusMessage?.responseText?.タスク;
-
- //現在のタスクにサブタスクがありません
- if (!タスク || タスク。length == 0) {
- console。log('現在のタスクにサブタスクは存在しません');
- 返品する;
- }
-
- hasMore = タスク。length == range;
- index += range;
-
- console。log(タスク);
- console。log(タスク。length);
-
- for (let タスク of タスク) {
- console。log(task.completed);
- if (!task.completed) {
- throw 新規 ScriptError('このタスクには未完了のサブタスクがあります。');
- }
- }
- }
-
-
- }
先行タスクが未完了の場合はステータス変更を制限する
いずれかの先行タスクが未完了の場合はステータス更新を制限し、依存関係のロジックを維持します。これにより、後続タスクは先行タスクが完了してからのみ進行できるようになります。
- function main() {
- console。log(現在。affectedFields。toString());
-
- //ベース条件の処理
- if(!現在。affectedFields?.ステータス) {
- 返品する;
- }
- const url = `https://projects.zoho.com/restapi/portal/${current.org.zohoOrgId}/projects/${current.record.projectId}/tasks/${current.record.id}/`;
- console。log(url);
-
- let request = 新規 HttpRequest();
- request。url(url);
- request。connection('zprojects');
- const response = request。実行する();
- const taskDependencyDtl = response。asJson()?.statusMessage?.responseText?.タスク[0]?.dependency;
- //現在のタスクに依存関係はありません
- if(!taskDependencyDtl || !taskDependencyDtl?.predecessor) {
- 返品する;
- }
- console。log(taskDependencyDtl);
- for(let predecessorId of taskDependencyDtl。predecessor) {
- console。log(predecessorId);
- if(!taskDependencyDtl。dependencyDetails[predecessorId]?.IS_COMPLETED) {
- throw 新規 ScriptError('未完了の先行タスクがあります。続行する前に完了してください。');
- }
- }
- }
- task_owner_status_update_restrict
- function main() {
- const タスク = 現在。データ;
- const affectedFields = 現在。affectedFields;
- if(affectedFields。ステータス) {
- if(!タスク。_owners || !タスク。_owners。includes(現在。ユーザー。id)) {
- throw 新規 ScriptError('ステータスを編集できるのはタスク担当者のみです');
- }
- }
- }
サブタスクの作成を制限する
サブタスクの作成を制限し、一定のタスク構造を維持します。
- function main() {
-
- let タスク = 現在。データ;
-
- /**
- *
- * @種類 番号
- */
- let startDate = タスク。start_date;
- Logger。info('親ID: ' + タスク。parent_task);
- Logger。info('ルートタスクID: ' + タスク。root_task);
-
- // console。log(JSON。stringify(variables。blockSubTasks));
- if(タスク。parent_task || タスク。root_task) {
- Logger。info('サブタスクの作成は無効です');
- throw 新規 ScriptError(JSON。stringify(variables。blockSubTasks。値));
- }
-
- //同様のケース >>> 完了済みの親タスクの下ではサブタスクを作成できません。
- }
-
条件に基づいてタスクの期間とステータスを更新する
特定のカスタム項目と現在のステータスに基づいて、タスクの期間とステータスを更新します。
例えば、このスクリプトは、条件を満たした場合にタスクの期間とステータスを次のように更新します。
- タスクの現在のステータスが「オン Hold」の場合、自動的にステータスを特定のID(例: 「進行中」)に変更します。
- 複数選択カスタム項目で特定の値が選択されている場合、期間を30日に設定します。
- また、タスクの請求種別と影響を受ける項目を確認してログに記録します。
- function main() {
-
- /**
- * @種類 {CurrentTask}
- */
- // const タスク = client。getRecordById('5000000000134', '5000000291025');
- // console。log(タスク。名前);
- // throw 新規 エラー(タスク);
- //5000000179016 = corn
- let タスク = 現在。データ;
- console。log(`id: ${タスク。id}`);
- console。log(現在。affectedFields);
- console。log(`タスク Billing 種類 ${タスク。billing_type}`);
- console。log(`タスク Biling 種類 請求対象 ${TaskBillingType。請求対象}`);
- console。log(`タスク Biling 種類 NON_BILLABLE ${TaskBillingType。NON_BILLABLE}`);
- console。log(`タスク Biling 種類 なし ${TaskBillingType。なし}`);
-
- const statusDetails = client。getStatusDetails(タスク。moduleId, タスク。layoutId, タスク。ステータス);
- if(statusDetails。名前 === 'オン Hold') {
- タスク。ステータス = '5000000000362';
- client。保存(タスク);
- }
- console。log(JSON。stringify(statusDetails));
- if(タスク。weightage。includes('中') {//複数選択項目に特定の設定が含まれているかを確認
- console。log('ステータスを進行中に設定しています');
- タスク。duration_unit = TaskDurationUnit。日;
- タスク。duration_value = 30;
- }
-
-
- }
アーカイブ済みプロジェクトでの編集を制限する
プロジェクトがアーカイブ済みの場合、そのプロジェクト配下のタスクに対する更新をすべて制限し、タスクが編集されないようにします。
- function main() {
- let タスク = 現在。データ;
-
- let projectId = タスク。projectId;
- const moduleItr = client。getModules(0, 10);
- //プロジェクトタブ ID: 5000000000380
- let moduleId;
- console。log(JSON。stringify(現在。affectedFields));
- while(moduleItr。hasNext()) {
- let moduleObj = moduleItr。次();
- if(moduleObj。名前 == 'プロジェクト') {
- moduleId = moduleObj。id;
- }
-
- }
- let プロジェクト = client。getRecordById(moduleId, projectId);
-
- if(プロジェクト。_status == 'アーカイブ済み') {
- throw 新規 ScriptError('アーカイブ済みプロジェクトでは編集できません');
- }
-
-
- }
-
過去の日付での開始日の設定を制限する
スケジュールの正確性を保つため、選択された開始日が過去の日付の場合はエラーをスローします。
- function main() {
- let タスク = 現在。データ;
- let 日付 = 日付。now();
- for(let キー of Object。keys(現在)) {
- console。log(キー);
- }
-
- console。log('現在を確認中');
- console。log('現在。ユーザー を確認中');
- console。log(`現在。ユーザー。zuid: ${現在。ユーザー。zuid}`);
- console。log(`現在。ユーザー。メール ${現在。ユーザー。メール}`);
- console。log(`現在。ユーザー。id ${現在。ユーザー。id}`);
- console。log('現在。タブ を確認中');
- console。log(`現在。タブ。名前 ${現在。タブ。名前}`);
- console。log(`現在。タブ。id ${現在。タブ。id}`);
- console。log('org を確認中');
- console。log(`current.org.名前 ${current.org.zohoOrgId}`);
- console。log(`current.org.id ${current.org.orgId}`);
- console。log(`current.org.portalName ${current.org.portalName}`);
- console。log(`current.org.id ${current.org.名前}`);
-
- /**********この下にロジックがあります*************/
-
- const startDate = 新規 日付(タスク。start_date)
- if(日付 > startDate) {
- console。log('開始 日付 が過去日付になっています');
- throw 新規 ScriptError('開始日付を過去に設定することはできません');
- }
- }
条件に基づいてタスクの編集を制限する
チェックボックス項目が有効な場合、チェックボックス自体の変更を除き、そのタスクへの更新をすべて制限します。これにより、意図しない変更を防止できます。
- function main() {
-
- const affectedFields = 現在。affectedFields;
- const タスク = 現在。データ;
-
- if(affectedFields && typeof affectedFields['checkbox_cf'] != 'undefined') {
- 返品する; //チェックボックス自体が更新された場合は何もしません。
- }
-
- //チェックボックスタイプ項目の boolean 値
- if(タスク。checkbox_cf) {
- throw 新規 ScriptError('チェックボックスが有効なため、タスクはロックされています。 ')
- }
- }
-
プロジェクト設定での CodeX の動作についてアイデアはありますか?下のコメントにご利用中のユースケースをぜひお寄せください。
その他の関連記事