コンテンツにスキップ

$p.apiGroupsCreate

概要

AjaxのPOSTリクエストにより、グループを作成します。

構文

JavaScript
$p.apiGroupsCreate({
    data: {
        <作成するグループ情報>
    },
    done: <任意の処理>,
    fail: <任意の処理>,
    always: <任意の処理>
});

パラメータ

パラメータ名 型 必須 概要
data object 作成するグループ情報をJSON形式で指定 ※欄外補足参照
done function ○ API通信成功時に実行する処理
fail function API通信失敗時に実行する処理
always function API通信完了時に実行する処理
※作成するグループ情報は、APIグループ作成時と同等のパラメータを設定します。リンク先のマニュアルを参照にパラメータを設定してください。

使用例

$p.apiGroupsCreate({
    data: {
        GroupName: '作成グループ名',
        Body: '作成グループ内容',
        ClassHash: {
            ClassA: 'test-class-column'
        },
        NumHash: {
            NumA: 100
        },
        DateHash: {
            DateA: '2026-08-19'
        },
        DescriptionHash: {
            DescriptionA: '補足説明'
        },
        CheckHash: {
            CheckA: true
        },
        GroupMembers: [
            'User,1,True',
            'Dept,1,False'
        ],
        GroupChildren: [
            'Group,1'
        ]
    },
    done: function (data) {
        console.log(data);
        console.log('グループ情報の作成に成功しました。');
    },
    fail: function (data) {
        console.log('グループ情報の作成に失敗しました。');
    },
    always: function (data) {
        console.log('グループ情報の作成が完了しました。');
    }
});

戻り値

API通信成功時に「done」に渡される値は、API「グループ作成」のレスポンスと同じ形式です。

サンプルコード

Note

コード内の【 ... 】は適宜修正してください。

1. プロジェクトグループの作成・メンバー反映・廃止を申請レコードで行う

プロジェクトごとに使うグループを、「プロジェクトグループ申請」テーブルの1レコードで管理します。編集画面のプロセス「グループ作成」を押すと$p.apiGroupsCreateでグループを作り、返ってきたグループIDをレコードに記録して状況を「有効」にします。メンバー欄を変えて「メンバー反映」を押すと$p.apiGroupsUpdateでグループのメンバーを入れ替え、プロジェクトが終わったら「グループ廃止」で$p.apiGroupsDeleteを呼んでグループを削除し、状況を「廃止済」にします。

実務での使いどころ

プロジェクトや委員会ごとにグループを作ってアクセス権を付ける運用では、プロジェクトが終わってもグループが削除されずに残り、どのグループがまだ使われているのか分からなくなりがちです。画面からのグループ管理は手作業で、作成や廃止の申請レコードとはつながりません。

このサンプルでは、グループの作成から廃止までを申請レコードのボタンで行うため、レコードの状況を見れば、どのグループが有効で、どれが廃止済みかを追えます。利用終了予定日を入れておけば、標準のリマインダーで廃止の時期を知らせることもできます。

グループのIDをレコードに記録するのがポイントです。グループは同じ名前で何度でも作れてしまうため、名前ではなくIDで追います。サーバスクリプトのgroups.Createは作成したグループのIDを返さず、グループを削除するメソッドも無いため、この処理はスクリプトで行います。

グループ名の接頭辞やメンバーの項目は先頭の定数にまとめてあるので、委員会、部門横断チーム、外部委託先の利用者グループなどの管理にも使えます。

事前準備

1:テーブルに以下の項目を有効化してください。

項目コード 内容
タイトル(Title) プロジェクト名。グループ名は「PJ_」+プロジェクト名になります
管理者(Manager) プロジェクトリーダー。グループの管理者として登録します
分類A(ClassA) メンバー。選択肢一覧に[[Users*]]を設定し、「複数選択」を有効にします。一般メンバーとして登録します
数値A(NumA) グループID。スクリプトが記録します
日付A(DateA) 利用終了予定日(任意。リマインダーで廃止の時期を知らせる場合に使います)
状況(Status) 選択肢一覧に「100,申請中」「200,有効」「900,廃止済」を設定します

2:「エディタ」タブの「状況による制御」で、状況が「有効」「廃止済」のときに数値A(グループID)を読み取り専用にしてください。「申請中」では読み取り専用にしないでください(スクリプトが記録したグループIDを保存できなくなります)。
3:「テーブルの管理 > プロセス」タブで、以下の3つのプロセスを追加します。いずれも、画面種別は「編集」、実行種別は「追加したボタン」、アクション種別は「保存」にします。

名称 現在の状況 変更後の状況 OnClick
グループ作成 申請中 有効 createProjectGroup($(this))
メンバー反映 有効 (指定しない) updateProjectGroupMembers($(this))
グループ廃止 有効 廃止済 deleteProjectGroup($(this))

