新規投稿
フォローする

2ヵ月後の日付の設定について

2ヵ月ごとの日付を設定したいと思っています。

第1回申請 ( 2020/12/25 ) ~ ( 2021/2/24 )
第2回申請 ( 2021/2/25 ) ~ ( 2021/4/24 )
第3回申請 ( 2021/4/25 ) ~ ( 2021/6/24 )

…以下同様

 

終了日(2ヵ月後の日付)について、最初は「日付や日時フィールドの N 年後などを計算したい」と「付の値に応じて月末日を表示したい(うるう年を考慮した表示)」を参考にして、月の日数を取得し、その取得日を以下のように設定して取得しようと思ったのですが、月の日数関係なく、対象期間は固定なので当たり前ですがうまくいきません。

「IF(第1回_開始日<>"",第1回_開始日+(月の日数*60*60*24)-(60*60*24*1),"")」

今までエクセルで管理していた際には、EDATE関数で取得した数値-1でうまくいっていました。

 

①この場合、単純に終了日に月部分の2ヵ月後、日部分の-1の日にちを直接設定するという方法だと、例えば開始日が12/1だった場合は計算がおかしくなってしまいます。どのように対処すればよいでしょうか。

②日付として認識されるよう、日付(例:2012-08-06)形式で表示させたいと思っております。可能でしょうか。

初歩的なことで申し訳ないのですが、ご回答いただけますと幸いです。

0

16件のコメント

Avatar
kobaharu

ishikawayuito様

ありがとうございます。

Moment.js はメンテナンスモードになっているようなので、 Luxon を利用してみようと思うのですが初心者すぎてよくわからず…。これはソースコードをダウンロードした後、必要な日付のみ取得できるように編集し、それを直接項目に表示するような処理を書くのでしょうか。

0
Avatar
ishikawayuito
0
Avatar
kobaharu

ishikawayuito様

こちらでもありがとうございます。

教えていただいたページを参考に試してみたところ、

「カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。
- event.record['日付'].value が不正です。」というエラーが発生し、
デバックしてみると、最初の日付の取得からうまくいっていませんでした。

現在、計算の起算日としている項目は計算フィールドで、条件によって異なる日付が表示されるようになっています。
そのせいでエラーが出ているのだと思うのですが、
自分で入力した日付(日付フィールド)からしか日付の取得やLuxonでの処理を行うことは難しいのでしょうか。

理解不足でいろいろお聞きしてしまいすみません。ご存じでしたら教えていただきたいです。

kobaharuにより編集されました
0
Avatar
ishikawayuito

kobaharu様

条件により違う日付の取得というのは計算フィールドで計算された日付が日付フィールドに入るという認識で会っていますでしょうか。

もしくは計算フィールドに日付が入っているのでしょうか。

どの処理でもフィールドは取得できると思うので、

フィールドの取得ができていないのはフィールドコードが間違っているか、

function(event)の外で値を取得しようとしているかどちらかだと思います。

原因部分のjavascriptがあると認識しやすいです。

0
Avatar
kobaharu

ishikawayuito様

計算フィールドに日付が入っている状況ですが、こちらについてはいろいろ試したところ無事取得できるようになりました。

ただ、最後の日付フィールドに格納する際にエラーが出てしまっている状況です。

parseInt()で文字列→数値へ変換する際に入る数値が正しいものかわかっていないのですが、この処理が原因で、これ以降の処理がおかしくなっているような気がします。

(function () {
"use strict";
kintone.events.on(['app.record.create.change.対象日1',
'app.record.edit.change.対象日2'], function (event){
//レコード取得
var record = event.record;

//日付フィールド取得
var 開始日 = record['第1回申請_対象期間開始日'].value;

//.substring()で年月日を切り出し
var 開始日_substring = 開始日.substring(0);

//.parseInt()で文字列→数値へ変換 ★ここがうまくいっていない?
var 開始日_substring_parseInt = parseInt('開始日_substring',10);

//DateTime.local(yyyy,mm,dd)で指定日を取得、
開始日_substring_parseInt = luxon.DateTime.local(開始日_substring_parseInt);

//2月後の情報を取得
var 開始日_substring_parseInt_matsu = 開始日_substring_parseInt.plus({months: 2});

//日付フィールドに合致したフォーマットに変更
開始日_substring_parseInt_matsu = 開始日_substring_parseInt_matsu.toFormat('yyyy-MM-dd');

//日付フィールドに格納 ★ここでエラー
record['終了月_2ヵ月後'].value = 開始日_substring_parseInt_matsu;

return event;
});
})();
kobaharuにより編集されました
0
Avatar
ishikawayuito

自分もluxonは使ったことがなかったので少し検証してみました。

こちらのコードでluxonが使えることが確認できました。

計算フィールドではなく日付フィールドを取得ですが。。

計算フィールドを切り抜いた際 どのような形で切り抜いているのでしょうか。

文字列から数値は変換不要かと思います。

luxon.DateTime.local こちらの記載ですと値の設定ではなく、ローカルの時間すなわち現在日付がとられてしまいますので

luxon.DateTime.fromISOこちらが正しいと思います。

