レコード追加イベント、レコード編集イベントで、レコードに初期値をセットしたい。
プロフィールからユーザー情報を取得し、
などをレコードにプリセットしたいと考えています。
ルックアップのように、ユーザー選択がされたら、組織選択・グループ選択などが動くイメージです。
console.log(e.record);で表示してみると、ちゃんとrecord変数の中にデータは入っているのですが、画面に反映されません。
なぜでしょうか???
(テキストエディタから貼り付けると、インデントが崩れてしまいます…)
(function() {
"use strict";
// レコード保存実行前イベント
kintone.events.on([
"app.record.create.submit",
"app.record.edit.submit",
"app.record.index.edit.submit"
], function(e) {
var record = e.record;
var selectedUsers = record['ユーザー選択'].value;
if (selectedUsers.length > 1) {
e.error = "ユーザーは一人しか指定できません。";
}
return e;
});
// app.record.edit.change.<フィールドコード>
kintone.events.on(["app.record.create.change.ユーザー選択", "app.record.edit.change.ユーザー選択"], function(e) {
var record = e.record;
e.record = getUsers(record);
return e;
});
// レコード入力画面
kintone.events.on(["app.record.create.show", "app.record.edit.show"], function(e) {
var record = e.record;
e.record = getUsers(record);
return e;
});
/**
* ユーザーエクスポート API(JSON)
* https://developer.cybozu.io/hc/ja/articles/202363040#step2
*/
function getUsers(record) {
var user = kintone.getLoginUser();
var body = {
//ids: [user.id]
codes:[user.code]
};
if (record['ユーザー選択'].value !== null && record['ユーザー選択'].value !== undefined) {
user = {};
//body.ids[0] = record.ID.value - 1;
body.codes[0] = record['ユーザー選択'].value[0].code;
}
kintone.api(kintone.api.url('/v1/users', true), 'GET', body, function(resp1) {
user = Object.assign(user, resp1.users[0]);
record.ID.value = user.id;
record['社員番号'].value = user.employeeNumber;
record['氏名'].value = user.name;
record['氏名ふりがな'].value = user.surNameReading + ' ' + user.givenNameReading;
record['生年月日'].value = user.birthDate;
if (user.phone) {
record['電話'].value = user.phone;
} else if (user.mobilePhone) {
record['電話'].value = user.mobilePhone;
} else if (user.extensionNumber) {
record['電話'].value = user.extensionNumber;
}
body = {
code: user.code
};
record['組織選択'].value = [];
kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', body, function(resp2) {
for (var i = 0; i < resp2.organizationTitles.length; i++) {
record['組織選択'].value[i] = {};
record['組織選択'].value[i].code = resp2.organizationTitles[i].organization.code;
record['組織選択'].value[i].name = resp2.organizationTitles[i].organization.name;
}
});
record['グループ選択'].value = [];
kintone.api(kintone.api.url('/v1/user/groups', true), 'GET', body, function(resp3) {
for (var j = 0; j < resp3.groups.length; j++) {
record['グループ選択'].value[j] = {};
record['グループ選択'].value[j].code = resp3.groups[j].code;
record['グループ選択'].value[j].name = resp3.groups[j].name;
}
});
});
return record;
}
})();
tomomo85 さん
・ record[‘ユーザー選択’].value は、配列なので設定済みの判定条件は、
record[‘ユーザー選択’].value.length > 0
・kintone.api は、非同期処理なので API 完了を待たずに、return record; が実行されます。
そのため、イベント処理が終了後に API が完了して record をセットしてしまい、結果が反映されません。
API 完了後に処理を行うには、下記が参考になると思います。
kintone API で Promise を使ってみよう!
この中で、「kintone.apiのコールバック関数を省略すると、Promiseオブジェクトを返す」を使った
「sample.js(kintone.api コールバック関数省略版)」が分かりやすくていいと思います。
ひとつ見逃してました。
create.show イベント、change イベント等では Promise 未対応なので、
kintone.api 完了後に evento.record を変更して return event; 出来ません。
kintone.api 完了後に kintone.app.record.set 関数を使って、画面に反映してください。
rex0220さん
コメントありがとうございます。
おかげさまで、ご助言を参考に組み直した結果、Promise理解不充分ながらも、見様見真似で実装できました。
(無駄な処理や意味のない処理をしているところもあるかもしれません。)
ありがとうございました。
(function() {
"use strict";
var events = [];
events.submit = [
"app.record.index.edit.submit",
"app.record.create.submit",
"app.record.edit.submit"
];
events.change = [
"app.record.index.edit.change.ユーザー選択",
"app.record.create.change.ユーザー選択",
"app.record.edit.change.ユーザー選択"
];
events.show = [
"app.record.index.edit.show",
"app.record.create.show",
"app.record.edit.show"
];
// レコード保存実行前イベント
kintone.events.on(events.submit, function(event) {
var selectedUsers = event.record["ユーザー選択"].value;
if (selectedUsers.length > 1) {
event.error = "ユーザーは一人しか指定できません。";
}
return event;
});
// フィールド値変更イベント
kintone.events.on(events.change, function(event) {
// 処理なし
});
// レコード入力画面
kintone.events.on(events.show , function(event) {
var record = event.record;
var loginUser = kintone.getLoginUser();
var body = {
codes: [loginUser.code]
};
if (record["ユーザー選択"].value.length > 0) {
loginUser = {};
body.codes[0] = record["ユーザー選択"].value[0].code;
} else {
record["ユーザー選択"].value[0] = {};
record["ユーザー選択"].value[0].code = loginUser.code;
record["ユーザー選択"].value[0].name = loginUser.name;
}
// ユーザー
var users = new Promise(function(resolve, reject) {
body.codes[0] = record["ユーザー選択"].value[0].code;
kintone.api(kintone.api.url("/v1/users", true), "GET", body, function(resp1) {
var user = Object.assign(loginUser, resp1.users[0]);
record.ID.value = user.id;
record["社員番号"].value = user.employeeNumber;
record["氏名"].value = user.name;
record["氏名ふりがな"].value = user.surNameReading + " " + user.givenNameReading;
record["氏名かな"].value = user.surNameReading + " " + user.givenNameReading;
record["生年月日"].value = user.birthDate;
if (user.phone) {
record["電話"].value = user.phone;
} else if (user.mobilePhone) {
record["電話"].value = user.mobilePhone;
} else if (user.extensionNumber) {
record["電話"].value = user.extensionNumber;
}
resolve(record);
});
});
// 所属部
var organizations = new Promise(function(resolve, reject) {
body = {
code: record["ユーザー選択"].value[0].code
};
kintone.api(kintone.api.url("/v1/user/organizations", true), "GET", body, function(resp2) {
for (var i = 0; i < resp2.organizationTitles.length; i++) {
record["所属部"].value[i] = {};
record["所属部"].value[i].code = resp2.organizationTitles[i].organization.code;
record["所属部"].value[i].name = resp2.organizationTitles[i].organization.name;
}
resolve(record);
});
});
// 役職
var groups = new Promise(function(resolve, reject) {
body = {
code: record["ユーザー選択"].value[0].code
};
kintone.api(kintone.api.url("/v1/user/groups", true), "GET", body, function(resp3) {
for (var j = 0; j < resp3.groups.length; j++) {
record["役職"].value[j] = {};
record["役職"].value[j].code = resp3.groups[j].code;
record["役職"].value[j].name = resp3.groups[j].name;
}
resolve(record);
});
});
Promise.all([users, organizations, groups]).then(function(resp) {
record = {
record: resp[0]
};
kintone.app.record.set(record);
});
});
})();