お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の
英語版を参照してください。
CodeX Scripts は Zoho プロジェクトで使用できる詳細な条件ロジックスクリプトで、特定のルールや検証を適用するのに役立ちます。ユーザーは、タスクがいつ・どのように作成、編集、またはステータス変更されるかを制御できます。これにより、コンプライアンスの向上とプロセスの整合性が確保されます。
こちらから、プロジェクト向け CodeX Scripts の詳細をご確認ください。
ユースケース:
タスクを作成する
選択したレイアウトとタスクリストを使用してタスクを作成し、必要な情報でタスクを更新します。
- 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 (非請求対象)
- addedTask。single_line = '1 行テキストのカスタム項目';
- addedTask。pick_list = 'Option 1'; // ピックリストの選択肢名
- addedTask。multi_line = '複数行テキストの\nカスタム項目';
- 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 に表示します。
- }
- }
プロジェクトのベースライン設定後のタスク作成を制限する:
プロジェクトにベースラインが既に存在する場合はタスクの作成を制限し、プロジェクトの元の計画の整合性を維持します。
サブタスクの階層を 1 レベルに制限する
サブタスクの下にさらにサブタスクを作成できないように制限し、シンプルで管理しやすいタスク階層を維持します(サブタスクは 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('Parent ID: ' + タスク。parent_task);
- Logger。info('Root タスク ID: ' + タスク。root_task);
-
- // console。log(JSON。stringify(variables。blockSubTasks));
- if(タスク。parent_task || タスク。root_task) {
- Logger。info('Subtask creation is 無効');
- throw 新規 ScriptError(JSON。stringify(variables。blockSubTasks。値));
- }
-
- //Similar case >>> Subtasks shouldn't be 作成 under the 完了済み parent タスク.
- }
-
条件に基づいてタスクの期間とステータスを更新する
特定のカスタム項目と現在のステータスに基づいて、タスクの期間とステータスを更新します。
例えば、次の条件を満たした場合に、このスクリプトはタスクの期間とステータスを更新します。
- タスクの現在のステータスが「オン 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('中') {//check if the multi 選択する 項目 is some 設定
- console。log('setting ステータス to 進行中');
- タスク。duration_unit = TaskDurationUnit。日;
- タスク。duration_value = 30;
- }
-
-
- }
アーカイブ済みプロジェクトでの編集を制限する
プロジェクトがアーカイブ済みの場合、そのプロジェクト配下のタスクには一切更新を行えないように制限します。
- function main() {
- let タスク = 現在。データ;
-
- let projectId = タスク。projectId;
- const moduleItr = client。getModules(0, 10);
- //projects タブ 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('Edits are 無効 for アーカイブ済み プロジェクト');
- }
-
-
- }
-
過去の日付での開始日を制限する
正確なスケジュールを維持するため、選択された開始日が過去の日付の場合はエラーをスローします。
- 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 をプロジェクト設定でどのように動作させたいか、アイデアはありますか?下のコメントにユースケースをお寄せください。
その他の関連記事