テーブル外のドロップダウンに応じて、テーブル内の日付1から加算して日付2にセットしたい。

 

上記のようなフィールド設定で、ドロップダウンの更新頻度により、「更新日」に日付を入れると「満期日」に自動的に値をセットする為にはどうしたらいいですか?

こんにちは

満期日を計算フィールドにしてIF文でドロップダウンの値を見れば実現可能です。

計算フィールドの日付は秒で指定してあげなければなりませんので、注意してください。

また、うるう年には対応できないので、考慮するのであればJsでluxonを使用してください。

質問に対して回答があったらフィードバックした方が良いと思いますよ。

出来ました。計算フィールドはテーブル外でも参照出来たんですね。

やはり日付フィールドでの実現は簡単ではないですかね。上記の設定をしたうえでカレンダー表示したいと考えた次第でした。

もう少し情報収集してみます。ありがとうございました。

コードを書いてみました。

JSを読み込む際、下記のURLを先頭に読み込んでください。

https://js.cybozu.com/luxon/1.24.1/luxon.min.js

これで計算フィールドを使用せず日付フィールドで自動計算できるかと思います。

(function () {
  'use stirct';
  // 更新日変更時、更新頻度に応じて満期日に入力
  var events = ['app.record.create.change.更新日', 'app.record.edit.change.更新日'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    var row = event.changes.row;
    var date = luxon.DateTime.fromISO(row['value']['更新日']['value']); // フォーマット
    var year1 = date.plus({
      years: 1
    }).toFormat('yyyy-MM-dd'); // 1年後
    var year2 = date.plus({
      years: 2
    }).toFormat('yyyy-MM-dd'); // 2年後
    // 更新頻度が入力されていなかったらエラー
    if (!record['更新頻度']['value']) {
      event.error = '更新頻度を入力';
    }
    // 更新頻度に応じて処理
    switch (record['更新頻度']['value']) {
    case '1年':
      row['value']['満期日']['value'] = year1;
      break;
    case '2年':
      row['value']['満期日']['value'] = year2;
      break;
    }
    return event;
  });
  // 更新頻度が変更されたときも発動
  var events = ['app.record.create.change.更新頻度', 'app.record.edit.change.更新頻度'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    // テーブルの先頭行の更新日に値が入っていなければreturn
    if (!record['テーブル']['value'][0]['value']['更新日']['value']) {
      return event;
    }
    // 更新頻度に応じて処理
    switch (record['更新頻度']['value']) {
    case '1年':
      for (var i = 0; i < record['テーブル']['value'].length; i++) {
        var date = luxon.DateTime.fromISO(record['テーブル']['value'][i]['value']['更新日']['value']); // フォーマット
        var year1 = date.plus({
          years: 1
        }).toFormat('yyyy-MM-dd'); // 1年後
        record['テーブル']['value'][i]['value']['満期日']['value'] = year1;
      }
      break;
    case '2年':
      for (var i = 0; i < record['テーブル']['value'].length; i++) {
        var date = luxon.DateTime.fromISO(record['テーブル']['value'][i]['value']['更新日']['value']); // フォーマット
        var year2 = date.plus({
          years: 2
        }).toFormat('yyyy-MM-dd'); // 2年後
        record['テーブル']['value'][i]['value']['満期日']['value'] = year2;
      }
      break;
    }
    return event;
  });
})();

わざわざありがとうございます。と感動したまではいいんですが、カレンダービューでの日付でテーブル使えないと。。なんと無知でお恥ずかしい限りです。再計算したうえで最下行の日付をまた外に出さなきゃいけないんですね。

そうなのですね、カレンダー表示を試したことがなかったので私も知りませんでした…すみません。

最下行のみでよければ保存時に外に出す処理を追加してみました。

いかがでしょうか。

(function () {
  'use stirct';
  // 更新日変更時、更新頻度に応じて満期日に入力
  var events = ['app.record.create.change.更新日', 'app.record.edit.change.更新日'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    var row = event.changes.row;
    var date = luxon.DateTime.fromISO(row['value']['更新日']['value']); // フォーマット
    var year1 = date.plus({
      years: 1
    }).toFormat('yyyy-MM-dd'); // 1年後
    var year2 = date.plus({
      years: 2
    }).toFormat('yyyy-MM-dd'); // 2年後
    // 更新頻度が入力されていなかったらエラー
    if (!record['更新頻度']['value']) {
      event.error = '更新頻度を入力';
    }
    // 更新頻度に応じて処理
    switch (record['更新頻度']['value']) {
    case '1年':
      row['value']['満期日']['value'] = year1;
      break;
    case '2年':
      row['value']['満期日']['value'] = year2;
      break;
    }
    return event;
  });
  // 更新頻度が変更されたときも発動
  var events = ['app.record.create.change.更新頻度', 'app.record.edit.change.更新頻度'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    // テーブルの先頭行の更新日に値が入っていなければreturn
    if (!record['テーブル']['value'][0]['value']['更新日']['value']) {
      return event;
    }
    // 更新頻度に応じて処理
    switch (record['更新頻度']['value']) {
    case '1年':
      for (var i = 0; i < record['テーブル']['value'].length; i++) {
        var date = luxon.DateTime.fromISO(record['テーブル']['value'][i]['value']['更新日']['value']); // フォーマット
        var year1 = date.plus({
          years: 1
        }).toFormat('yyyy-MM-dd'); // 1年後
        record['テーブル']['value'][i]['value']['満期日']['value'] = year1;
      }
      break;
    case '2年':
      for (var i = 0; i < record['テーブル']['value'].length; i++) {
        var date = luxon.DateTime.fromISO(record['テーブル']['value'][i]['value']['更新日']['value']); // フォーマット
        var year2 = date.plus({
          years: 2
        }).toFormat('yyyy-MM-dd'); // 2年後
        record['テーブル']['value'][i]['value']['満期日']['value'] = year2;
      }
      break;
    }
    return event;
  });
  // 最下行の日付を外に出す
  var events = ['app.record.create.submit', 'app.record.edit.submit'];
  kintone.events.on(events, function (event) {
    var record = event.record;
    var index = record['テーブル']['value'].length - 1;
    var newDate = record['テーブル']['value'][index]['value']['満期日']['value'];
    record['最終満期日']['value'] = newDate;
    return event;
  });
})();

ありがとうございます。上記コード反映してみましたがうまく行きませんでしたが、フィールドコード等見直しながら再度検証してみます。

テーブルと最終満期日以外はフィールド名に合わせてあります。

Javascriptの読み込みはluxonのURLが一番上になっていますか?

私の方では動作確認できていますのでご確認ください。

ありがとうございます。無事動作確認出来ました。