以下、設定したものですと新規登録や編集時に年齢を設定できますが、
アプリを開いた時にはその新規登録、編集時に設定した「基準日」のままです。
これを常にアプリを開いたら最新の状態の年齢が出るようにしたいです。
if文の所に「'app.record.index.show」を追加してみましたが、どうやら違うようです。
初学者なので優しく教えていただければ幸いです。
現在のコード
(別でmoment.js入れています)
https://js.cybozu.com/momentjs/2.17.1/moment.min.js
(function() {
"use strict";
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
kintone.events.on(['app.record.edit.change.生年月日',
'app.record.create.change.生年月日',
'app.record.index.edit.change.生年月日',
'app.record.edit.change.基準日',
'app.record.create.change.基準日',
'app.record.index.edit.change.基準日',
'app.record.create.show',
'app.record.edit.show',
'app.record.index.edit.show'
], function(event) {
var record = event.record;
moment.locale('ja');
if (['app.record.index.show', 'app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'].indexOf(event.type) >= 0) {
// フィールド制御
record['年齢']['disabled'] = true;
record['基準日'].value = moment().format('YYYY-MM-DD');
}
record['年齢'].value = ageCal(record['生年月日'].value, record['基準日'].value);
return event;
});
// 年齢計算
function ageCal(wkDate, wkReferenceDate) {
if (wkDate && wkReferenceDate) {
var mDate = moment(wkDate);
var mReferenceDate = moment(wkReferenceDate);
if (!mReferenceDate.isBefore(moment(mDate), 'day')) {
var years = mReferenceDate.diff(moment(mDate), 'years');
var months = mReferenceDate.diff(moment(mDate), 'months') % 12;
return years + "年 ";
}
}
return '';
}
})();
こちらのコメント欄にありましたコードを参考にしました。
https://developer.cybozu.io/hc/ja/community/posts/115010590826-%E5%B9%B4%E9%BD%A2%E3%82%92%E8%87%AA%E5%8B%95%E8%A8%88%E7%AE%97%E3%81%A7%E6%B1%82%E3%82%81%E3%81%9F%E3%81%84
アプリを開いたときに全レコードの基準日を当日にして、年齢を計算して差し替えをする必要がありそうです。
APIを使ってダウンロードして、日付を書き換えて、年齢を計算してレコードを更新することが必要です。
それとは別に定期的にレコードを書き換える仕組みを作られている方がいるようです。
kintoneにTODAY関数がないのでGASで夜間バッチつくりました | コンサルママとノマドパパ
https://life89.jp/kintone-today-gas/
ysa様
moment.locale('ja');
if ([**_'app.record.index.show'_** , 'app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'].indexOf(event.type) >= 0) {
// フィールド制御
ここにindex.showを追加していますが,ここだけでは機能しません.
追加,編集画面と違って一覧画面(index)はレコードが複数あるので,処理の仕方が変わります.
ちゃんとやろうと思うと,harada様が書いているようなやり方になるのですが,
「表示だけで良い」なら,別の方法もあります.
上記の(index.showを追加する前の)コードをそのままに,下記のようなコードを追加することで,
一覧画面の「見た目だけ」変えられます.
kintone.events.on([
'app.record.index.show',
], function(event) {
//基準日を取得
const initialDate = moment().format('YYYY-MM-DD');
//一覧に表示されているレコードすべての「年齢」のフィールド要素を取得
const fldAge = kintone.app.getFieldElements('年齢');
//一覧に表示されているレコードをループ
event.records.forEach((rec,id) => {
//「年齢」のフィールド要素のinnerText(表示部分)に最新の年齢を表示
fldAge[id].firstChild.firstChild.innerText = ageCal(rec['生年月日'].value, initialDate);
});
});
kintone.app.getFieldElementsで一覧画面のレコードにある「年齢」のHTML要素(画面に見えている部分)を取得して,
基準日から計算した最新の年齢を「見た目だけ」変えています.
見た目だけなので,実際のレコード内は変わっていないのですが,元々あるコードのおかげでちゃんと編集画面等に移動しても最新の年齢が表示されると思います.
上記コードは,一覧画面に年齢と生年月日が表示されていることが前提なので,その点留意ください.
902343704226さん, 903968570706さん ※ごめんなさいお二人同じ名前?の方がいるようです。
371966959511さん
コメントいただき、ありがとうございます!
いただいた方法をまだ試せていなのですが、やってみようと思います!
その中、大変恐縮なのですが、
「見た目だけ」ではなく、データ自体も更新される方法はございますでしょうか?
ysa様
ysa様がもともと提示していたコードが「データ自体」も更新されるコードになっていますが,
一覧画面で実際に更新されたほうがよいですか?
そうなるとharada様の提案されたapiを使う方法になります.
harada様の提案された方法では一覧画面というより定期的にアプリを一括更新している感じですが,
一覧を開いたときに…というくだりがちょっと違うだけでアプローチは同じです.
system
(system)
クローズされました:
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。