krewsheetの一覧画面におけるフィールド値の自動転記

krewsheetの特定一覧表示ビューで

日付フィールド:「検収日」という名前のフィールドコードのフィールドに

日付を入力し、保存すると

文字列フィールド:「納期」という名前のフィールドコードのフィールドに

同じ日付が自動で反映されるようにしたいと考えています

krewsheetの数式などでできるのですが、「納期」フィールドにも「検収日」フィールドに入力する前に直接入力も可能にしたいため、krewsheetの数式で表すのではなくコードで入るようにしたいと考えています

下記のコードを書いてみました

(function() {
  ‘use strict’;

// イベントハンドラーの登録を実行する
let handler = function(event) {
    console.log(event);
};
kintone.events.on(‘app.record.index.show’, function(event) {
    if (window.krewsheet){
        krewsheet.events.on(‘app.record.index.edit.submit.success’, handler);
    }

  // 「krewsheet」アプリの一覧表示である場合のみ処理を実行
  if (event.viewId === <krewsheetの一覧表示のビューID>) {
    var records = event.records;
    for (var i = 0; i < records.length; i++) {
      var record = records[i];

      // 「検収日」フィールドの値が入力された場合のイベント
      record[‘検収日’].disabled = false; // 入力可能にする
      kintone.events.on(‘app.record.edit.change.検収日’, function(event) {
        var record = event.record;
        var selectedDate = record[‘検収日’].value;
        
        // 「納期」フィールドに日付を入力
        record[‘納期’].value = selectedDate;
      });
    }
  }
  return event;
});

})();

krewsheetのイベントを走らせるための書き方がわからなく困っています

まだ初心者なためkrewsheet上でイベントを走らせる方法を知っているかたお力添えいただければ助かります。よろしくお願いいたします。

書かれている仕様通りの場合、krewSheetの標準機能で解決できるんじゃないでしょうか。

krewSheetの「数式」フィールドを一つ設置し、数式を以下の通り設定

IF(納期="",IF(検収日="","",TEXT(検収日,"YYYY-MM-DD")),納期)

このような数式を設定し、「計算結果を保存するkintoneフィールド」を「納期」

にしておけば、納期が空白ならば検収日が「納期」フィールドに保存されますし、

納期が入っていれば、納期そのものが「納期」フィールドに保存されると思います。

この「数式」フィールド自体は表示幅を「0」にして、目立たない場所にでも置いておけば、問題ないと思います。

これで目的は達成できるんじゃないでしょうか。

ただし、一旦保存を行った「検収日」が訂正となった場合、それを納期に反映する事はできませんので、

その場合は納期の訂正も同時に必要となります。

javascriptによる解決策ではありませんが、ご参考までにどうぞ。

ジュンジュン様
アドバイスありがとうございます。助かります

その方法も考えたのですが、数式フィールドをkrewsheet上に配置する必要があるのがひっかかっています

たくさんのsheetがある場合、どのsheetに何の数式フィールドを入れたか管理するのが大変なので、できればjavasqriptで解決したいと考えています

保存時にフィールドの値を書き換える場合は、保存実行前イベント「app.record.index.edit.submit」を使用しましょう。https://docs.krew.grapecity.com/krewsheet/#event_recordlist.html#3e16ce6b-7d01-468b-99f5-b35e4d7981a6SectionHeading

以下、サンプルです。

(function () {
  "use strict";
  kintone.events.on("app.record.index.show", function (e) {
    if (window.krewsheet) { // 「krewsheet」アプリの一覧表示である場合のみ処理を実行
      krewsheet.events.on("app.record.index.edit.submit", function (event) {
        const records = event.records;
        for (let i = 0; i < records.length; i++) {
          const record = records[i];
          const selectedDate = record["検収日"].value;
          if (selectedDate) {
            record["納期"].value = selectedDate; // 「検収日」が入力されている場合は「納期」フィールドにコピー
          }
        }
        return event;
      });
    }
  });
})();

なお、krewSheetでは、 disabledにtrue/falseを代入してフィールドの編集可/不可を設定することはできません。https://docs.krew.grapecity.com/krewsheet/#event_recordlist.html#31e6b7ee-2400-4872-adee-f73f4193e071SectionHeading

TenD様

アドバイスいただき大変助かりました

追加で可能であれば教えていただきたいのですが

特定一覧のビューのみで作動させたいとき

// 「krewsheet」アプリの一覧表示である場合のみ処理を実行
  if (event.viewId === <krewsheetの一覧表示のビューID>) {
    var records = event.records;
    for (var i = 0; i < records.length; i++) {
      var record = records[i];

を入れたいのですが、5行目の直下6行目にこの構文を入れると作動するようになりますでしょうか?

また別の方法があればアドバイスいただけたら幸いです

こちらを記載がありますが、「app.record.index.edit.submit」で渡されるeventオブジェクトにviewIdは含まれていません。https://docs.krew.grapecity.com/krewsheet/#event_recordlist.html#3e16ce6b-7d01-468b-99f5-b35e4d7981a6SectionHeading

よって、viewIdを取得するためには「app.record.index.show」で渡されるeventオブジェクトにアクセスする必要があります。

書き方は色々とあると思いますが、以下のようになると思います。

(function () {
  "use strict";
  kintone.events.on("app.record.index.show",function (e) {
   if(window.krewsheet && e.viewId === "特定のviewId") {// 変更
      krewsheet.events.on("app.record.index.edit.submit",function (event) {
       constrecords = event.records;
       for(leti =0; i < records.length; i++) {
         constrecord = records[i];
         constselectedDate = record["検収日"].value;
         if(selectedDate) {
            record["納期"].value = selectedDate;
          }
        }
       returnevent;
      });
    }
  });
})();

TenD様

「app.record.index.edit.submit」で渡されるeventオブジェクトにviewIdは含まれていません。

だったのですね!

これでわからないことが解決しました。

ありがとうございました!また機会あればよろしくお願いいたします。

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