校正周期に応じて次回校正日をフィールドに自動表示したい

背景・実現したいこと

点検日(日付フィールド)と校正周期(ドロップダウン)を入力すると

点検日+校正周期に応じた次回点検日を出力するプログラムを

作成したいです。

校正周期は、年単位で1年~10年まで選択肢があります。

 

プログラミングど素人のため、類似の内容のコードを参考に作成してみましたが

当然のごとく動かず、どこをどう直してよいのかわからず先へ進めません。

ご教授いただけないでしょうか。

利用したソースコード

(function() {
   “use strict”;
   kintone.events.on([“app.record.create.change.校正周期”,“app.record.edit.change.校正周期”,
                      “app.record.create.change.校正日”,“app.record.edit.change.校正日”], function(event) {
       
       const record = event.record;
       const date = luxon.DateTime.fromISO(record.校正日.value).startOf(‘year’); 
       const Drop = record.校正周期.value;

   
     if (Drop === “1年”) {
     record.次回校正日.value = date.plus({year:1}).endOf(‘year’).toFormat(‘yyyy-MM-dd’);
       }
       if (Drop === “2年” ) {
         record.次回校正日.value = date.plus({year:1}).endOf(‘year’).toFormat(‘yyyy-MM-dd’);
       }  
       return event;
   });
})();

 

フィールド画面

 

「校正日」とは、添付の画像にある「点検日(サブテーブル上)」のことでしょうか?

サブテーブル上のフィールドの場合

record[/*サブテーブルのフィールドコード*/].value[/*インデックス番号*/].value[/*フィールドコード*/].value

か、サブテーブル上のフィールド変更イベントでは

event.changes.row.value[/*フィールドコード*/].value

で値を取得できます。

今回の場合、サブテーブル内外両方のイベントがあるため、以下のような形で可能かと思います(常にサブテーブル最終行の校正日を取得するようにしてあります)。

(function() {
  'use strict';

  const subtable = /* サブテーブルのフィールドコード */;

  kintone.events.on([
    'app.record.create.change.校正周期', 'app.record.edit.change.校正周期',
    'app.record.create.change.校正日', 'app.record.edit.change.校正日'
  ], (event) => {
    const record = event.record;
    const proofreadingDate = record[subtable].value[record[subtable].value.length - 1].value['校正日'].value;
    const drop = record['校正周期'].value;

    if (proofreadingDate && drop) {
      let dropNumber = Number(drop.replace(/年/, ''));

      record['次回校正日'].value = luxon.DateTime.fromISO(proofreadingDate).plus({year: dropNumber}).toFormat('yyyy-MM-dd');
    } else {
      record['次回校正日'].value = '';
    }

    return event;
  });
})();

mls-hashimoto様

ご指導ありがとうございます。

記載いただいたコードを入力したところ、動作しませんでした。

フィールドコードの間違え?と思い確認をしましたが、問題は無く原因がわからず、、、といった状況です。

また、ご指摘いただいた通り「校正日」は、点検日のことです。

何が原因がわかりましたら再度ご教授いただけると幸いです。

 

Shinya Imamura さま

当方環境では動作しています。考えられる原因として、

①luxonは読み込んでいますか?以下ページから、コードより前にluxonを読み込むように配置して下さい。
https://developer.cybozu.io/hc/ja/articles/202960194#luxon 

②4行目のサブテーブルのフィールドコードは設定しましたか?

③ドロップダウンの「○年」は半角数字ですか?
ドロップダウンの「○年」から年を抜いた値を数字に変換して日付に足すようにしています。この形で問題がある場合、if文やswitch文を使って年数を足す処理に変更した方が良いかもしれません。

④点検日のフィールドコードは「校正日」ですか?

mls-hashimoto様

早速のご確認ありがとうございます。

確認の結果となります。

①luxonは読み込んでいますか?以下ページから、コードより前にluxonを読み込むように配置して下さい。

⇒以下の通りluxonを読み込んでいます。

②4行目のサブテーブルのフィールドコードは設定しましたか?

⇒アプリは、フィールドコード「テーブル」で設定しており、

上記コードで4行目に入力しました。

③ドロップダウンの「○年」は半角数字ですか?

⇒半角数字で入力しています。

④点検日のフィールドコードは「校正日」ですか?

⇒校正日です。

 

JSEdit for kintoneを使用してJSを書いていますが関係はあるでしょうか。

重ね重ね申し訳ありませんがご確認をお願い致します。

Shinya Imamura さま

当方でもJSEdit for kintoneを使いましたが、問題ありませんでした。残りで考えられる部分として、アロー関数やlet、constが原因かもしれません。
また、コンソールツールが使えるのであればエラーの原因が見えるかもしれません。
どこまで動作しているかを追記しましたので、以下でお試し下さい。

(function() {
  'use strict';

  var subtable = 'テーブル';

  kintone.events.on([
    'app.record.create.change.校正周期', 'app.record.edit.change.校正周期',
    'app.record.create.change.校正日', 'app.record.edit.change.校正日'
  ], function(event) {
    var record = event.record;
    var proofreadingDate = record[subtable].value[record[subtable].value.length - 1].value['校正日'].value;
    var drop = record['校正周期'].value;

    alert('校正日は' + proofreadingDate + 'で校正周期は' + drop); // ① 不要になったら行ごと削除

    if (proofreadingDate && drop) {
      var dropNumber = Number(drop.replace(/年/, ''));

      alert('次回校正日に' + dropNumber + '年追加'); // ② 不要になったら行ごと削除

      record['次回校正日'].value = luxon.DateTime.fromISO(proofreadingDate).plus({year: dropNumber}).toFormat('yyyy-MM-dd');
    } else {
      record['次回校正日'].value = '';
    }

    return event;
  });
})();

mls-hashimoto様

大変お世話になっております。

コンソールツールを使用したところ、4行目でエラーが表示されたので

原因を確認したところ、クォーテーション がつけられていませんでした。。。

修正した結果、無事に動作をしてくれ感動しております。

 

もう一度初歩から勉強します。

最後までお付き合いいただき誠にありがとうございます。

また、くだらないことでお時間をとれせてしまい大変申し訳ありませんでした。