コンテンツにスキップ

apiModel.Create

概要

サーバスクリプトでapiModelオブジェクトの内容でレコードを作成します。

制限事項

  1. 作成したレコードのIDを、apiModel.Createの戻り値から取得することはできません。後述の「使用例」で示す通りにスクリプトを記述すると、作成したレコードのIDを取得することが可能です。

構文

apiModel.Create(siteId)

パラメータ

パラメータ 型 必須 説明
siteId object ○ 対象テーブルのサイトIDを指定

戻り値

レコードを作成できたらtrue、作成できなかったらfalseを返却します。
作成したレコード内容はレコードIDを含めapiModelに反映されます。

使用例

以下の例では、サイトID 123 の期限付きテーブルにタイトルが "プリザンターのバージョンアップ手順について" のレコードを作成し、作成したレコードIDを出力します。

JavaScript
// 期限付きテーブルのスクリプト
let sampleApiModel = items.NewIssue();
sampleApiModel.Title = 'プリザンターのバージョンアップ手順について';
sampleApiModel.Create(123);
context.Log(sampleApiModel.IssueId); // ブラウザのコンソールに作成したレコードのIDを出力

記録テーブルにレコードを作成する場合は、以下のスクリプトを記述してください。1行目と5行目に記述する内容が期限付きテーブルと異なります。

JavaScript
// 記録テーブルのスクリプト
let sampleApiModel = items.NewResult();
sampleApiModel.Title = 'プリザンターのバージョンアップ手順について';
sampleApiModel.Create(123);
context.Log(sampleApiModel.ResultId); // ブラウザのコンソールに作成したレコードのIDを出力

サンプルコード

1. 親テーブルにリンクする子テーブルのレコードを作成する

案件を管理する「案件管理」テーブル(親)と、それにリンクする「タスク管理」テーブル(子)を用意します。

実務での使いどころ

案件を登録するたびに、要件定義・設計・開発などの定型のタスクを手で作っている場合に使えます。親の案件にリンクしたタスクが自動でできるので、作り忘れや案件との紐づけ忘れを防げます。作業手順のテンプレートとして、案件の種類ごとにタスクの並びを変えることもできます。

親の案件管理レコード作成時に定型タスクとして、「'要件定義', '設計', '開発', 'テスト', 'リリース'」をリンクさせた形で作成します。

そのため、案件管理レコード作成後にレコードIDを取得。そのIDをタスク管理レコードに登録することで、親子関係のリンクを保持したレコードが作成できます。

JavaScript

条件:作成後、更新後 等

コードの途中で return を使っているため、サーバスクリプトの「関数化」を有効にしてください。

// サイトIDキャッシュ
const _siteIdCache = new Map();
// サイト名からSiteIdを取得(キャッシュ)
function getSiteIdOrNull(siteName) {
    if (_siteIdCache.has(siteName)) return _siteIdCache.get(siteName);
    const site = items.GetClosestSite(siteName);
    if (!site || !site.SiteId) {
        logs.LogInfo(`${siteName} サイト情報取得失敗`);
        return null;
    }
    _siteIdCache.set(siteName, site.SiteId);
    return site.SiteId;
}
// レコード作成共通処理
function createAndGetId(siteId, apiModel, fields) {
    // fields を apiModel に流し込む
    for (const [key, value] of Object.entries(fields)) {
        apiModel[key] = value;
    }
    try {
        apiModel.Create(siteId);
    } catch (e) {
        logs.LogException(
            `apiModel.Create Error: ${e && e.stack ? e.stack : e}`
        );
        return null;
    }
    // IDを返却
    const id = apiModel.ResultId ?? apiModel.IssueId ?? null;
    logs.LogInfo(`created id: ${id}`);
    return id;
}
// メイン処理
// 親(案件管理)を作成
const caseSiteId = getSiteIdOrNull('案件管理');
if (!caseSiteId) {
    logs.LogException('案件管理サイトの取得に失敗しました。');
    return;
}
const caseId = createAndGetId(caseSiteId, items.NewResult(), {
    Title: 'サンプル案件',
    Status: '200',
    ClassA: '顧客管理システムの刷新',
    DateA: '2025/01/10',
    NumA: 5,
});
if (!caseId) {
    logs.LogException('案件の作成に失敗しました。');
    return;
}
// 子(タスク管理)を作成(リンク項目に親IDをセット)
const taskSiteId = getSiteIdOrNull('タスク管理');
if (!taskSiteId) {
    logs.LogException('タスク管理サイトの取得に失敗しました。');
    return;
}
const taskList = ['要件定義', '設計', '開発', 'テスト', 'リリース'];
for (const task of taskList) {
    const taskId = createAndGetId(taskSiteId, items.NewIssue(), {
        Title: 'サンプル案件',
        ClassA: task,
        ClassD: String(caseId),
    });
    if (!taskId) {
        logs.LogException('タスクの作成に失敗しました。');
        return;
    }
}
実行結果
(Info):created id: 9001
(Info):created id: 9002
(Info):created id: 9003
(Info):created id: 9004
(Info):created id: 9005
(Info):created id: 9006
2. 定期点検を完了にしたら、次回の点検レコードを作る

