備忘ですが、

誰かの役に立てばいい

【kintone】Handsontable+SweetAlert2でルックアップ入力

やりたいこと→Handsontableでルックアップフィールドの簡単入力

ライブラリ

Handsontable(v6.2.2)
SweetAlert2(v7.33.1)

JavaScript

※一部抜粋。kintone x handsontable · GitHubをベースにさせていただいています。
saveRecords関数、getRecords関数については上記をご覧ください。

var searched = false; //ループ防止用
var container = document.getElementById('sheet');
var setting = [];
setting = {
    data: data,
    columns: [
        {data: "ルックアップ.value", type:'text', className: 'lookup'},
    ],
    afterChange: function (change, source) {
        var self = this;
        // データ読み込み時はイベントを終了
        if (source === 'loadData') {
            return;
        }
        var c = change;
        var TD = hot.getCell(c[0][0],hot.propToCol(c[0][1]));
        if(TD.classList.contains("lookup")){
            if(!searched){
                //クラス名「lookup」、searchedがfalseの時lookupFunc関数を実行
                lookupFunc(change);
            }else{
                saveRecords(hot.getSourceData(), change, function(resp){
                    getRecords(function(resp){
                        hot.loadData(resp.records);
                    });
                });
                searched = false;
            }
        }else{
            // kintoneのレコードを更新、追加する
            saveRecords(this.getSourceData(), change, 
                function(resp){
                    console.dir(resp);
                    getRecords(function(resp){
                        self.loadData(resp.records);
                    },
                    function(resp){
                        console.dir(resp);
                    });
                }, 
                function(resp){
                    console.dir(resp);
                });
        }
    }
};
hot = new Handsontable(container, setting);
//モーダル表示用
var lookupFunc = function(change){
    var row = change[0][0];
    var col = hot.propToCol(change[0][1]);
    var afterValue = change[0][3];
    //変更後セルが空の時はすぐ更新
    if(afterValue === ""){
        searched = true;
        hot.setDataAtCell(row,col, '');
        hot.selectCell(row + 1, col);
    }else{
        var lookupField = change[0][1].replace('.value', '');
        var LookupTargetAppId = kintone.app.getLookupTargetAppId(lookupField);
        //ルックアップコピー元フィールドの取得用
        kintone.api(kintone.api.url('/k/v1/app/form/fields', true), 'GET', {app:kintone.app.getId()}, function(resp) {
            var lookupTargetField = resp.properties[lookupField].lookup.relatedKeyField;
            //ルックアップコピー元のアプリ内を検索
            kintone.api('/k/v1/records', 'GET', {app: LookupTargetAppId, query: lookupTargetField +' like "' + afterValue + '"', fields: [lookupTargetField]}, function(resp) {
                var records = resp.records;
                switch(records.length){
                    case 0:  //検索結果0の時、該当なしモーダルの表示
                        Swal.fire({
                            title: '該当なし',
                            animation: false,
                            onClose: function(){
                                searched = true;
                                hot.setDataAtCell(row,col, '');
                                hot.selectCell(row, col);
                            }
                        });
                        break;
                    case 1:  //検索結果が1つの時、値をセット
                        searched = true;
                        hot.setDataAtCell(row,col, records[0][lookupTargetField].value);
                        break;
                    default :  //検索結果をラジオボタンで表示
                        var html = '';
                        for(let i = 0; i < records.length; i++){
                            var myvalue = records[i][lookupTargetField].value;
                            html += '<label class="radio"><input type="radio" name = "msform" id="' + myvalue + '" value="' + myvalue + '"'
                            + '>' + myvalue + '</label><br>';
                        }
                        Swal.fire({
                            html:html,
                            preConfirm: function(){
                                var mytext = [];
                                var msform = document.getElementsByName("msform");
                                for (let i = 0; i < msform.length; i++){
                                    if(msform[i].checked){
                                    mytext.push(msform[i].value);
                                    }
                                }
                                return mytext;
                                },
                                animation: false,
                        }).then(function(select){
                            if (select.value) {
                                searched = true;
                                hot.setDataAtCell(row, col, select.value[0]);
                                hot.selectCell(row + 1, col);
                            }
                        });
                        break;
                }
            });
        });
    }
};