いつもお世話になっております。
『請求日』を入力すると自動的に『支払期限日』に翌月末が入力されるようにしたいのですが、下記よくある質問では「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カスタマイズの基本的なデバッグの流れを身につけよう を参考に、どのような値が入っているのか調べていくのが良いかと思います。
あさが様
ご指摘いただきまして、ありがとうございます。反映することができました!
デバックも学んでみたいと思います。ご丁寧にありがとうございます!