コンテンツにスキップ

group.GetMembers

概要

サーバスクリプトで「groupオブジェクト」から「groupMemberオブジェクト」のコレクションを取得します。

構文

group.GetMembers()

戻り値

「groupMemberオブジェクト」のコレクションを返却します。

各「groupMemberオブジェクト」をToString()でJSON文字列にすると、下記の形式になります。拡張項目(ClassHash/NumHash/DateHash/DescriptionHash/CheckHash)は、このJSONから読み取れます。

[
    {
        "GroupId": 1,
        "GroupName": "営業部",
        "DeptId": 0,
        "DeptName": "",
        "DeptCode": "",
        "UserId": 5,
        "LoginId": "hayato",
        "Name": "HAYATO",
        "UserCode": "",
        "TenantManager": false,
        "Disabled": false,
        "Admin": false,
        "ClassHash": {
            "ClassA": "test-class-column"
        },
        "NumHash": {
            "NumA": 100
        },
        "DateHash": {
            "DateA": "2026-08-19"
        },
        "DescriptionHash": {
            "DescriptionA": "補足説明"
        },
        "CheckHash": {
            "CheckA": true
        }
    }
]

使用例

下記の例ではグループID 1 のグループに所属するメンバーの組織IDとユーザIDをログに出力します。

JavaScript
let group = groups.Get(1);
for (let member of group.GetMembers()) {
    context.Log(`${member.DeptId},${member.UserId}`);
}

サンプルコード

1. 担当グループのメンバーへ、順番に担当者を割り当てる

問い合わせ管理のテーブルで新しいレコードを作成するとき、選んだ担当グループのメンバーへ順番に担当者を割り当てます。group.GetMembers()でメンバーの一覧を取得し、別のテーブル「ローテーションカウンタ」に持たせた順番から、次に割り当てる人を決めて「担当者」に設定します。順番は担当グループ×テーブルごとに持つため、同じグループを複数のテーブルで使っても、テーブルごとに独立して順番が進みます。

実務での使いどころ

問い合わせ対応やタスクの割り振りで、特定の人に作業が偏らないように、グループのメンバーへ均等に割り当てたい場面に使えます。担当者の項目には、ログインユーザーなどを初期値にする設定はありますが、「前回だれに割り当てたか」を覚えて次の人を選ぶ機能はありません。メンバーの加入・脱退があっても、その時点のメンバー数で割り直して割り当てを続けます。

事前準備

1:割り当てに使うグループを作成し、メンバーを登録してください。

2:「ローテーションカウンタ」テーブル(記録テーブル)を作成し、以下の項目を有効化してください。レコードは、初めて割り当てるときにスクリプトが作成します。

項目コード 内容
分類A(ClassA) 対象グループID
分類B(ClassB) 対象テーブルのサイトID
数値A(NumA) 次に割り当てる順番

3:「ローテーションカウンタ」テーブルの「テーブルの管理 > 全般」で、サイト名に「ローテーションカウンタ」を設定してください。

4:割り当てる側のテーブル(例:問い合わせ管理)で、以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 担当グループ。選択肢一覧に[[Groups*]]を設定
担当者(Owner) スクリプトが設定する

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

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

JavaScript
// 担当グループを選ぶ項目(選択肢一覧にグループを設定した分類項目)
const GROUP_COLUMN = 'ClassA';
// 次に割り当てる順番を持つサイトの「サイト名」(テーブルの管理 > 全般 で設定する)
const COUNTER_SITE_NAME = 'ローテーションカウンタ';
const LOG_TAG = '[rotateOwnerByGroupMembers]';

// 担当グループ×このテーブルのカウンタを1件取得する(無ければ null)
// 分類項目の絞り込みは、配列形式+ExactMatchMultipleでないと完全一致にならない
function getCounter(counterSiteId, groupId) {
    const view = {
        View: {
            ColumnFilterHash: {
                ClassA: `["${groupId}"]`,
                ClassB: `["${context.SiteId}"]`,
            },
            ColumnFilterSearchTypes: {
                ClassA: 'ExactMatchMultiple',
                ClassB: 'ExactMatchMultiple',
            },
        },
    };
    const counters = Array.from(items.Get(counterSiteId, JSON.stringify(view)));
    return counters.length > 0 ? counters[0] : null;
}

// 担当グループのメンバーへ順番に割り当て、担当者に設定する
function assignOwner() {
    const groupId = Number(model[GROUP_COLUMN]);
    if (!groupId) {
        // 担当グループが未選択のときは何もしない
        return;
    }
    const group = groups.Get(groupId);
    if (!group) {
        logs.LogUserError(`${LOG_TAG} グループ(ID:${groupId})を取得できません`, 'assignOwner');
        return;
    }
    // GetMembers の戻り値で値が入るのは UserId・Name など。GroupId・DeptId は 0 になる
    const members = Array.from(group.GetMembers());
    if (members.length === 0) {
        logs.LogUserError(`${LOG_TAG} グループ(ID:${groupId})にメンバーがいません`, 'assignOwner');
        return;
    }
    const counterSite = items.GetClosestSite(COUNTER_SITE_NAME);
    if (!counterSite) {
        logs.LogUserError(`${LOG_TAG} サイト名「${COUNTER_SITE_NAME}」のサイトが見つかりません`, 'assignOwner');
        return;
    }

    // メンバーの増減があっても、その時点の人数で割った余りで次の人を決める
    const counter = getCounter(counterSite.SiteId, groupId);
    const index = counter ? Number(counter.NumA) : 0;
    const member = members[index % members.length];
    model.Owner = member.UserId;

    // 次回に備えて順番を1つ進める(初回はカウンタのレコードを作る)
    if (counter) {
        items.Update(counter.ResultId, JSON.stringify({ NumHash: { NumA: index + 1 } }));
    } else {
        items.Create(counterSite.SiteId, JSON.stringify({
            Title: `グループID ${groupId}/${context.SiteTitle}`,
            ClassHash: { ClassA: String(groupId), ClassB: String(context.SiteId) },
            NumHash: { NumA: 1 },
        }));
    }
    logs.LogInfo(`${LOG_TAG} ${member.Name}(UserId:${member.UserId})を担当者にしました(順番:${index})`, 'assignOwner');
}

assignOwner();

注記

  • group.GetMembers()の戻り値で値が入るのは、UserId・Name・LoginIdなどです。GroupId・DeptIdは0、DeptNameは空文字です。組織の情報が必要な場合は、users.Get(member.UserId)で取得してください。
  • 担当グループが未選択のときは、担当者を変更しません。
  • 同じタイミングで複数のレコードが作成された場合に、同じ人が続けて割り当てられることがあります。

対応バージョン

対応バージョン 内容
1.5.8.0 以降 拡張項目の値を取得する機能を追加

関連情報