コンテンツにスキップ

items.NewResult

概要

サーバスクリプトで「記録テーブル」に対する「apiModelオブジェクト」の新規インスタンスを作成します。

構文

items.NewResult()

戻り値

「記録テーブル」の「apiModelオブジェクト」を返却します。

使用例

下記の例では、サイトID 3 の「記録テーブル」にタイトルが "プリザンターのバージョンアップについて" のレコードを作成します。

JavaScript
let siteId = 3;
let item = items.NewResult();
item.Title = 'プリザンターのバージョンアップについて';
items.Create(siteId, item);
context.Log(item.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で「点検記録」のレコードを1件ずつ作ります。点検記録には、機器と点検計画へのリンク、点検予定日を入れます。

実務での使いどころ

設備・車両・パソコンなどの定期点検で、毎回の点検表を台数分そろえる手間を省きたいときに使えます。標準の機能では、別のテーブルの件数分のレコードをまとめて作ることはできません。点検記録を機器にリンクしておけば、機器ごとの点検の履歴も追えます。

事前準備

1:「機器マスタ」テーブル(記録テーブル)で、以下の項目を有効化してください。

項目コード 内容
タイトル(Title) 機器名
チェックA(CheckA) 点検対象

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

項目コード 内容
分類A(ClassA) 機器。選択肢一覧に[[「機器マスタ」テーブルのサイトID]]を設定し、リンクにする
分類B(ClassB) 点検計画。選択肢一覧に[[「点検計画」テーブルのサイトID]]を設定し、リンクにする
日付A(DateA) 点検予定日

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

項目コード 内容
日付A(DateA) 点検予定日
状況(Status) 200(作成済み)の選択肢を用意する

4:「点検計画」テーブルにスクリプトを登録します。

4-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 4-2:タイトル: 任意の名前(例:createInspectionSheets)
 4-3:スクリプト: 下記サンプルコードを貼り付け、【機器マスタのサイトID】と【点検記録のサイトID】を書き換える
 4-4:条件: 「更新前」にチェック

JavaScript

条件:更新前

// 「機器マスタ」と「点検記録」のサイトID(テーブルの管理の「サイトID」で確かめる)
const MACHINE_SITE_ID = 【機器マスタのサイトID】;
const RECORD_SITE_ID = 【点検記録のサイトID】;
// 点検計画の「作成済み」の状況の値
const CREATED_STATUS = 200;

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}`;
}

// 点検計画を作成済みにしたとき、機器マスタの点検対象の機器ごとに、点検記録を 1 件ずつ作る
function createInspectionSheets() {
    // 作成済み「以外」から作成済み「へ」変わる更新のときだけ作る(2 回作らない)
    const becameCreated =
        Number(saved.Status) !== CREATED_STATUS &&
        Number(model.Status) === CREATED_STATUS;
    if (!becameCreated) {
        return;
    }
    // 点検対象(チェックA)の機器
    const machines = Array.from(items.Get(MACHINE_SITE_ID)).filter(machine => machine.CheckA);
    if (machines.length === 0) {
        context.Error('機器マスタに点検対象の機器がありません。');
        return;
    }
    let created = 0;
    for (const machine of machines) {
        const sheet = items.NewResult();
        sheet.Title = `${model.Title} ${machine.Title}`;
        sheet.ClassA = String(machine.ResultId);   // 機器(機器マスタへのリンク)
        sheet.ClassB = String(model.ResultId);     // 点検計画(点検計画へのリンク)
        sheet.DateA = toYmd(model.DateA);          // 点検予定日(日付は文字列にして入れる)
        if (sheet.Create(RECORD_SITE_ID)) {
            created++;
        } else {
            logs.LogUserError(`点検記録を作成できませんでした:機器 ${machine.Title}`);
        }
    }
    context.AddMessage(`点検記録を${created}件作成しました。`, 'alert-success');
}

createInspectionSheets();

注記

  • 状況が作成済み「以外」から作成済み「へ」変わる更新のときに作ります。作成済みのまま保存し直しても、点検記録は増えません。
  • 日付項目の値は、toYmdで「年/月/日」の文字列にしてから入れています。model.DateAをそのまま入れると、9時間ずれて前日の日付になります。

関連情報