開発者向け機能:スクリプト:$p.apiGroupsGet
## 概要
AjaxのPOSTリクエストにより、グループ情報を取得します。
## 構文
### グループIDを直接指定して1件取得する場合
##### JavaScript
```
$p.apiGroupsGet({
id: <グループID>,
done: <任意の処理>,
fail: <任意の処理>,
always: <任意の処理>
});
```
### グループIDを複数指定して取得する場合
##### JavaScript
```
$p.apiGroupsGet({
data:{
View: {
ColumnFilterHash: {
GroupId: '[<グループIDを配列で指定>]'
}
}
},
done: <任意の処理>,
fail: <任意の処理>,
always: <任意の処理>
});
```
## 使用例
### グループIDを直接指定して1件取得する場合
|パラメータ名|説明|必須|
|:--|:--|:--:|
|id|取得対象のグループID|○|
|done|API通信成功|○|
|fail|API通信失敗|-|
|always|完了時|-|
##### JavaScript
```
$p.apiGroupsGet({
id: 123,
done: function (data) {
console.log(data);
console.log('グループ情報の取得に成功しました。');
},
fail: function () {
console.log('グループ情報の取得に失敗しました。');
},
always: function () {
console.log('グループ情報の取得が完了しました。');
}
});
```
### グループIDを複数指定して取得する場合
|パラメータ名|説明|必須|
|:--|:--|:--:|
|data|取得対象のグループIDを配列で複数指定|○|
|done|API通信成功|○|
|fail|API通信失敗|-|
|always|完了時|-|
##### JavaScript
```
$p.apiGroupsGet({
data: {
View: {
ColumnFilterHash: {
GroupId: '[100,101]'
}
}
},
done: function (data) {
console.log(data);
console.log('グループ情報の取得に成功しました。');
},
fail: function () {
console.log('グループ情報の取得に失敗しました。');
},
always: function () {
console.log('グループ情報の取得が完了しました。');
}
});
```
## サンプルコード
<details> <summary>1. 複合条件判定によるボタン表示制御</summary>
##### 機能要件
1. 以下条件で、ボタンの表示を制御します。
<table border="1">
<thead>
<tr>
<th>部門(組織)</th>
<th>役職(グループ)</th>
<th>承認</th>
<th>更新</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="3">営業部</td>
<td>部長</td>
<td>表示</td>
<td>表示</td>
</tr>
<tr>
<td>課長</td>
<td>非表示</td>
<td>表示</td>
</tr>
<tr>
<td>一般社員</td>
<td>非表示</td>
<td>非表示</td>
</tr>
<tr>
<td rowspan="3">開発部</td>
<td>部長</td>
<td>非表示</td>
<td>表示</td>
</tr>
<tr>
<td>課長</td>
<td>非表示</td>
<td>表示</td>
</tr>
<tr>
<td>一般社員</td>
<td>非表示</td>
<td>非表示</td>
</tr>
</tbody>
</table>
2. 部門、役職を以下のように定義します。
|種類|ID|組織/グループ|
|---|---|:---:|
|営業部|6|組織|
|開発部|7|組織|
|部長|3|グループ|
|課長|2|グループ|
※一般社員は、グループ所属無しの想定
3. ボタン制御
- 承認:プロセスで設定
- 更新:標準の更新ボタン
**実務での使いどころ**
承認や更新など、担当ロールごとに操作可能なアクションを画面上で出し分けたい場合
複数部門・複数役職の組み合わせでアクセス制御を行いたい場合
権限テーブルを別途持たずに、既存の組織・グループ構造だけで制御を完結させたい場合
##### JavaScript
```
// ===== 設定 =====
const deptSales = 6; // 営業部
const deptDev = 7; // 開発部
const groupManager = 3; // 部長
const groupSecManager = 2; // 課長
const buttonRules = [
{
id: 'Process_1',
depts: [deptSales],
groups: [groupManager],
}, // 承認:営業部 × 部長
{
id: 'UpdateCommand',
depts: [deptSales, deptDev],
groups: [groupManager, groupSecManager],
}, // 更新:営業/開発 × 部長/課長
];
// ===== エンジン:基本は触らない =====
const userId = $p.userId();
function matchesAny(ids, membershipMap) {
return ids.length === 0 || ids.some((id) => membershipMap[id]);
}
// 組織判定: $p.apiUsersGet で自分自身のユーザーレコードを取得し、DeptId を直接比較
const getMyDeptId = () => {
const dfd = $.Deferred();
$p.apiUsersGet({
id: userId,
done: function (res) {
dfd.resolve(res.Response.Data[0].DeptId);
},
fail: function () {
dfd.resolve(null);
},
});
return dfd.promise();
};
// グループ判定: $p.apiGroupsGet のレスポンス内 GroupMembers("User,ID,フラグ"形式の配列)に
// 自分のIDが含まれるかで判定(実機で確認済みの構造)
const getGroupMembership = (groupId) => {
const dfd = $.Deferred();
$p.apiGroupsGet({
id: groupId,
done: function (res) {
const members = res.Response.Data[0].GroupMembers || [];
const isMember = members.some((m) => m.startsWith(`User,${userId},`));
dfd.resolve({ id: groupId, isMember: isMember });
},
fail: function () {
dfd.resolve({ id: groupId, isMember: false });
},
});
return dfd.promise();
};
const groupIds = Array.from(new Set(buttonRules.flatMap((r) => r.groups)));
const groupPromises = groupIds.map(getGroupMembership);
// サーバースクリプト版の elements.DisplayType(描画前制御)と異なり、
// スクリプト版は画面表示後にボタンをjQueryでhide/showする
$p.events.on_editor_load = function () {
$.when(getMyDeptId(), ...groupPromises).done(function (myDeptId, ...groupResults) {
const deptMembership = {
[deptSales]: myDeptId === deptSales,
[deptDev]: myDeptId === deptDev,
};
const groupMembership = {};
groupResults.forEach((r) => { groupMembership[r.id] = r.isMember; });
buttonRules.forEach((rule) => {
const visible = matchesAny(rule.depts, deptMembership) && matchesAny(rule.groups, groupMembership);
visible ? $('#' + rule.id).show() : $('#' + rule.id).hide();
});
});
};
```
</details>



