新規投稿
フォローする

フィールドに作ったボタンで保存ボタンを押す動作。

背景・実現したいこと

 出勤ボタンを押したときに、勤怠種別(ルックアップ)に反映させて保存ボタンを押す流れを作りたい。

利用したソースコード

 

こちらのコードを使用してボタンを作成→押下で勤怠種別にAを入力→保存ボタンを押すというコードを作りたいのですが

同期処理がうまくいかず、勤怠種別の入力を待たずに保存ボタンが押されます。コールバックも試したのですが、何か根本的に間違っている気がします。

ご回答よろしくお願い致します。

0

3件のコメント

Avatar
mls-hashimoto

Promiseを使う必要はないように見えます(ルックアップの取得完了を待つような非同期処理はできません)。確実にルックアップの取得完了を待って保存ボタンを押させるのであれば、ルックアップから反映されるフィールドのchangeイベントを使うのが良いでしょう(出勤ボタン押下時の動作はルックアップの取得までにし、ルックアップから反映されるフィールドのchangeイベントで保存ボタン押下等)。

(この場合ルックアップの再取得でフィールドの値が変わらない場合は動作しないので、本当に正確に動作させるのであればルックアップフィールドのバリデーター(「参照先からデータが取得されました」のラベル)を監視する等になりますが、今回は必要ないように見えます)

setTimeoutを使うのであれば

(() => {
    'use strict';

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

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

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

            kintone.app.record.set(recordData);

            setTimeout(() => {
                document.getElementsByClassName('gaia-ui-actionmenu-save')[0].click();
            }, 1000);
        };

        kintone.app.record.getSpaceElement('syukin').appendChild(button);

        return event;
    });
})();

こんな感じになりますが、ルックアップの取得が遅れることもあり、確実に動作するわけではありません。

 

また、ルックアップの自動取得はドキュメント に書かれている通り取得結果が1件だった場合にのみ動作します。

0
Avatar
t.imai

思ってる動作になりました!

ただ、このかんじですとセットタイムした時間内に処理が完了していない場合はエラーになってしまいますね・・・

ありがとうございました!

0
Avatar
mls-hashimoto

t.imai さま

同じような質問が他であったので、そちらに確実に処理させる方法を記載しました。

0
サインインしてコメントを残してください。