時間計算:ラジオボタンの選択肢によって計算方法を変えたい

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

https://cybozudev.zendesk.com/hc/ja/articles/203331050-%E7%AC%AC8%E5%9B%9E-%E7%B0%A1%E5%8D%98%E3%81%AA%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86%E3%81%AB%E6%8C%91%E6%88%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

を参考に、ラジオボタンの選択肢によって、計算結果の表示を変えたいのですが

下記コードで試したところ、

①計算が反映されず0になってしまう。

②申請付与 / ラジオボタン (申請/付与)で付与を選択すると保存前にエラーが発生する(フィールドにNaNと表示され、数字でなければなりません。と出る)

・そもそも、設置するフィールドが数値ではないのでしょうか?

・計算フィールドの場合、表示形式で時間を選択できるので、表示形式を何か指定すればいいのでしょうか?

・計算式自体がおかしいのか?

質問内容が長々と分かりづらくて申し訳ありませんが、どなたかご教授頂けると幸いです。

宜しくお願い致します。

【設置フィールド】

申請付与 / ラジオボタン (申請/付与)

種類 / ラジオボタン (有給休暇/夏季休暇/冬期休暇)

出勤時間 / 時刻

退勤時間 / 時刻

休憩時間 / 数値

付与日数 / 数値

取得時間有給 / 数値

取得時間夏休 / 数値

取得時間冬休 / 数値

付与時間有給 / 数値

付与時間夏休 / 数値

付与時間冬休 / 数値

 

(function() {

"use strict";

var events1 = [
'app.record.create.submit',
'app.record.edit.submit',
'app.record.create.show',
'app.record.edit.show'];

kintone.events.on(events1, function(event) {

var record = event.record;
var attendance = record.出勤時間.value;
var officeWork = record.退勤時間.value;
var breakTime = record.休憩時間.value;
var grantedDays = record.付与日数.value;

//休暇時間の休暇時間の算出
var acquisitionTime = officeWork - attendance - (60 * 60 * breakTime);
var grantTime = (officeWork - attendance - (60 * 60 * breakTime)) * grantedDays;


//申請付与で「申請」が選択されていた時
if(record.申請付与.value === "申請"){
//種類で「有給休暇」が選択されていた時
if(record.種類.value ==="有給休暇"){
record.取得時間有給.value = grantedDays,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

//種類で「夏季休暇」が選択されていた時
}else if(record.種類.value === "夏季休暇"){
record.取得時間有給.value = 0,
record.取得時間夏休.value = grantedDays,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

//種類で「冬季休暇」が選択されていた時
}else{
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = grantedDays,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

}

//申請付与で「付与」が選択されていた時
}else if(record.申請付与.value === "付与"){
//種類で「有給休暇」が選択されていた時
if(record.種類.value ==="有給休暇"){
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = grantTime,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

//種類で「夏季休暇」が選択されていた時
}else if(record.種類.value === "夏季休暇"){
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = grantTime,
record.付与時間冬休.value = 0;

//種類で「冬季休暇」が選択されていた時
}else{
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = grantTime;

}

}
return event;
});

})();

 

 

 

岡田美緒さん

設置フィールドも、上記コードの考え方も問題ないと思います。

ただし、officeWork - attendance の部分が NaN となります。

こちらの2つの変数の元となるkintoneのフィールドは、時間形式なので、JavaScriptの内部にて、

例えば 18:00 - 09:00 という様な計算式はなりたたないという事なのかなと。

JavaScriptでの計算方法があるかもしれませんが、手っ取り早いのは、画面上に

勤怠秒 計算フィールド(計算式は 退勤時間-出勤時間)

この様な計算フィールドを置いて、計算をkintoneに任せるとよいかなと。

こうすることで、officeWork - attendanceを、この勤怠秒のフィールドで置き換えられるので、その前提で

コードを書けば、NaNにはならないと思います。

最終的にほしい数字が、秒なのか日なのか、そのあたりはコードでうまいこと変換してあげてください。

追記

もしかしたら、grantTime そのものが画面上の計算フィールドで計算可能かもしれません。

松村さま

ご回答ありがとうございます。

 

Javascript内での計算は難しいようですね…

kintone上で計算出来るようににフィールドを変更し、新たにフィールドを設置し

