【kintone】テーブルの数値列に空欄が存在する状態で合計を出す方法は?

初めて質問させていただきます。
見積書のテーブルの各行に「単価」「数量」とそれを自動計算した「小計」が存在します。そして、テーブル外に「小計」を自動計算した「総合計」を出しています。
プリントクリエイタで印刷する際に、見積書の項目として金額部分が空欄としたいものがあります。
そのため、同じテーブル内に「単価コピー」「数量コピー」「小計コピー」欄を作成し、それぞれに値を入れる際に「0」ならば空欄となるよう、以下のようにJSを作成しましたが、更新画面を開いても期待する動作とならず、保存もできなくなります。

/**
* テーブル名:table
* 数値フィールド:tan 単価
* 数値フィールド:tan_0 単価コピー
* 数値フィールド:kaz 数量
* 数値フィールド:kaz_0 数量コピー
* 計算フィールド:kin 小計
* 数値フィールド:kin_0 小計コピー
*/
(function() {
“use strict”;
// 登録時、編集時のsubmit前処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var tableRecords = event.record.table.value;
var a = tableRecords.value.tan.value;

// aが0の時は空欄にする
if (a = 0) {
    tableRecords.value.tan_0.value = "";
} else {
    tableRecords.value.tan_0.value = a;
}

var b = tableRecords.value.kaz.value;

// bが0の時は空欄にする
if (b = 0) {
    tableRecords.value.kaz_0.value = "";
} else {
    tableRecords.value.kaz_0.value = b;
}

var c = parseFloat(tableRecords.value.kin.value);

// cが0の時は空欄にする
if (c = 0) {
    tableRecords.value.kin_0.value = "";
} else {
    tableRecords.value.kin_0.value = c;
}

return event;

});

})();

ご教授いただけますでしょうか。よろしくお願いいたします。

sawa さん

こちらに書いてある通り、テーブルの取得時のレスポンスでは<フィールドコード>.valueは配列となっています。

そのためtableRecordsは配列なのでtableRecordsの各要素に対して操作を行う必要があると思われます。

瀧ヶ平 さん

早速のお返事、ありがとうございます。

アドバイス通りに以下のように修正してみました。(b、cも同様に修正)

// aが0の時は空欄にする
if (a = 0) {
    tableRecords.value['koumoku'].value = ;
    tableRecords.value['tan'].value = ;
    tableRecords.value['kaz'].value = ;
    tableRecords.value['dropdown'].value = ;
    tableRecords.value['kin'].value = ;
    tableRecords.value['tan_0'].value = "";
    tableRecords.value['kaz_0'].value = ;
    tableRecords.value['kin_0'].value = ;
    tableRecords.value['bikou'].value = ;
} else {
    tableRecords.value['koumoku'].value = ;
    tableRecords.value['tan'].value = ;
    tableRecords.value['kaz'].value = ;
    tableRecords.value['dropdown'].value = ;
    tableRecords.value['kin'].value = ;
    tableRecords.value['tan_0'].value = a;
    tableRecords.value['kaz_0'].value = ;
    tableRecords.value['kin_0'].value = ;
    tableRecords.value['bikou'].value = ;
}

今回は修正画面から保存はできるようになりました。ただし、期待する動作とはなりませんでした。
他にお気づきの点ありましたら、お願いいたします。

sawa さん

tableRecordsは配列となっており、テーブルの各行のデータがtableRecordsの要素となり、tableRecords[n]のような形でn番目の行のデータオブジェクトを取得することになります。

また、一つ前では指摘し忘れていたのですが、JavaScriptでは’=‘は代入の演算子のため、この場合は条件式には’='ではなく '=='を 使うのが適切です。

そのため、 var tableRecords = … 以下のコードを

for(var i =0; i < tableRecords.length; i++){
  var data = tableRecords[i];
  var a = data.tan.value;
  if(a == 0){
    data.tan_0.value = "";
  } else {
    data.tan_0.value = a;
  }

  var b = data.kaz.value;
  if(b == 0){
    data.kaz_0.value = "";
  } else {
    data.kaz_0.value = b;
  }

  var c = parseFloat(data.kin.value);
  if(c == 0){
    data.kin_0.value = "";
  } else {
    data.kin_0.value = c;
  }
}

return event;

の様にすれば解決すると思います。

なにか問題がありましたらお気軽にご質問ください。

瀧ヶ平 さん

ご教授いただいたように、以下のように作成してみましたが、やはりうまく動作しませんでした。

(function() {
“use strict”;
// 登録時、編集時のsubmit前処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var tableRecords = for(var i =0; i < tableRecords.length; i++){
var data = tableRecords[i];
var a = data.tan.value;
if(a == 0){
data.tan_0.value = “”;
} else {
data.tan_0.value = a;
}

var b = data.kaz.value;
if(b == 0){
  data.kaz_0.value = "";
} else {
  data.kaz_0.value = b;
}

var c = parseFloat(data.kin.value);
if(c == 0){
  data.kin_0.value = "";
} else {
  data.kin_0.value = c;
}

}

return event;

});

})();

「tan」のみでもやってみましたがだめなようです。(保存はできます。)
何か手がありましたらお教えください。

sawa さん

説明が不足して申し訳ありません。

var tableRecords = event.record.table.value;

の行以下を先ほどのコードに差し替える、という意味です。

瀧ヶ平 さん

お返事ありがとうございます。
たぶんそういう意味かなあ、と思い、「var tableRecords = event.record.table.value;」の次の行から埋め込んだのですが、そうすると保存もできなくなったため、あのように置換しました。
今もう一度指示通りにしてみましたが、やはり保存もできませんでした。

sawaさん

すいません私のコードにミスがありました。

var data = tableRecords[i];

の部分を

data = tableRecords[i].value;

とすれば問題ないと思います。また問題ありましたらご質問ください。

瀧ヶ平 さん

ありがとうございました!
最初はだめでしたが、
「data = tableRecords[i].value;」の前に「var」をつけて
「var data = tableRecords[i].value;」としたところ、完璧に動作しました!
本当にありがとうございました!^^

たびたびコードにミスがあり申し訳ありません。

解決したようでよかったです。