📘

kintone ルックアップ更新プラグイン

2022/09/28に公開

前回の設定画面についての記事のメインの処理のプログラムです。

https://zenn.dev/akaneiy/articles/f25f5d7fe2a27f

コード

(function(PLUGIN_ID){
    "use strict";
    /*PC版*/
    const events = ["app.record.edit.submit.success","app.record.index.edit.submit.success"];
    kintone.events.on(events,function(event){
        const config = kintone.plugin.app.getConfig(PLUGIN_ID);
        const lookupVal = event.record[config.lookup].value;
	
        /*レコードの編集時に更新したいアプリのIDを配列にいれておく*/
        const PutApp = [];
        const keysLength = Object.keys(config).length;
        //行数はオブジェクトの長さからlookupを引き、2で割ると行数になる
        const rows = (keysLength-1)/2;
        let index = 0;
        while(index < rows) {
            PutApp.push([config["appid"+index],config["code"+index]]);
            index++;
        }
	
        let appid,resp,code,response;
        /*社員番号が一致するレコードを取得してレコードを更新する*/
        /*https://developer.cybozu.io/hc/ja/articles/202331474#step2*/
        (async()=>{
            for(let i=0;i<PutApp.length;i++){
                appid = PutApp[i][0];
                code = PutApp[i][1];
                const body = {
                    "app": appid,
                    "query" : code+' = "'+lookupVal+'"',
                    "totalCount": true
                };
                try{
                    resp = await kintone.api('/k/v1/records','GET',body);
                }catch(e){
                    console.log(e);
                    alert("レコード取得に失敗しました。"+e.message);
                    return event;
                };
                
                //取得できたレコードが0件なら何もしない
                if(resp.totalCount !== 0) {
                    const putrecords = CreatePutRecords(resp.records,lookupVal,code);
                    const prams = {
                        app: appid,
                        records: putrecords
                    }
		    
                    try{
                        response = await kintone.api('/k/v1/records','PUT',prams);
                    }catch(e){
                        console.log(e);
                        alert("レコード更新に失敗しました。"+e.message);
                        return event;
                    };
                }
            };
        })();
        return event;
    });
    
    /*更新するレコードのリクエストボディを作成して返す関数*/
    /*https://developer.cybozu.io/hc/ja/articles/201941784#step1*/
    function CreatePutRecords(records,lookupVal,code) {
        let putRecords = [];
        records.forEach(function(record,index){
            putRecords[index] = {
                id: record.$id.value,
                record: {
                    [code] : {
                        value : lookupVal
                    }
                }
            }
        });
        //console.log(putRecords);
        return putRecords;
    }
})(kintone.$PLUGIN_ID);

設定情報を扱いやすくする

const config = kintone.plugin.app.getConfig(PLUGIN_ID);
const lookupVal = event.record[config.lookup].value;
/*レコードの編集時に更新したいアプリのIDを配列にいれておく*/
const PutApp = [];
const keysLength = Object.keys(config).length;
//行数はオブジェクトの長さからlookupを引き、2で割ると行数になる
const rows = (keysLength-1)/2;
let index = 0;
while(index < rows) {
    PutApp.push([config["appid"+index],config["code"+index]]);
    index++;
}

ForEachはasync/await非対応

最初はForEachでループしようとして、挙動がおかしい!としばらく悩みました。

ダメな例
PutApp.forEach(async function(app){
	//処理
});

これでは思うように動きません。

正しく動く
(async()=>{
    for(let i=0;i<PutApp.length;i++){
	//処理
    };
})();

方法はいくつかあると思いますが、私はfor文に書き換えて、asyncな即時関数で囲みました。

(async()=>{
	/*awaitする処理*/
})();

変数の値を文字列として扱いたい

ダメな例
records.forEach(function(record,index){
    putRecords[index] = {
	id: record.$id.value,
	record: {
	    code : {
		value : lookupVal
	    }
	}
    }
});
正しく動く
records.forEach(function(record,index){
    putRecords[index] = {
	id: record.$id.value,
	record: {
	    [code] : {
		value : lookupVal
	    }
	}
    }
});

オブジェクトに引数codeの値を入れたいのですが、ここで下記のようにしてしまうと"code"として扱われてしまいますが、[]で囲むと変数として扱うことが出来ます。

Discussion