お世話になっております。
ログインユーザーの所属組織を取得するkintone APIの中でフィールドの編集不可のコードを実行すると反映されません。
試しにイベントハンドラに入った直後に記述したところ、正常に反映されました。
"event"はAPIの中では無効になるのでしょうか。
ご教授いただけると幸いです。
(function () {
"use strict";
kintone.events.on('app.record.create.show', function(event) {
//フィールドを編集不可にする
disableBasicFields(event);
//ユーザーが操縦教官であるか判定する
kintone.api( //ユーザーの所属組織エクスポート API(JSON)
kintone.api.url('/v1/user/organizations', true), // pathOrUrl
'GET', // method
{code:kintone.getLoginUser()['code']}, // params
function(resp) { // 成功時のcallback
//some()メソッドで指定の要素があるか判定する。あればtrueが返る。
if(resp.organizationTitles.some(element => element = '操縦教官')){ //https://techacademy.jp/magazine/22267
console.log('ユーザーは操縦教官です');
event.record.評価_離陸上昇.disabled = true;
}else{
console.log('ユーザーは操縦教官ではありません');
}
}
);
//取得ボタン
const element = document.createElement('button');
element.id='get_studentInfo';
element.innerText ='取得';
element.onclick = function () {
const rec = kintone.app.record.get();
const studentName = rec.record.練習生.value;
if (studentName.length === 0){
alert('練習生を選択してください');
}else{
console.log(studentName[0].name);
console.log('studentName = ', studentName);
}
}
kintone.app.record.getSpaceElement('get_studentInfo').appendChild(element);
return event;
});
function disableBasicFields(myEvent){
myEvent.record.起票日.disabled = true;
myEvent.record.今回取組み事項.disabled = true;
myEvent.record.対象フライト.disabled = true;
myEvent.record.これまでの課目実施回数.disabled = true;
};
})();
補足です。
実行すると何もエラーが出ず、該当行を素通りしてしまいます。お手数おかけしますが、よろしくお願いいたします。
こんばんは
function(resp) { // 成功時のcallback
~~~
}
の中でdisableが効かないということでしたら、
kintone REST API は非同期リクエストなので
respが帰ってくる前に return event; まで行ってしまい
kintone.events.on('app.record.create.show', function(event) {
~~~}
が終わっちゃっていると思います。
どうすればいいかといいますと、
kintoneにおけるPromiseの書き方の基本
の、「Promiseを利用する(1回)」のところのサンプルコードのように
kintone.api( //ユーザーの所属組織エクスポート API(JSON)
のまえに return つけるとイイと思います。
早速のご回答ありがとうございます。
ザッとご解説を聞いて、納得しています。
非同期処理とPromiseについてはまだ知識が乏しいため、勉強になりました。
ありがとうございます!
お世話になっております。
ご教授いただいた方法ではうまく動かず、「kintoneにおけるPromiseの書き方の基本」に記載されていた下記リンク先の方法で正常に動作しました。
kintone API で Promise を使ってみよう!
正直処理の流れというか、仕組みをよく理解できていないのですが、カスタマイズを進めながら徐々に理解していこうと思います。
ありがとうございました。
(function () {
"use strict";
kintone.events.on('app.record.create.show', function(event) {
//フィールドを編集不可にする
disableBasicFields(event);
//取得ボタン
const element = document.createElement('button');
element.id='get_studentInfo';
element.innerText ='取得';
element.onclick = function () {
const rec = kintone.app.record.get();
const studentName = rec.record.練習生.value;
if (studentName.length === 0){
alert('練習生を選択してください');
}else{
//練習生の飛行経歴を取得する
//練習生の取組みテーマを取得する
}
}
kintone.app.record.getSpaceElement('get_studentInfo').appendChild(element);
//ユーザーが操縦教官であるか判定する
return new kintone.Promise(function(resolve, reject){ //https://tech.nerune.co/other/kintone-promise/
kintone.api( //ユーザーの所属組織エクスポート API(JSON)
kintone.api.url('/v1/user/organizations', true), // pathOrUrl
'GET', // method
{code:kintone.getLoginUser()['code']}, // params
function(resp) { // 成功時のcallback
//some()メソッドで指定の要素があるか判定する。あればtrueが返る。
if(resp.organizationTitles.some(element => element = '操縦教官')){ //https://techacademy.jp/magazine/22267
console.log('ユーザーは操縦教官です');
}else{
console.log('ユーザーは操縦教官ではありません');
disableEvaluateFields(event);
}
resolve(event);
}
);
});
});
function disableBasicFields(myEvent){
myEvent.record.起票日.disabled = true;
myEvent.record.今回取組み事項.disabled = true;
myEvent.record.対象フライト.disabled = true;
myEvent.record.これまでの課目実施回数.disabled = true;
};
function disableEvaluateFields(myEvent){
myEvent.record.評価_離陸上昇.disabled = true;
myEvent.record.コメント_離陸上昇.disabled = true;
myEvent.record.評価_離脱機速セット.disabled = true;
myEvent.record.コメント_離脱機速セット.disabled = true;
myEvent.record.評価_直線.disabled = true;
myEvent.record.コメント_直線.disabled = true;
myEvent.record.評価_旋回.disabled = true;
myEvent.record.コメント_旋回.disabled = true;
myEvent.record.評価_場周経路.disabled = true;
myEvent.record.コメント_場周経路.disabled = true;
myEvent.record.評価_第3旋回.disabled = true;
myEvent.record.コメント_第3旋回.disabled = true;
myEvent.record.評価_第4旋回.disabled = true;
myEvent.record.コメント_第4旋回.disabled = true;
myEvent.record.評価_アプローチ.disabled = true;
myEvent.record.コメント_アプローチ.disabled = true;
myEvent.record.評価_フレア接地舵.disabled = true;
myEvent.record.コメント_フレア接地舵.disabled = true;
myEvent.record.評価_地上滑走.disabled = true;
myEvent.record.コメント_地上滑走.disabled = true;
myEvent.record.総評.disabled = true;
}
})();
うまく行ったようで良かったです!
また、
kintoneにおけるPromiseの書き方の基本
の、「Promiseを利用する(1回)」のところのサンプルコードのように
kintone.api(の前にreturnを書くのに加えて、
callback内で 最後にreturn event; とするのが大切です←すみません、忘れていました

async/awaitなども便利なので是非是非非同期処理、色々と試されてみてください^0^
// 商品アプリからデータ取得する 【kintone.apiの前にreturn】
return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {app: 1, id: 1}).then(function(resp) {
// 商品アプリから取得したデータを見積もりアプリのフィールドに代入して保存
event.record.価格.value = Number(resp.record.価格.value);
return event; //←【大切】
});
return eventの件、ありがとうございます。この書き方の方がスッキリしてて良いですね!
それぞれ試してみたいと思います。ありがとうございます。