テーブル外フィールドをテーブル内へコピー

お世話になります。
テーブル外フィールドをテーブル内にコピーをしたいと考えています。
理想はテーブル外の
入出庫をつかさどるフィールド項目があり(出荷日、入M、出M)、
入出庫管理テーブルをテーブル用の同様のフィールドに追記していくイメージです。
テーブル外でのフィールドの役割は、最新の出荷時のデータがある。
テーブルには過去のデータがある。
というイメージです。
事由としては、他アプリから関連レコードなど紐づけをする際にテーブル内だと標準機能では成立しない部分があるためです。

この度作成したJSを組んで値を保存するときに
エラーが出てしまいます。
JSをシンプルにしても出るので、何か根本的なミスがあるのではと思うのですがもしお分かりになればご指摘いただけますと幸いです。

発生した問題やエラーメッセージ
エラー

  • カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。
    • event.record[‘入出庫管理’].value[0][‘T入tcモノ’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入tcカラー’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入B’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入C’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入M’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入Y’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出tcモノ’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出tcカラー’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出B’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出C’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出M’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出Y’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T出荷日’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T入荷日’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T会社区分’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T販売区分’].type が不正です。
    • event.record[‘入出庫管理’].value[0][‘T顧客ID’].type が不正です。

実行したコード

(function () {
‘use strict’;

const events = [‘app.record.create.submit’, ‘app.record.edit.submit’];

const safeValue = (record, code) => (record[code] ? record[code].value : ‘’);

kintone.events.on(events, function (event) {
const record = event.record;
const tableFieldCode = ‘入出庫管理’;

if (!record[tableFieldCode]) return event;

// 通常フィールドから値を取得してテーブル用のフィールドに対応付け
const normalFields = {
  'T入t_cモノ': safeValue(record, '入t_cモノ'),
  'T入t_cカラー': safeValue(record, '入t_cカラー'),
  'T入B': safeValue(record, '入B'),
  'T入C': safeValue(record, '入C'),
  'T入M': safeValue(record, '入M'),
  'T入Y': safeValue(record, '入Y'),

  'T出tcモノ': safeValue(record, '出tcモノ'),
  'T出tcカラー': safeValue(record, '出tcカラー'),
  'T出B': safeValue(record, '出B'),
  'T出C': safeValue(record, '出C'),
  'T出M': safeValue(record, '出M'),
  'T出Y': safeValue(record, '出Y'),

  'T出荷日': safeValue(record, '出荷日'),
  'T入荷日': safeValue(record, '入荷日'),

  'T会社区分': safeValue(record, '会社区分'),
  'T販売区分': safeValue(record, '販売区分'),
  'T顧客ID': safeValue(record, '顧客ID')
};

// 未入力フィールドがあるか確認
const emptyFields = Object.entries(normalFields)
  .filter(([_, value]) => value === '' || value === null || value === undefined)
  .map(([key, _]) => key);

if (emptyFields.length > 0) {
  const proceed = window.confirm(
    `以下の項目が未入力ですが、そのまま保存しますか?\n\n${emptyFields.join('\n')}`
  );
  if (!proceed) {
    event.error = '保存をキャンセルしました。未入力項目を確認してください。';
    return false;
  }
}

// 重複チェック(顧客ID・出荷日・入荷日)
const table = record[tableFieldCode].value || [];
const isDuplicate = table.some(row => {
  return (
    row.value['T顧客ID']?.value === normalFields['T顧客ID'] &&
    row.value['T出荷日']?.value === normalFields['T出荷日'] &&
    row.value['T入荷日']?.value === normalFields['T入荷日']
  );
});

if (!isDuplicate) {
  // 新しいテーブル行を作成
  const newRow = { value: {} };

  Object.keys(normalFields).forEach(key => {
    newRow.value[key] = { value: normalFields[key] };
  });

  // 最新データが上に来るよう先頭に追加
  record[tableFieldCode].value.unshift(newRow);
}

return event;

});
})();

大変恐れ入りますが
よろしくお願いいたします。

行の追加をおこなうときはtypeの指定も必要なはずですが、
今回のコードでは単純にtypeが指定されてないようにみえますので、それいれるとどうでしょうか??

mura様

ご連絡ありがとう御座います。
typeが必要とのことありがとうございます。
ルックアップフィールド以外は無事反映できました。
顧客ID(文字列一行テーブル外です)の値をテーブル内のT顧客ID(ルックアップフィールド)に反映できません。
ルックアップフィールドへtypeは使えないのでしょうか?

もしお分かりになれば、お教えいただけますと幸いです。

反映できない、というのは空欄がはいってしまう感じですかね?
何かエラーがでますか?

ご確認ありがとうございます!
特にkintone上でのエラーは出ず、chromのconsoleにもエラーは出ておりませんので、顧客IDがT顧客IDに入らないだけのようです。空欄となります。試しにT顧客IDをlookupフィールドから文字列一行に変えたら、他と同様に反映されました。lookupフィールドは不可なのでしょうか?

データはテーブルであろうと入るはずですけどね。フィールドコードあってますかね…?(確認されている気はしますが

「いいね!」 1

横から失礼します。

submitイベントでは、イベントオブジェクトを利用したフィールド値書き換えでルックアップが対象外みたいなので、書き換えたい場合 REST API を利用する必要があるかと思います!

「いいね!」 4

なるほど、create.show/edit.showだと勝手に思ってました!ありがとうございます!

(REST APIでやるか、作成、編集画面でやれないか考えるのも手だと思います!

「いいね!」 2

ko_ji様

ご連絡ありがとうございます!
追加の状況ではlookupへは不可ということで理解しました。
熟考します。

maru様

ご連絡ありがとう御座います。
rest apiを考えつつ、とりあえずは文字一列でも
問題はないので熟考いたします。
この度はありがとうございました。

似たタイプのアプリで下記実行しまして、新規作成時、編集時にも対応できるような流れになりました。ありがとうございました!
kintone.events.on([
‘app.record.create.show’,
‘app.record.edit.show’,
‘app.record.create.change.kintone顧客ID’,
‘app.record.edit.change.kintone顧客ID’,
‘app.record.create.change.出庫日1’,
‘app.record.edit.change.出庫日1’
], function(event) {
// ここにあなたのコピー・重複チェックロジックを入れます
var record = event.record;
var customerId = record[‘kintone顧客ID’] ? record[‘kintone顧客ID’].value : ‘’;
var shippingDate1 = record[‘出庫日1’] ? record[‘出庫日1’].value : ‘’;

if (!record[‘入出庫履歴’] || !record[‘入出庫履歴’].value) {
return event;
}

var existingKeys = new Set();

record[‘入出庫履歴’].value.forEach(function(row) {
var rowValue = row.value;
var dateVal = rowValue[‘出庫日’] ? rowValue[‘出庫日’].value : ‘’;
var custIdVal = rowValue[‘kintone顧客ID3’] ? rowValue[‘kintone顧客ID3’].value : ‘’;

if (dateVal && custIdVal) {
  existingKeys.add(dateVal + '|' + custIdVal);
}

});

var key = shippingDate1 + ‘|’ + customerId;

// すでにあるならコピーしない
if (!existingKeys.has(key)) {
record[‘入出庫履歴’].value.forEach(function(row) {
var rowValue = row.value;
if (rowValue[‘出庫日’]) {
rowValue[‘出庫日’].value = shippingDate1;
}
if (rowValue[‘kintone顧客ID3’]) {
rowValue[‘kintone顧客ID3’].value = customerId;
rowValue[‘kintone顧客ID3’].lookup = true;
}
});
}

return event;
});

「いいね!」 4

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