別アプリの更新処理について(動的)

いつもお世話になっております。
現在業務日報(ルート営業日報)をベースに1ユーザが
1日あたり回った顧客を1レコードを使っています。

そのなかで、業務日報のサブテーブルに各顧客情報を顧客マスタから
ルックアップ(会社名+顧客マスタのレコード番号(フィールドコード:顧客番号))
して持ってきています。

こちらのサブテーブル内の各入力行に訪問日時という日時フィールドを作っており、
その値を同じ顧客番号の顧客マスタのレコード内の訪問日時に上書きしたく
javascriptを組んだのですが、ここ2週間以上解決せずに、
ご教示願えればと思い再度投稿させていただきました。


(function () {
“use strict”;
kintone.events.on(‘app.record.create.submit’, ‘app.record.edit.submit’, function (event){
var wRecord = event.record;
var tableRecords = wRecord.Table.value;
var wRecordId = tableRecords[i].value[‘顧客番号’].value;
var Recordtime = tableRecords[i].value[‘訪問日時’].value;
var Table = [];
for (var i = 0; i < tableRecords.length; i++) {
Table.push({
value: {
“訪問日時”: { value: Recordtime },
}});

}
var parm = {
‘app’:1,
‘id’:wRecordId,
‘record’:{
‘訪問日時’:{
‘value’: Recordtime
},
},
};

kintone.api(‘/k/v1/record’,
‘PUT’,
parm,
function(res){console.log(res);},
function(err){console.log(err);});
});
})();

ちなみに1行だけを決め打ちして更新は下記内容で出来た為、同じ内容のjavascriptで行番号だけ変えて力技で実装しようと試みたのですが、実際にサブテーブルの行がない場合、エラーで保存できないと知り愕然としました。。。


(function () {
“use strict”;
kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function (event){
var wRecord = event.record;
var tableRecords = wRecord.Table.value;
//ここで行番号を変えると参照上書き先が変わる
var wRecordId= tableRecords[0].value[‘顧客番号’].value;
//ここで行番号を変えると参照上書き先が変わる
var wDay = tableRecords[0].value[‘訪問日時’].value;

var parm = {
‘app’:1,
‘id’:wRecordId,
‘record’:{
‘訪問日時’:{
‘value’: wDay
},
},
};

kintone.api(‘/k/v1/record’,
‘PUT’,
parm,
function(res){console.log(res);},
function(err){console.log(err);}
)

});
})();

以上、ご教示のほどよろしく御願いいたします。

岩上 さん

まず初めに、kintoneJavaScriptカスタマイズで躓いた場合、↓の記事を参考にデバッグすることをお勧めします。
https://developer.cybozu.io/hc/ja/articles/207613916

いろいろエラーに気付けるかと思います。

1つ目のコードをもとに書き直してみました。

レコードの一括更新API

Promise

上記2つ修正しています。

(function () {
"use strict";
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function (event) {
var wRecord = event.record;
var tableRecords = wRecord.Table.value;
var parm = {
'app': 1, // 顧客マスタのアプリID
'records': []
};
for (var i = 0; i < tableRecords.length; i++) {
var wRecordId = tableRecords[i].value['顧客番号'].value;
var Recordtime = tableRecords[i].value['訪問日時'].value;
var records = {
'id': wRecordId,
'record': {
'訪問日時': {
value: Recordtime
}
}
};
parm.records.push(records);
}
return kintone.api('/k/v1/records', 'PUT', parm).then(function (res) {
console.log(res);
return event;
}).catch(function (err) {
console.log(err);
return event;
});
});
})();

HANSA様

いつもお世話になっております。

ご返信ありがとうございます。

頂いた内容で、ずっと困っていた希望の動作を実現することができました!!

本当に助かりました!有難うございます。

 

また、デバッグに関しましても情報ありがとうございます。こちらはchromeで

使用はしていたのですが、意味を正しく理解できていない点が多かったため

参考にさせていただきます!

 

あと1点質問させて下さい。

こちらで運用を考えた場合、トラブル発生等で同日に同顧客を回るケースもあるかともいますが、

同じレコードで同顧客を選択した場合、重複した顧客番号が発生する為put処理が行われず、

“400 (Bad Request)(レコード(id: 顧客番号ID)の指定が重複しています。”})"

となってしまうのですが、このような場合運用でカバーするしか方法はないのでしょうか。

※同じ顧客は同じレコードに書かない等

 

もし同じ顧客番号で、かつ日時が新しいほうを判定して登録(重複エラー回避)するような構成に

持っていくことは、やはり難しいでしょうか。。。

 

お忙しいところ恐れ入りますが、宜しく願いいたします。

岩上 さん

参考になったとのことで良かったです。
オブジェクトと配列のループについては、カスタマイズにおいて必須なので勉強すると良いと思います。

汚いコードになりましたが、以下で動くと思います。
ライブラリにmoment.jsを使用しているので、別途適用させてください。

putしているパラメータは変数parmに格納されているので、
これをループで回して日付とId比較し、条件によって削除すればできます。

おそらくもっといい書き方があると思いますが。。。

(function () {
"use strict";
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function (event) {
var wRecord = event.record;
var tableRecords = wRecord.Table.value;
var parm = {
'app': 1, // 顧客マスタのアプリID
'records': []
};
for (var i = 0; i < tableRecords.length; i++) {
var wRecordId = tableRecords[i].value['顧客番号'].value;
var Recordtime = tableRecords[i].value['訪問日時'].value;
var records = {
'id': wRecordId,
'record': {
'訪問日時': {
value: Recordtime
}
}
};
parm.records.push(records);
}

for (var j = 1; j < parm.records.length; j++) {
if(parm.records[j].id === parm.records[j-1].id) {
if(moment(parm.records[j].record.訪問日時.value).isAfter(parm.records[j-1].record.訪問日時.value)) {
parm.records.splice(j-1,1);
j--;
} else {
parm.records.splice(j,1);
j--;
}
}
}

return kintone.api('/k/v1/records', 'PUT', parm).then(function (res) {
console.log(res);
return event;
}).catch(function (err) {
console.log(err);
return event;
});
});
})();

 

HANSAさん

いつもお世話になっております。

この機能が実現したかったことです!

本当に助かりました^^

 

カスタマイズやループ・プロミスについても汎用性があると思いますので

未経験ながらこれからもっと勉強して様々な組み合わせを見つけていきます!

 

ここ1ヶ月程この機能を実装するため試行錯誤してもうまくいかず、

このまま実装できずに今年を終えようとしておりまして、非常に焦っておりましたので。。。

お忙しい中ご対応いただき、本当に感謝致します。

 

HANSAさんのおかげで、心配事が一つ減り良い年末年始を過ごせそうです^^

それではHANSAさんもよいお年をお過ごしください。

 

岩上 さん

実現できたとのことで良かったです!

 

また何か詰まったことがありましたら気軽に投稿してみてください^^

よいお年を。