フィールドの編集不可をKintone APIの中で実行すると反映されない

お世話になっております。

ログインユーザーの所属組織を取得する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; とするのが大切です←すみません、忘れていました:sweat_drops::sweat_drops:

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の件、ありがとうございます。この書き方の方がスッキリしてて良いですね!
それぞれ試してみたいと思います。ありがとうございます。