こんにちは。
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;
});
})();
system
(system)
クローズされました:
3
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。