点検のレコードを完了にしたとき、点検予定日に点検周期(日数)を足した日を予定日にして、次回の点検レコードを同じテーブルに作ります。items.NewResultで作ったapiModelに値を入れ、apiModel.Createで登録します。

実務での使いどころ

空調・消防設備・車両などの定期点検で、点検を終えたらすぐ次回の予定が台帳に入るようにしたいときに使えます。レコードのコピーでも次回分は作れますが、毎回人が開いて予定日を直す必要があり、作り忘れも起きます。

事前準備

1:「定期点検」テーブル(記録テーブル)で、以下の項目を有効化してください。

項目コード 内容
タイトル(Title) 設備名
分類A(ClassA) 点検の種類
数値A(NumA) 点検周期(日数)
日付A(DateA) 点検予定日

2:スクリプトを登録します。

2-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 2-2:タイトル: 任意の名前(例:createNextInspection)
 2-3:スクリプト: 下記サンプルコードを貼り付け
 2-4:条件: 「更新前」にチェック

JavaScript

条件:更新前

// 「完了」の状況の値
const COMPLETED_STATUS = 900;

function toYmd(d) {
    const m = String(d.getMonth() + 1).padStart(2, '0');
    const day = String(d.getDate()).padStart(2, '0');
    return `${d.getFullYear()}/${m}/${day}`;
}

// 点検を完了にしたとき、点検周期(数値A・日数)の後の日を点検予定日にした、次回の点検レコードを作る
function createNextInspection() {
    // 完了「以外」から完了「へ」変わったときだけ作る(完了のまま保存し直しても作らない)
    const becameCompleted =
        Number(saved.Status) !== COMPLETED_STATUS &&
        Number(model.Status) === COMPLETED_STATUS;
    if (!becameCompleted) {
        return;
    }
    const cycleDays = Number(model.NumA);
    if (!cycleDays || !model.DateA) {
        context.Error('点検予定日と点検周期(日数)を入力してから完了にしてください。');
        return;
    }

    const nextDate = new Date(model.DateA.getTime());
    nextDate.setDate(nextDate.getDate() + cycleDays);

    const next = items.NewResult();
    next.Title = model.Title;          // 設備名
    next.ClassA = model.ClassA;        // 点検の種類
    next.NumA = cycleDays;             // 点検周期(日数)
    next.DateA = toYmd(nextDate);      // 次回の点検予定日
    next.Body = `前回の点検:ID ${model.ResultId}(${toYmd(model.DateA)})`;
    if (next.Create(context.SiteId)) {
        logs.LogInfo(`次回の点検を作成しました:ID ${next.ResultId}、予定日 ${next.DateA}`);
    } else {
        logs.LogUserError(`次回の点検を作成できませんでした:元の ID ${model.ResultId}`);
    }
}

createNextInspection();

注記

  • 状況が完了「以外」から完了「へ」変わった更新のときに限って作ります。完了のまま保存し直しても、次回の点検レコードは増えません。
  • 点検予定日か点検周期が空のまま完了にしようとすると、エラーを表示して更新を止めます。
  • プロセスで完了にしても、一覧の一括更新で完了にしても、同じように作ります。