翌月末の取得方法

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

『請求日』を入力すると自動的に『支払期限日』に翌月末が入力されるようにしたいのですが、下記よくある質問では「31日」や「28日」の場合に適応できません。

※日付フォームを利用しています

https://faq.cybozu.info/alphascope/cybozu/web/kintone/Detail.aspx?id=2097&isCrawler=1

「翌月末」という計算方法はないのでしょうか?

JavaScriptでの対応でも大丈夫です。

よろしくお願い致します。

Yamamuraさんこんにちは。プロジェクト・アスノートの松田です。

moment.jsを使うと、月末日の取得ができます。

ググるといろいろ活用法が出てきますので、ぜひ参考にしてみてください!

松田さま

お世話になっております。返答ありがとうございます。
JavaScriptのかなりの初心者でお見苦しいコードになっているのですが、アドバイスをいただけないでしょうか?
下記ですとまったく表示されません…
よろしくお願い致します。

 

(function () {
"use strict";

//レコードの新規、追加、編集、詳細画面で適用する
var events = ['app.record.create.show',
'app.record.detail.show',
'app.record.create.change.source',
'app.record.edit.show',
'app.record.edit.change.source'];

kintone.events.on(events, function(event) {
var date = moment(record['請求日']['value']);
record['支払期限'].value = moment(date).add('month',1).endOf('month').format();
});
})();

Yamamura さん

こんにちは!

 

今回、請求日が入力されたら、という要件のようですので、

イベントとして以下を登録するほうがよいかと!

app.record.create.change.請求日,
app.record.edit.change.請求日

 

“source” というフィールドコードが設定されているフィールドは不明ですが、

ご記載の処理では、“source” というフィールドコードのフィールドの値が

変更された場合に、動作する内容となってます。

 

また、レコードに値を設定した場合は、event を返してあげないと、

値がセットされないので注意です><

 

簡単にですが、処理を書いてみました!

参考になれば、嬉しいです。

 

(function () {
moment.locale('ja');
const evs = ['app.record.create.change.請求日', "app.record.edit.change.請求日"];

kintone.events.on(evs, function (e) {
const rec = e.record;
rec.支払期限日.value = moment(rec.請求日.value).add('months', 1).endOf('months').format("YYYY-MM-DD");

return e;
});
})();

確認・修正するべきポイントとしては、以下の点かと思います。

 

①変数dateに対して、momentが二重で適用されている

考え方としては、date変数に請求日のレコードの値を格納し、

それに対して、moment.()で次月の月末を生成する、ということですね。

 

②レコードオブジェクトの扱い

kintone.events.on(events, function(event) {  で、eventを規定していますので、

レコードのデータは、 event.record.フィールドコード.value のような形になっています。

まず、 var record = event.record; として定義してあげるか、
都度、event.record[‘請求日’][‘value’]  のようにしてあげるかが必要ですね。

参考: https://pj.asunote.jp/first_step_of_kintone_customise/

 

③momentの使い方

・ロケール指定 moment.locale(‘ja’); を入れておいた方がいいです。

・.add() の書式は、 add(1, ‘month’) 

https://qiita.com/ushiron/items/14a2cfa05e2132b77558

 

④支払期限フィールド(日付)のフィールド形式が違っています

https://developer.cybozu.io/hc/ja/articles/202166330

日付のフィールド形式は、YYYY-MM-DD です。

moment.js のフォーマットで、その形式に変換してから、eventオブジェクトに代入する必要がありますね。

 

⑤イベントの妥当性

支払期限を更新する必要があるケースとしては、以下の場合でよろしいと思います。

新規レコード追加(初期値がある場合)
請求日を変更した場合(レコード追加画面、編集画面)

 

⑥請求日がnullになった場合の処理

その前に設定されていた支払い期限をクリアーしてあげる必要があるのではないでしょうか。

 

こんにちは。初心者なのですが、こちらのページを元にコードを書いてみたのですが、反映されません。。何が違うのかをご教示いただけると幸いです。

質問者様と同じ表示を行いたいです。

日付フィールドを使用しており、「納品日」を入力後、「請求月日」のフィールドに、翌月末を反映させていです。

 

納品日の初期値はありません。

よろしくお願いいたします。

(function () {

    ‘use strict’;

    moment.locale(‘ja’);

    //レコードの新規追加、編集時に適用する

    kintone.events.on([‘app.record.creat.change.納品日’,‘app.record.edit.change.納品日’

    ] ,function (event) {

        const record = event.record;

        record[‘請求月日’][‘value’] = moment(event.record[‘納品日’][‘value’]).add(1, ‘month’).endOf(‘month’).format(“YYYY-MM-DD”);

        return event;

    });

})();

こんにちは。

app.record.creat.change.納品日

のcreateのスペルが間違ってるようです。

それを修正しても動かない場合は、kintoneカスタマイズの基本的なデバッグの流れを身につけよう を参考に、どのような値が入っているのか調べていくのが良いかと思います。

あさが様

ご指摘いただきまして、ありがとうございます。反映することができました!

デバックも学んでみたいと思います。ご丁寧にありがとうございます!