「グループ廃止」の確認ダイアログはスクリプトが出すため、プロセスの「確認メッセージ」は設定しないでください。
4:スクリプトを登録します。
 4-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
 4-2:タイトル: 任意の名前(例:プロジェクトグループ管理)
 4-3:スクリプト: 下記サンプルコードを貼り付け
 4-4:出力先:「編集」にチェック

JavaScript
/**
 * ================================================================
 * サンプル01  プロジェクトグループの作成・メンバー反映・廃止を申請レコードで行う
 * ================================================================
 *
 * 【概要】
 *   「プロジェクトグループ申請」テーブルの1レコードで、プロジェクトごとの
 *   グループを管理します。編集画面のプロセスボタンから、次の処理を行います。
 *     ・グループ作成:$p.apiGroupsCreate でグループを作り、返ってきた
 *                     グループIDをレコードに記録して、状況を「有効」にする
 *     ・メンバー反映:$p.apiGroupsUpdate で、その時点のリーダーとメンバーに
 *                     グループのメンバーを置き換える
 *     ・グループ廃止:確認のうえ $p.apiGroupsDelete でグループを削除し、
 *                     状況を「廃止済」にする
 *   グループの作成から廃止までを申請レコードで追えるようにし、使われなく
 *   なったグループが残り続けるのを防ぎます。
 *
 * 【なぜサーバースクリプトではなくスクリプトで行うか】
 *   サーバースクリプトの groups.Create は戻り値が真偽値だけで、作成した
 *   グループのIDを受け取れません。また、サーバースクリプトにはグループを
 *   削除するメソッドがありません。$p.apiGroupsCreate は作成したグループの
 *   IDを返すため、IDをレコードに記録して後の更新・削除に使えます。
 *
 * 【ポイント】
 *   ・同じ名前のグループを何度でも作れてしまうため、グループは名前ではなく
 *     IDで追います。グループIDが記録済みのレコードでは作成しません。
 *   ・$p.apiGroupsUpdate で GroupMembers を送ると、メンバーは送った内容で
 *     まるごと置き換わります。そのため、毎回リーダーとメンバー全員を送ります。
 *   ・OnClick を設定したプロセスは、ボタンを押しただけでは保存されません。
 *     API の呼び出しが成功したあとに $p.set で項目へ値を入れてから
 *     $p.execProcess を呼ぶと、その値と一緒に保存し、状況を変更します。
 *     API の呼び出しが失敗したときは $p.execProcess を呼ばないため、
 *     状況は変わりません。
 *
 * 【使い方】
 *   下記の定数を、実際に使用する項目コードに置き換えてください。
 *   あわせて「テーブルの管理 > プロセス」で、以下の3つのプロセスを
 *   追加してください(いずれも 画面種別:編集、実行種別:追加したボタン、
 *   アクション種別:保存)。
 *     ・グループ作成:現在の状況 申請中 → 変更後の状況 有効
 *                     OnClick:createProjectGroup($(this))
 *     ・メンバー反映:現在の状況 有効(変更後の状況は指定しない)
 *                     OnClick:updateProjectGroupMembers($(this))
 *     ・グループ廃止:現在の状況 有効 → 変更後の状況 廃止済
 *                     OnClick:deleteProjectGroup($(this))
 *   グループの作成・更新・削除は、テナント管理者が行ってください。
 * ================================================================
 */

// ===== 設定 =====
// 作成するグループ名の接頭辞(グループ名は「接頭辞+タイトル」になる)
const GROUP_NAME_PREFIX = 'PJ_';
// プロジェクト名の項目コード(グループ名に使う)
const PROJECT_NAME_COLUMN = 'Title';
// プロジェクトリーダーの項目コード(グループの管理者として登録する)
const LEADER_COLUMN = 'Manager';
// メンバーの項目コード(選択肢一覧 [[Users*]]、複数選択。一般メンバーとして登録する)
const MEMBERS_COLUMN = 'ClassA';
// グループIDを記録する項目コード
const GROUP_ID_COLUMN = 'NumA';

// ===== 共通処理 =====
function showError(text) {
    $p.clearMessage();
    $p.setMessage('#Message', JSON.stringify({
        Css: 'alert-error',
        Text: text,
    }));
}

// APIの失敗応答から、表示用のメッセージを取り出す
function getErrorMessage(jqXHR) {
    try {
        return JSON.parse(jqXHR.responseText).Message;
    } catch (e) {
        return `HTTP ${jqXHR.status}`;
    }
}

// 記録済みのグループID(未記録なら0)
function getGroupId() {
    return Number($p.getValue(GROUP_ID_COLUMN)) || 0;
}

