📘
kintone ルックアップ更新プラグイン
前回の設定画面についての記事のメインの処理のプログラムです。
コード
(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