日時フィールドAから自動的に1日加算したものを計算して日時フィールドBにもっていきたいです。

背景
あるアプリで使用した一つの日時フィールドから、別のアプリカレンダープラスの開始日時、終了日時としてアクションで送りたい。が、終了日時は開始日時の1日後にしたい。

実現したいこと

日時フィールドAに入れた値から1日追加した値を自動的に日時フィールドBに入れたいです。


日時フィールド → 計算後フィールド
2023-02-27 9:00 → 2023-02-28 9:00

利用できそうなソースコード
まず、初心者です。かなりわかってません。こちらの 日数自動計算後の計算フィールドを、日時フィールドに自動コピーしたいを参考にして、


 // 編集追加表示
 kintone.events.on([“app.record.edit.show”,“app.record.create.show”], function(event) {
 var record = event.record;
 record[‘日時フィールド’][‘enabled’] = 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;
 });
})();


日数計算後フィールドの値を日時フィールドに持ってこれる事は確認できました。

ですが、どうやったら一日後にすることができるのか?全く分かりません。

かなり素人で申し訳ないですが、よろしければ教えて下さいませ。どうぞよろしくお願い致します。

「①日時フィールド」「②日時の計算用フィールド(自動計算を設定した文字列1行フィールド)」「③計算後の日時フィールド」があり、「②日時の計算用フィールド」の値を、「①日時フィールド」の1日後にして「③計算後の日時フィールド」へコピーしたいという認識で間違いないでしょうか?

それであれば、自動計算の計算式を「DATE_FORMAT(日時+54000, “YYYY-MM-ddTHH:mm”, “Asia/Tokyo”)」とすれば問題ないかと思います。日時に秒を足す計算をします(本来24時間は60*60*24=86,400ですが、日本時間で9時間ずれるので60*60*15=54,000で良いかと思います)。

 

ただし、「日時フィールドからkintoneの自動計算機能で別フィールドへ」「自動計算結果をJavaScriptカスタマイズで日時フィールドへ」としていて、そこまでするのであれば個人的にはプラグインで日数計算ができるものがあるのでそちらで問題ないかと思います(自動計算フィールドは本来介す必要はありません)。またカスタマイズを覚えるつもりがあるのであれば、LuxonやDay.jsといったライブラリを使えば比較的簡単に実装出来ます。

>という認識で間違いないでしょうか?

多分違います。質問の仕方が悪かったと思います。すいません。

日時フィールドからプラス1日を日時フィールドにもっていきたいです。
(日時フィールドから文字列ではありません)

青木 さま

リンク先のスレッドは「カレンダーPlusに登録するため、日時フィールドに日数計算後の値(終了日時)を登録したいものの、日数計算を伴うJavaScriptカスタマイズができないので、kintone標準機能である自動計算機能を使って計算した文字列フィールドの日時をJavaScriptカスタマイズで日時フィールドにコピーしたい」という内容になっています。かなり回り道している方法ですが、やりたいことは概ね同じのはずです。それに対して1日後の自動計算の方法を回答しただけなので、あくまでも日数計算のカスタマイズを伴わない手段の1つだと思って下さい。

という前置きはいいんですが、カスタマイズJavaScriptを使うならDay.jsを読み込んだ上で

(() => {
    'use strict';

    let startDatetime = '日時1';
    let endDatetime = '日時2';

    kintone.events.on([
        `app.record.create.change.${startDatetime}`, `app.record.edit.change.${startDatetime}`
    ], (event) => {
        let record = event.record;

        if (record[startDatetime].value) {
            record[endDatetime].value = dayjs(record[startDatetime].value).add(1, 'day').format('YYYY-MM-DDTHH:mm');
        } else {
            record[endDatetime].value = '';
        }

        return event;
    });
})();

これで実装出来ます。日数計算は生のJavaScriptでも可能ですが、Day.js等のライブラリを使った方が簡単にできます。

もしくは、私の前の投稿にリンクがありますが、プラグインで導入しても良いでしょう。

 

仮にライブラリを使わない生のJavaScriptであれば、かなり強引ですが

(() => {
    'use strict';

    let startDatetime = '日時1';
    let endDatetime = '日時2';

    kintone.events.on([
        `app.record.create.change.${startDatetime}`, `app.record.edit.change.${startDatetime}`
    ], (event) => {
        let record = event.record;

        if (record[startDatetime].value) {
            let splitDate = record[startDatetime].value.split(/-|T/);
            let addDate = Number(splitDate[2]) + 1;
            
          record[endDatetime].value = `${splitDate[0]}-${splitDate[1]}-${('0' + addDate).slice(-2)}T${splitDate[3]}`;
        } else {
            record[endDatetime].value = '';
        }

        return event;
    });
})();

これでも可能です(「2022-02-15T16:00となっている日時をハイフンとTで分解し加算」という本来の日数計算方法とはかけ離れた方法を取っているので、参考にしない方が良いです)。

 

追記:ゼロ詰めを忘れていたので追加しています。またこのスクリプトの場合、1月31日の1日後は1月32日と計算されてしまいますが、kintone側で2月1日に直してくれるのでその辺りは心配ありません。

mls-hashimoto
ありがとうございます!誠に申し訳ないです。私が無能すぎて理解が追い付きません。
何度も読んでみて、試してまた書きこみます。
本当にありがとうございました!!

1 Like

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。