group.GetMembers
概要¶
サーバスクリプトで「groupオブジェクト」から「groupMemberオブジェクト」のコレクションを取得します。
構文¶
戻り値¶
「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 以降 | 拡張項目の値を取得する機能を追加 |
