複数アプリで同じ(ような)処理のスクリプトについて

いつもお世話になっております。

開始時間と終了時間のchangeイベントで残業時間を計算している<アプリA>があります。

<アプリB>はサブテーブルaがあり各レコードでアプリAと同じ動きをする(残業時間を計算する)ようにしたいです。

計算ロジックは<アプリA>も<アプリB>も同じなので1つのスクリプトで賄えないか考えていますが、よいアイデアが浮かびません。

もし可能だけど可視性の問題でスクリプト分けたほうがよいなどのご意見もあれば、ぜひお聞かせください。

よろしくお願いいたします。

<アプリA>

開始時間:時刻フィールド

終了時刻:時刻フィールド

残業時間:文字列フィールド

<アプリB>

サブテーブルa

開始時間:時刻フィールド

終了時刻:時刻フィールド

残業時間:文字列フィールド

 

   const calcZangyo = (event) => {
   
~~~~~~~~~~~~~
      残業計算諸々
~~~~~~~~~~~~~

event.record.残業時間.value = 計算結果;

       return(event);
    };

    var inputEvents = [
        ‘app.record.edit.change.開始時刻’,
        ‘app.record.edit.change.終了時刻’
    ];
    kintone.events.on(inputEvents,calcZangyo);

サブテーブル上のchangeイベントの場合、event.changes.rowで変更された行を取得できるので、その有無で以下のように条件分岐をさせれば可能かと思います。

  const calcZangyo = (event) => {
    let record = event.changes.row ? event.changes.row.value: event.record;

    /* 残業計算諸々 */

    record['残業時間'].value = /*計算結果*/

    return(event);
  };

mls-hashimotoさま

ありがとうございます。

まさにやりたかったことです。

もう1つ質問があるので、追加で教えていただけないでしょうか?

 

この「残業計算諸々」のところで非同期(ほかのアプリからデータ取得)があり

直接event.recordに値をいれても反映できなかったので、app.record.getして

「残業時間」をapp.record.setで値を反映させています。

 

<アプリA>では以下のように書いていますが、<アプリB>でも同じ処理をしたいのですが

どのように記述すればよいでしょうか?

アドバイスいただけると助かります。よろしくお願いいたします。


let records = kintone.app.record.get();

records.record.残業時間.value =  残業時間計算結果;

kintone.app.record.set(records);


 

前田丸 さま

changeイベントの非同期処理を含む場合は、event.changes.rowを使ってテーブルのインデックス番号を求め、直接インデックス番号を指定する方法しかないと思います。

  const tableField = 'サブテーブルのフィールドコード';
  const changeRowIndex = (event) => {
    let record = event.record;

    for (let i = 0; i < record[tableField].value.length; i++) {
      if (event.changes.row === record[tableField].value[i]) return i;
    };
  };

  const calcZangyo = (event) => {
    let record = event.record;
    let rowIndex = event.changes.row ? changeRowIndex(event): null;

    kintone.api(/* 非同期処理 */).then((resp) => {

/* 計算 */

      let recordData = kintone.app.record.get(), rec = recordData.record;

      if (rowIndex === null) {
        rec['残業時間'].value = /* 計算結果 */
      } else {
        rec[tableField].value[rowIndex].value['残業時間'].value = /* 計算結果 */
      }

      kintone.app.record.set(recordData);
    });

    return event;
  };

mls-hashimotoさま

結構難しいですね ^^;

でもここまで書いていただけたら、私でもどうにかできそうです。

本当に本当にありがとうございました。

感謝感謝です。