日数計算後の日付でカレンダーにイベント表示しようとしています。
カレンダー表示させるには、そのイベントを登録する日付時刻は、日時属性フィールドである必要があります。しかし日数計算した後のフィールドでは、それができません。理由は計算フィールドは日時フィールドとは見なされないので選択できないからです。
そこでフォームを追加、編集を保存するときに、計算フィールドを日時フィールドに自動コピーすればいいと思いつきました。以下のような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;
});
})();