// 複数選択の項目の値を、ユーザーIDの配列にする
// (値が配列でも、JSON文字列(例:["2","5"])でも扱えるようにする)
function getMemberIds() {
    const value = $p.getValue(MEMBERS_COLUMN);
    if (Array.isArray(value)) {
        return value;
    }
    if (!value) {
        return [];
    }
    try {
        const parsed = JSON.parse(value);
        return Array.isArray(parsed) ? parsed : [String(parsed)];
    } catch (e) {
        return [String(value)];
    }
}

// リーダーを管理者、メンバーを一般メンバーとして GroupMembers を組み立てる
// 形式は "User,ユーザーID,管理者かどうか"
function buildGroupMembers() {
    const leaderId = String($p.getValue(LEADER_COLUMN) || '');
    const groupMembers = [];
    if (leaderId) {
        groupMembers.push(`User,${leaderId},True`);
    }
    getMemberIds()
        .map(String)
        .filter((userId) => userId && userId !== leaderId) // リーダーは管理者として登録済み
        .forEach((userId) => {
            groupMembers.push(`User,${userId},False`);
        });
    return groupMembers;
}

// ===== プロセス「グループ作成」 =====
function createProjectGroup($button) {
    // グループIDが記録済みなら作成しない(二重作成を防ぐ)
    if (getGroupId() > 0) {
        showError(`グループは作成済みです(グループID:${getGroupId()})。`);
        return;
    }

    const groupName = GROUP_NAME_PREFIX + $p.getValue(PROJECT_NAME_COLUMN);
    $p.apiGroupsCreate({
        data: {
            GroupName: groupName,
            GroupMembers: buildGroupMembers(),
        },
        done: function (data) {
            // data.Id に作成したグループのIDが入っている
            $p.set($p.getControl(GROUP_ID_COLUMN), data.Id);
            // グループIDと一緒に保存し、状況を「有効」にする
            $p.execProcess($button);
        },
        fail: function (jqXHR) {
            showError(`グループ「${groupName}」を作成できませんでした。${getErrorMessage(jqXHR)}`);
        },
    });
}

// ===== プロセス「メンバー反映」 =====
function updateProjectGroupMembers($button) {
    const groupId = getGroupId();
    if (groupId === 0) {
        showError('グループIDが記録されていません。');
        return;
    }

    // メンバーは送った内容でまるごと置き換わるため、リーダーとメンバー全員を送る
    $p.apiGroupsUpdate({
        id: groupId,
        data: {
            GroupMembers: buildGroupMembers(),
        },
        done: function () {
            // 変更したメンバー欄を保存する
            $p.execProcess($button);
        },
        fail: function (jqXHR) {
            showError(`グループ(グループID:${groupId})のメンバーを更新できませんでした。${getErrorMessage(jqXHR)}`);
        },
    });
}

// ===== プロセス「グループ廃止」 =====
function deleteProjectGroup($button) {
    const groupId = getGroupId();
    if (groupId === 0) {
        showError('グループIDが記録されていません。');
        return;
    }
    const groupName = GROUP_NAME_PREFIX + $p.getValue(PROJECT_NAME_COLUMN);
    if (!confirm(`グループ「${groupName}」(グループID:${groupId})を削除します。よろしいですか?`)) {
        return;
    }

    $p.apiGroupsDelete({
        id: groupId,
        done: function () {
            // 保存し、状況を「廃止済」にする
            $p.execProcess($button);
        },
        fail: function (jqXHR) {
            showError(`グループ(グループID:${groupId})を削除できませんでした。${getErrorMessage(jqXHR)}`);
        },
    });
}

ボタンを押して処理を行うのは、テナント管理者の利用者にしてください(グループの作成・更新・削除のAPIは、テナント管理者でないと実行できません)。プロセスの「アクセス制御」で、ボタンを表示する利用者を絞り込めます。

「メンバー反映」では、プロジェクトリーダーとメンバー欄の全員を送ります。グループのメンバーは送った内容でまるごと置き換わるため、メンバー欄から外した利用者はグループからも外れます。

グループを削除すると、そのグループに付けていたサイトのアクセス権も自動で外れます。廃止のときに、サイトの権限設定からグループを手で外す必要はありません。

グループの作成・更新・削除に成功したあと、レコードの保存が入力チェック(必須項目の未入力など)で止まると、グループの変更のみが済んだ状態になります。特に「グループ作成」では、グループIDが記録されないまま再度ボタンを押すと、同じ名前のグループがもう1つ作られます。必須項目は、ボタンを押す前に入力しておいてください。

対応バージョン

対応バージョン 内容
1.5.8.0 以降 拡張項目をAPIで登録する機能を追加

関連情報