コードを書き換えました。が、ここでも問題が発生してしまいました(^-^;

【追加フィールド】

①取得有給 / 数値

②取得夏休 / 数値

③取得冬休 / 数値

④付与有給 / 数値

⑤付与夏休 / 数値

⑥付与冬休 / 数値

⑦計算 / 計算 (退勤時間-出勤時間-(60*60*休憩時間)

⑧取得時間有給 / 計算 (計算*取得有給)

⑨取得時間夏休 / 計算 (計算*取得夏休)

⑩取得時間冬休 / 計算 (計算*取得冬休)

⑪付与時間有給 / 計算 (計算*付与有給)

⑫付与時間夏休 / 計算 (計算*付与夏休)

⑬付与時間冬休 / 計算 (計算*付与冬休)

ラジオボタンで選択した項目によって、追加した数値フィールド(①~⑥)へ数値が入るようにコード内で計算式を入れてみたのですが、

選択肢を変更しても、変化がありません。

・returnの場所がおかしいのか?

・イベントハンドラーが違う?

・数値への入力値を変えるのは不可能?

ご回答いただけると幸いです。

宜しくお願い致します。

 

//時間残数計算

(function() {

"use strict";

var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.申請付与',
'app.record.edit.change.申請付与',
'app.record.create.change.種類',
'app.record.edit.change.種類'];

kintone.events.on(events, function(event) {

var record = event.record;

var daysAcquired = 1;
var grantedDays = record.付与日数.value;


//申請付与で「申請」が選択されていた時
if(record.申請付与.value === "申請"){
//種類で「有給休暇」が選択されていた時
if(record.種類.value ==="有給休暇"){
record.取得有給.value = daysAcquired * 1,
record.取得夏休.value = daysAcquired * 0,
record.取得冬休.value = daysAcquired * 0,
record.付与有給.value = grantedDays * 0,
record.付与夏休.value = grantedDays * 0,
record.付与冬休.value = grantedDays * 0;

//種類で「夏季休暇」が選択されていた時
}else if(record.種類.value === "夏季休暇"){
record.取得時間有給.value = daysAcquired * 0,
record.取得時間夏休.value = daysAcquired * 1,
record.取得時間冬休.value = daysAcquired * 0,
record.付与時間有給.value = grantedDays * 0,
record.付与時間夏休.value = grantedDays * 0,
record.付与時間冬休.value = grantedDays * 0;

//種類で「冬季休暇」が選択されていた時
}else{
record.取得時間有給.value = daysAcquired * 0,
record.取得時間夏休.value = daysAcquired * 0,
record.取得時間冬休.value = daysAcquired * 1,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

}

//申請付与で「付与」が選択されていた時
}else if(record.申請付与.value === "付与"){
//種類で「有給休暇」が選択されていた時
if(record.種類.value ==="有給休暇"){
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = grantTime,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = 0;

//種類で「夏季休暇」が選択されていた時
}else if(record.種類.value === "夏季休暇"){
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = grantTime,
record.付与時間冬休.value = 0;

//種類で「冬季休暇」が選択されていた時
}else{
record.取得時間有給.value = 0,
record.取得時間夏休.value = 0,
record.取得時間冬休.value = 0,
record.付与時間有給.value = 0,
record.付与時間夏休.value = 0,
record.付与時間冬休.value = grantTime;

}

}
return event;
});

})();

 

 

 

岡田美緒さん

・returnの場所がおかしいのか? → 正しい

・イベントハンドラーが違う? → 正しい

・数値への入力値を変えるのは不可能? → 正しい

そのうえで、最新ソースの問題点らしきものは、

1)grantTime という変数が宣言されていない(正しくは、grantedDays?)

2)途中から数値項目ではなく、計算項目に値を代入しようとしている。(record.取得有給.value = daysAcquired * 1 等)

とりあえずこの2点が目に止まりました。

実際に動作させながら、ブラウザのコンソールを見ると、1)の様な問題はエラーとして表示されるので、見つけやすいかと思います。

↓ こんな感じで

 

失礼

誤)数値への入力値を変えるのは不可能? → 正しい

正)数値への入力値を変えるのは不可能? →  可能です。

 

松村さま

ご回答ありがとうございます。

ご指摘頂いた箇所の修正を行い、動作を確認してみたいと思います!

またわからないことがあれば質問させていただきます。

ありがとうございました!m(__)m