ルックアップフィルードの同期処理について

こんにちは。
kintone apiで、

・ボタンを押す
・ルックアップフィールドに値を入力
・保存ボタンを押す

という機能を実装したいです。

 

その際にルックアップフィールドに代入処理するタイムラグがありますので、setTimeout()を使ってコードを書いているのですが、primiseを使ってルックアップフィールドに値が代入されたら実行するようには出来ませんでしょうか。

 

よろしくお願いいたします。

 

// ボタンクリック時の処理

btn.onclick = () => {

// レコードを取得

constabc= kintone.app.record.get();

// ルックアップフィールドに代入

abc.record.syubetu.value ='A';

abc.record.syubetu.lookup =true;

// レコードを返す

kintone.app.record.set(abc);

setTimeout(() => {

// 保存ボタンをクリック

$('.gaia-ui-actionmenu-save').trigger('click');

},1000);

}

フィールドコードも同じようですが、2日前に回答したスレッド と同じ用件でしょうか?あちらのスレッドに記載した通り、ルックアップの取得を待つような非同期処理はできないので、本当に確実に動作させるのであれば

①ルックアップと同等の機能を自作(レコード取得API)し、Promiseで動作させる
②ルックアップから取得されるフィールドか、ルックアップフィールドのDOMを監視

いずれかになると思います。

 

需要があるかは分かりませんが、②にあたるものだと以下のようになります。Mutation observer等を使うのがスマートかもしれませんが、Promiseで作ると以下のような形になります(ルックアップ成功時の「参照先から~」や失敗時の「データがありません」を監視します)。fieldElementにはデベロッパーツール等から確認できる、フィールドに割り振られてい番号を適用して下さい(Chromeであればルックアップフィールドの上で右クリック→検証を選択すれば「value-xxxxxxx」と記載されています)。

また、当然ですがkintoneで用意されているのクラス名やDOMを多用しているので、kintoneのアップデート等で都度対応が必要になります。

(() => {
    'use strict';

    let fieldElement = 'value-xxxxxxx'; // ルックアップフィールドに振られている番号
    let fieldCode = 'syubetu'; // ルックアップフィールドのフィールドコード
    let spaceId = 'syukin'; // スペースID
    let lookupWait = () => {
        return new Promise((resolve) => {
            setTimeout(() => {
                let field = document.getElementsByClassName(fieldElement)[0];

                if (field.getElementsByClassName('validator-valid-cybozu')[0]?.textContent === '参照先からデータが取得されました。') {
                    resolve(true);
                } else if (field.getElementsByClassName('input-error-cybozu')[0]?.textContent === 'データがありません。') {
                    resolve(false);
                } else {
                    resolve(lookupWait());
                }
            }, 100);
        });
    };

    kintone.events.on([
        'app.record.create.show', 'app.record.edit.show'
    ], (event) => {
        let button = document.createElement('button');

        button.innerHTML = '出勤';
        button.onclick = () => {
            let recordData = kintone.app.record.get(), rec = recordData.record;

            rec[fieldCode].value = 'A';
            rec[fieldCode].lookup = true;

            kintone.app.record.set(recordData);

            lookupWait().then((result) => {
                if (result) document.getElementsByClassName('gaia-ui-actionmenu-save')[0].click();
            });
        };

        kintone.app.record.getSpaceElement(spaceId).appendChild(button);

        return event;
    });
})();

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。