
テーブル内の数値を科目ごとに集計し、フィールドに入れるJavaScript
これは2017年にcybozu developer networkのフォーラムにて、kintone用プラグインの販売で有名なrex0220様が私の質問に対して書いてくださったJavaScriptです。質問当日の夕方にサラッと下記のJavaScriptを貼り付けて下さった早さにビックリ!そして感謝感謝です。
5年経ったいまでも私が作った「旅費計算アプリ」内で稼働しています。汎用性もかなり高いと思いますので紹介させていただきます。
実現したかったことは下記の画像の通り。
テーブル内の金額を、科目ごとに集計したいというものです。
なんとかスペースフィールドにリスト表示することはできたのですが、このままでは合計値の二次利用ができません。どうしてもこの合計値を数値フィールドに入れたいのです。

このようになりました。すごい!!

以下がコードです。
(function() {
"use strict";
var fields = ['科目', '金額', 'Table'];
var kamokuInfos = {
'切符代': '切符代合計',
'宿泊費': '宿泊費合計',
'車関係': '車関係合計',
}
var events = ["app.record.edit.show", "app.record.create.show"];
fields.forEach(function(field) {
events.push("app.record.edit.change." + field);
events.push("app.record.create.change." + field);
})
var totalFields = [];
Object.keys(kamokuInfos).forEach(function(kamoku) {
var tcode = kamokuInfos[kamoku];
if (totalFields.indexOf(tcode) < 0) {
totalFields.push(tcode);
}
});
kintone.events.on(events, function(event) {
var record = event.record;
totalFields.forEach(function(tcode) {
record[tcode].value = 0;
record[tcode].disabled = true;
});
var subTable = record['Table'].value;
subTable.forEach(function(rows) {
var kamoku = rows.value['科目'].value;
if (Object.keys(kamokuInfos).indexOf(kamoku) >= 0) {
var tcode = kamokuInfos[kamoku];
if (rows.value['金額'].value) {
record[tcode].value += Number(rows.value['金額'].value);
}
}
});
return event;
});
})();
科目(=フィールドコード名)は3つ設定されていますが、増やす事ができます。
他にも色々応用できそうで便利ですね!
