開発者向け機能:スクリプト:$p.apiUsersGet
## 概要
AjaxのPOSTリクエストによる値の取得が可能なメソッドに関する説明をします。ユーザの情報などを取得したいときに使用してください。
## 構文
##### JavaScript
```
$p.apiUsersGet({
id: <ユーザID>,
done: <任意の処理>,
fail: <任意の処理>,
always: <任意の処理>
});
```
## 各パラメータの説明
|パラメータ名|説明|
|:--|:--|
|ユーザID|情報を取得したいユーザID|
|任意の処理|API通信成功(done:必須)、失敗時(fail:任意)、完了時(always:任意)の処理|
## 使用例
##### JavaScript
```
$p.apiUsersGet({
id: 123,
done: function (data) {
console.log(data);
console.log('ユーザ情報の取得に成功しました。');
},
fail: function () {
console.log('ユーザ情報の取得に失敗しました。');
},
always: function () {
console.log('ユーザ情報の取得が完了しました。');
}
});
```
## サンプルコード
<details>
<summary>1. 全ユーザーを対象に、重複条件に一致しない人だけレコードを一括作成する</summary>
このスクリプトは、指定したサイトの全ユーザー(テナント管理者を除く)を対象に、次の処理を自動実行します。
1.**既存データの確認**
指定サイトの既存レコードを全件取得します。そのうえで、ユーザーごとに「重複判定ルール」に当てはまるレコードがすでに存在するかを確認します。
(サンプルの重複判定ルール:レコードの **Owner が対象ユーザー本人**で、かつ **ClassA が "案内区分A"** になっていること)
2.**条件付き一括作成**
該当レコードが**ない**(未登録の)ユーザー:新規レコードを作成します。
該当レコードが**ある**(登録済みの)ユーザー:何もしません。
※類似の機能として [$p.apiUpsert](https://pleasanter.org/ja/manual/script-api-upsert)(キー項目が一致すれば更新、一致しなければ新規作成)がありますが、両者は用途が異なります。
使い分けの目安
| 観点 | このスクリプト | $p.apiUpsert |
|---|---|---|
| 何をもとに動くか | ユーザー一覧を起点に、全ユーザー分をチェックする | 渡したデータ(1件〜複数件)を起点に処理する |
| すでにレコードがある人・データはどうなるか | 何もしない(既存レコードはそのまま) | 内容を最新の状態に更新する |
| まだレコードがない人・データはどうなるか | 新規作成する | 新規作成する |
| こんなときに向いている | 「まだ1件も登録がない人にだけ配りたい」時(初期配布・登録漏れの棚卸し) | 「常に最新の内容に保ちたい」時(外部データとの同期・定期反映) |
##### JavaScript
```
// ==========================================
// 設定エリア
// ==========================================
const CONFIG = {
SITE_ID: 【サイトID】,
// ここで重複判定ルールを定義する(サンプルはOwner+ClassA)
isDuplicate: (record, user) => {
return String(record.Owner) === String(user.UserId) &&
String(record.ClassHash.ClassA) === "案内区分A"; // 必要に応じて条件を追加
},
// 作成するデータの内容
createData: (user) => ({
Title: `${user.Name}様への連絡事項`,
Status: 100,
Owner: user.UserId,
ClassHash: { ClassA: '案内区分A' }
})
};
// ==========================================
// 共通処理:全件取得
// Offsetを「実際に取得した件数」ぶんずつ進めながら、
// 取得件数が0件になるかTotalCountに達するまで繰り返す
// ==========================================
function fetchAll(apiFunc, options) {
return new Promise((resolve, reject) => {
let allData = [];
const fetchPage = (offset) => {
const data = Object.assign({}, options.data, {
View: Object.assign({}, (options.data && options.data.View) || {}, {
Offset: offset
})
});
apiFunc(Object.assign({}, options, {
data: data,
done: (res) => {
const records = res.Response.Data;
allData = allData.concat(records);
const totalCount = res.Response.TotalCount;
const nextOffset = offset + records.length; // 実際の取得件数ぶん進める
if (records.length > 0 && nextOffset < totalCount) {
fetchPage(nextOffset); // まだ取得していないレコードが残っているので続けて取得
} else {
resolve(allData); // 全件取得完了
}
},
fail: (res) => reject(res)
}));
};
fetchPage(0);
});
}
// ==========================================
// 実行処理
// ==========================================
(async () => {
try {
// 1. 既存レコードを全件取得
const existingRecords = await fetchAll($p.apiGet, { id: CONFIG.SITE_ID });
// 2. ユーザー一覧を全件取得
const allUsers = await fetchAll($p.apiUsersGet, {});
// 3. テナント管理者を除き、未登録ユーザーのみ抽出
const targets = allUsers.filter(user =>
!user.TenantManager &&
!existingRecords.some(rec => CONFIG.isDuplicate(rec, user))
);
if (targets.length === 0) {
console.log("(info)全員登録済みです。");
return;
}
targets.forEach(user => {
$p.apiCreate({
id: CONFIG.SITE_ID,
data: CONFIG.createData(user),
done: () => console.log(`(info)作成完了: ${user.Name}`),
fail: (res) => console.error(`(info)作成失敗: ${user.Name}`, res)
});
});
} catch (err) {
console.error("(error)処理中にエラーが発生しました", err);
}
})();
```
##### 実行結果
・存在しない場合
```
(info)作成完了: 社員A
(info)作成完了: 社員B
(info)作成完了: 社員C
```
・存在する場合
```
(info)全員登録済みです。
```
</details>