(function() {
'use strict';
kintone.events.on('app.record.edit.show', function(event) {
var 日付 = event.record.日付_0.value;
console.log(luxon.DateTime.fromISO(日付).toFormat('yyyy-MM-dd'));
});
})();
ishikawayuitoにより編集されました
0
Avatar
kobaharu

ありがとうございます。

なぜか計算フィールドの日付がうまく取得できなくなってしまいました。対象日1か対象日2を入力したときに処理が動くようになっておりますが、開始日の計算(どの値を入れるかの判定)がされる前に処理が動いていて、何も取得できない状況です。取得できていると思っておりましたが、別の項目と勘違いしていたのかもしれません。計算フィールドの値は全てそのような状況で取得できておりません。

一方、別の日付のフィールドから日付取得を試したところ、.plus({months: 2});のところで「Uncaught TypeError」というエラーが出て止まってしまいました。

kobaharuにより編集されました
0
Avatar
kobaharu

【追記です】

計算フィールドの日付ですが、うまく取得できる場合とできない場合があるようです。もう少し調べてみます。

計算フィールドから取得できた際も、.plus({months: 2});のところで「Uncaught TypeError」というエラーが出ている状況です。

kobaharuにより編集されました
0
Avatar
ishikawayuito

①計算フィールドの値がうまく取得できない件について

kintoneは設定しているjavascriptが上から順に実行されていきます。なのでファイルの順番を意識すると治るかもしれません。 

②日付フィールドでうまく処理が通らない件について

下記のコードで日付フィールドに設定した値の三日後がこれでとれるようになると思います。

(function() {
'use strict';
kintone.events.on('app.record.edit.show', function(event) {
var 日付 = event.record.日付_0.value;
var date = luxon.DateTime.fromISO(日付)  ここを外したら取得できるようになりました。//.toFormat('yyyy-MM-dd');
var threeDaysLater = date.plus({days: 3});
console.log(日付);
console.log(threeDaysLater); 

});
})();

 

ishikawayuitoにより編集されました
0
Avatar
kobaharu

①計算フィールドの日付が取得できるのは、一度保存済みのレコードの場合で既に計算した日にちが入っていたからでした。レコード新規追加の場合は取得できないようです。

ファイルの順番の件、初めて知りました。ちなみに現在、計算式は設定画面より計算フィールドの「計算式」に直接入れている状況です。この処理自体をjavascriptでする必要があるのでしょうか。

②試してみます。ありがとうございます。

0
Avatar
ishikawayuito

eventを確認してみました。

計算フィールドはchange.eventを拾わないそうです。

なので開始日入力でchangeで拾いそれをjsで計算し終了日に格納するやり方が良いかと思います。

kobaharu様と同じ動きを自分もしたい事象が過去にありましてmoment.jsでコードを書いていますがイメージです。

(function() {
'use strict';
kintone.events.on(['app.record.edit.change.開始日時','app.record.create.change.開始日時'], function(event) {
var record = event.record;
var start = record.開始日時.value; //**:**
moment.locale('ja');
var 開始日時 = moment(開始).add(1,'hours').format();
record.終了日時.value = 開始日時;
return event;
});
})();
0
Avatar
ishikawayuito

いままでluxonのお話をずっとしていたので申し訳ございません。

momentの定義ですが、JSEdit for kintoneプラグインは導入していますでしょうか?していましたら下にライブラリのところにあります。

導入していなければ

https://js.cybozu.com/momentjs/2.15.1/moment.min.js

https://js.cybozu.com/momentjs/2.15.1/moment-with-locales.min.js

こちらの2つをurl指定でjavascriptに設定していただければ使えると思います。

0
Avatar
kobaharu

こちらこそ理解不足で申し訳ないです。エラー解消しました。

ちなみに、きっちりと理解しきれていないのですが、今までの2ヵ月後の計算処理のJSファイルとまた別に、この計算(起算日を取得するためのもの)のJSファイルを作成し、こちらを先に実行するようにするということですよね…?

0
Avatar
ishikawayuito

kobaharu様がどういった流れで起算日、2か月後の計算処理というのが自分もいまいちつかめてなくて。。。

流れとしては起算日から開始日、終了日をもとめるといった形でしょうか。この流れでしたら

起算日のjsを上に、開始日終了日を求めるjsを下にするとうまく処理が回ると思います。

0
Avatar
kobaharu

はじめから詳しく説明できておらずわかりにくくてすみません。
具体的には育児休業給付金の対象期間の計算をしたいと思っておりまして、

流れとしては出産予定日(対象日1)と出産日(対象日2)のどちらかor両方を入力して、
その出産予定日と出産日の入力状況によって
産前休業・産後休業・育児休暇(予定と確定・場合によって予定のみ)の期間を自動で出すようにしているのですが、
その後の、育児休業給付金の期間(予定or確定)を算出するようにしたいというのが今回の質問です。

初回の育児休業給付金の期間の開始日は
IF(育児休業期間_開始確定<>"",育児休業期間_開始確定,育児休業期間_開始予定)としているように、
出産予定日と出産日を入力することによって
自動計算されるフィールドを休暇の種類ごとに作成している状況です
(これも全て設定画面より行っています)

これらの処理についても全てjsで行ったほうが良いということですよね…。

kobaharuにより編集されました
0
サインインしてコメントを残してください。