画面に結果が返らない【同期処理・非同期処理】

お世話になっております。
独学しながら皆さんの投稿を参考に色々勉強させてもらっております。
ありがとうございます。

今回質問させて頂きたいことですが、

AアプリとBアプリ(Aアプリの進捗報告用)があり、
Aアプリのアクションボタンによって、Bアプリのレコードを生成します。

このとき、AアプリとBアプリのレコード関係としては、1:Nの関係を想定しており、
進捗がある度にAアプリのレコードに対する進捗情報をBアプリに新規レコードで追加します。

Bアプリにはサブテーブルを設定しており、
新規進捗報告の場合は、サブテーブルはまっさらな状態でいちから明細行を入力します。

2回目以降の進捗報告の場合は、前回登録している進捗レコードのサブテーブル情報を
コピーし、かつ一部の項目を編集不可の状態にしたいです。

下記ソースにおいて、
サブテーブル情報のコピーは問題なく動作しております。
制御部分がうまく画面に反映されなく、デバッグをしていると、
disabled :true
の情報はとれているのですが画面上でdisableが効いていないです。

then(function())以下の処理を画面に返すにはどうすればよいでしょうか?

説明が上手くできず申し訳ないですがご教授いただけると助かります。

(function(){
'use strict';

kintone.events.on(['app.record.create.show'], function(event) {

var appid_self = 640;
var filterCond = '見積書No = "' + event.record['見積書No'].value + '"';

var params_get_id = {
"app": appid_self,
"query": filterCond + "order by $id desc limit 1 offset 0",
"fields": ["予測No"]
};

kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params_get_id).then(function(resp) {
if(resp.records.length > 0) {
var yosoku_ID = resp.records[0]["予測No"].value;
return kintone.api( kintone.api.url('/k/v1/record', true), 'GET', {
'app': appid_self,
'id': yosoku_ID
}).then(function(resp){
var now_obj = kintone.app.record.get();

now_obj.record['予測明細'].value = [];

resp.record['予測明細'].value.map( function(row){
now_obj.record['予測明細'].value.push({
'value': {
'月度a': {'type': 'DROP_DOWN', 'value': row.value['月度a'].value},
'項目a': {'type': 'DROP_DOWN', 'value': row.value['項目a'].value},
'予測金額a': {'type': 'NUMBER', 'value': row.value['予測金額a'].value},
'元情報': {'type': 'NUMBER', 'value': row.value['予測金額a'].value},
'差分': {'type': 'CALC', 'value': 0},
}
});
});
kintone.app.record.set(now_obj);
});
}
}).then(function(){


event.record['社員名コード参照'].lookup = true; //ルックアップ名を環境に合わせて変更
event.record['見積書No'].lookup = true; //ルックアップ名を環境に合わせて変更
event.record['見積書No'].disabled = true;

for (var i in event.record['予測明細'].value){
event.record['予測明細'].value[i].value['月度a'].disabled = true,
event.record['予測明細'].value[i].value['項目a'].disabled = true;
}

// var tableNo = 0; //ボタンを消したいテーブルの番号。(0始まり)
// [].forEach.call(document.getElementsByClassName("subtable-gaia")[tableNo].getElementsByClassName("remove-row-image-gaia"), function(button){
// button.style.display = 'none';
// });

// return event;

});

// return event;

});

})();

 

eventオブジェクトをreturnしていないことが原因かと思います。

(function() {

    'use strict';

    kintone.events.on(['app.record.create.show'], function(event) {

        var appid_self = 640;

        var filterCond = '見積書No = "' + event.record['見積書No'].value + '"';

        var params_get_id = {

            "app": appid_self,

            "query": filterCond + "order by $id desc limit 1 offset 0",

            "fields": ["予測No"]

        };

    // return 追記
        return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params_get_id).then(function(resp) {

            if (resp.records.length > 0) {

                var yosoku_ID = resp.records[0]["予測No"].value;

                return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {

                    'app': appid_self,

                    'id': yosoku_ID

                }).then(function(resp) {

                    var now_obj = kintone.app.record.get();

                    now_obj.record['予測明細'].value = [];

                    resp.record['予測明細'].value.map(function(row) {

                        now_obj.record['予測明細'].value.push({

                            'value': {

                                '月度a': { 'type': 'DROP_DOWN', 'value': row.value['月度a'].value },

                                '項目a': { 'type': 'DROP_DOWN', 'value': row.value['項目a'].value },

                                '予測金額a': { 'type': 'NUMBER', 'value': row.value['予測金額a'].value },

                                '元情報': { 'type': 'NUMBER', 'value': row.value['予測金額a'].value },

                                '差分': { 'type': 'CALC', 'value': 0 },

                            }

                        });

                    });

                    kintone.app.record.set(now_obj);

                });

            }

        }).then(function() {

            event.record['社員名コード参照'].lookup = true; //ルックアップ名を環境に合わせて変更

            event.record['見積書No'].lookup = true; //ルックアップ名を環境に合わせて変更

            event.record['見積書No'].disabled = true;

            for (var i in event.record['予測明細'].value) {

                event.record['予測明細'].value[i].value['月度a'].disabled = true,

                    event.record['予測明細'].value[i].value['項目a'].disabled = true;

            }

            // var tableNo = 0; //ボタンを消したいテーブルの番号。(0始まり)

            //   [].forEach.call(document.getElementsByClassName("subtable-gaia")[tableNo].getElementsByClassName("remove-row-image-gaia"), function(button){

            //   button.style.display = 'none';

            //   });

      //return コメントアウト解除
            return event;

        });

    });

})();

岡崎 様

ご確認ご回答頂きましてありがとうございます。

// return 追記
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params_get_id).then(function(resp) {

頂いた内容で検証してみた結果ですが、

これまでエラーが出ていなかった、

var now_obj = kintone.app.record.get();

の箇所にて、
Uncaught Error: You cannot call kintone.app.record.get() in handler or during processing a handler.

とエラーが出てしまうのですが、

retuenを付けたことに伴い、他も意識しておかないといけない点などあればご教授頂きたいです。

失礼いたしました。

kintone.app.record.getはイベントハンドラ内では使用できないといったエラーになります。

 

本件の解決策としましては、
now_objをgetでレコード情報を取得していますが、
こちらもイベントオブジェクトに格納できるかと思います。

apiで情報を取得、disabledで入力無効の処理をしたうえで
最終的にreturnで反映される流れです。

//api.then内
var now_obj = {record:event.record};
/*
*省略
*/
//kintone.app.record.set(now_obj); 不要

書き換えが必要最低限で済むように、
now_objの中身のみ書き換えるようにしています。

岡崎 様

有難うございます!

正常に稼働すること確認できました。

>kintone.app.record.getはイベントハンドラ内では使用できないといったエラーになります。

この辺りもっと自分の中に落とし込めるようにしていきたいと思います。