日数自動計算後の計算フィールドを、日時フィールドに自動コピーしたい

日数計算後の日付でカレンダーにイベント表示しようとしています。

カレンダー表示させるには、そのイベントを登録する日付時刻は、日時属性フィールドである必要があります。しかし日数計算した後のフィールドでは、それができません。理由は計算フィールドは日時フィールドとは見なされないので選択できないからです。

そこでフォームを追加、編集を保存するときに、計算フィールドを日時フィールドに自動コピーすればいいと思いつきました。以下のようなJavascriptを書けばいいのでしょうか。もっといい方法がありますでしょうか、ご教示ください。Javascript初心者です。すいません^^;

(function() {
“use strict”;
//
kintone.events.on(‘app.record.create.submit’, function (event) {
var record = event.record;

record[‘日時フィールド’][‘value’] = record[‘日数計算後フィールド’][‘value’]';
return event;
});

kintone.events.on(“app.record.edit.submit.success”, function(ev) {
var record = ev.record;

record[‘日時フィールド’][‘value’] = record[‘日数計算後フィールド’][‘value’]';
return event;
});

})();

髙森さん

上記コードは、いくつか問題があります。
・submit.success は、更新終了後のイベントですから、event.record を更新しても反映されません。

不具合ではありませんが、
・マニュアル入力できないように、日時フィールドを編集不可に設定

(function() {
"use strict";

// 編集追加表示
kintone.events.on(["app.record.edit.show","app.record.create.show"], function(event) {
var record = event.record;
record['日時フィールド']['disabled'] = true;
return event;
});

// 編集追加サブミット
kintone.events.on(["app.record.edit.submit","app.record.create.submit"], function(event) {
var record = event.record;
record['日時フィールド']['value'] = record['日数計算後フィールド']['value'];
return event;
});
})();

 

すみません。日数計算後フィールドは、ISO形式でなくてもOKのようですね。
コードを訂正しました。

髙森満さま

JavaScriptを使うことが前提であれば、計算フィールドを使わずにJavaScriptで日数計算をしてはいかがですか?

私が作るとしたら、

1)まず、もとの日付フィールドと、「○○日後の日付」フィールドを用意する

2)「○○日後の日付」フィールドはdisabledにする

3)もとの日付が変更されル時のイベント、つまり app.record.create.change.<フィールドコード> と app.record.edit.change.<フィールドコード> のイベントを使って、もとの日付が変更されたら「○○日後の日付」フィールドに計算した日付を登録する

という形にすると思います。

 

rex0220さま、milkyway0307さま、ご指南ありがとうございます。

javascriptで日数計算するのが自然なコードですね。私としては計算フィールドから日時にデータ転送するぐらいならすぐに作れるかなって考えたのですが、いろいろ引っかかりました。

javascriptでの日数計算にチャレンジしてみます。

髙森満さま

日数計算をするなら、 moment.js を使うと便利です。

このコミュニティでも検索するといろいろ出てくるはずですし、ネット上にいろいろな記事もたくさんあります。

また困ったら、お声がけください。それぐらいのコードなら、すぐ作れる気がします。

moment.jsを学習し、JSEditがあることを思い出し、それぞれ導入し、
様々なトピックを読みあさった結果、以下となりました。^^;

播種した日に日数を足した日付が収穫予定日となります。時刻は固定で開始15時-終了16時としました。
レコード追加時、編集時とも収穫予定日時と収穫終了日時は、編集不可とします。
同様に、日数の変更をキャッチして、日付計算を行います。UTCと時差9時間を補正します。

できたレコードを収穫予定日時で、カレンダープラスで表示します。

残念なことは、
収穫予定日時の時刻だけを編集可能にできれば、もっといいのですけど、日時フィールド1つなのでできません。
それとカレンダーに表示する文字が長いとカレンダープラスでは後ろが切れて表示できません。

今後は、表示したカレンダーをきれいに整形して印刷したいと考えています。

(function() {
“use strict”;
// ロケールを設定
moment.locale(‘ja’);

// 収穫予定日は編集できないようにする。
var resps1 = [‘app.record.create.show’,‘app.record.edit.show’];

kintone.events.on(resps1, function (resp) {
resp[‘record’][‘収穫予定日時’][‘disabled’] = true;
resp[‘record’][‘収穫終了日時’][‘disabled’] = true;
return resp;
});
// フィールド値変更をキャッチ
var events1 = [‘app.record.create.change.日数’,‘app.record.edit.change.日数’];

kintone.events.on(events1, function (event) {
var record = event.record;
var hdate = record[‘播種日付’][‘value’];
var ndays = record[‘日数’][‘value’];

//予定時刻はPM3、終了はPM4固定はUTC-9する
record[‘収穫予定日時’][‘value’] = moment(hdate).add(ndays, ‘days’).format(‘YYYY-MM-DD’) + “T” + “06:00:00Z”;
record[‘収穫終了日時’][‘value’] = moment(hdate).add(ndays, ‘days’).format(‘YYYY-MM-DD’) + “T” + “07:00:00Z”;

return event;
});

})();