YTLOGI
1
お世話になります。
kintoneでのルックアップ機能について質問です。
レコードのテーブル内にあるルックアップフィールドで、
コピー元のレコードの選択時に表示するフィールド内容が重複している場合、
更新日時が最後のレコードのみを表示させるjavascriptで作成可能でしょうか。
例:アプリ「A」のテーブル「B」にあるルックアップフィールド「C」で値を
取得したところ、選択画面でコピー元(アプリ「D」)のフィールド「E」の内容が
重複。
コピー元のフィールド「E」 更新日時
DEMO-0001 2025/02/14 13:00
DEMO-0001 2025/01/20 14:00
DEMO-0001 2024/12/24 12:00
DEMO-0002 2025/02/14 15:00
DEMO-0002 2025/01/10 15:00
上記の場合、候補として以下の2レコード内容が表示される。
DEMO-0001 2025/02/14 13:00
DEMO-0002 2025/02/14 15:00
説明がつたなくて申し訳ございませんがそのようなjavascriptが作成できるか
確認頂けると助かります!
こんにちわ。
そういったAPIは用意されていないと思いますので通常の方法だと出来ないかなと思いました。バージョンアップ時に動作しなくなるリスクを負ったうえでなら可能性もあるかと思いましたが、今後のメンテナンス性も考慮すると個人的にはおすすめできません。
背景がわからないため的外れになるかもしれませんが、最新データであることをマークするためのフィールドを1つ用意するのがよいかと思いました。
手動もしくはjavascriptで自動的にチェックをし、ルックアップの条件にチェックがあることを付け加えることによって、表示されるレコードが絞れるのではないでしょうか?
「いいね!」 2
Maple
(もみじ)
3
最新データにマークするフィールドのチェックを自動化するなら
-
マークフィールドを disabled = true で手動編集不可にする。
アプリのアクセス権でファイル読み込みを禁止する。
-
‘app.record.index.edit.submit.success’,
‘app.record.edit.submit.success’,
‘app.record.create.submit.success’
をトリガーにして、JavaScriptで以下の処理を行う。
-
保存が成功したレコードと[E]の値が同じレコードを取得する。
-
保存が成功したレコードのマークフィールドはチェックし、それ以外の
取得したレコードのマークフィールドからはチェックを外して更新する。
という感じのやり方になると思います。
できれば無駄な空更新をしないために、マークフィールドの値を現状から
変えなくていいレコードは更新対象から外す処理を入れるといいでしょう。
YTLOGI
4
ご回答いただきありがとうございます。
最新データにマークする方法で解決できるアイデアは発想になかったので、
その方法で試してみたいと思います!
YTLOGI
5
チェック自動化の構築方法のご教授ありがとうございます!
イメージとしては、一覧画面でボタン作成して押下したら、
「データ移行用」(文字列)フィールドが重複している場合、
レコードの「更新日時」をもとに最新日時分のみ「最新」(チェックボックス)フィールドに「NEW」チェックが入り、それ以外の重複レコードは、「NEW」チェックを
外すJSを検討しているのですが、以下のように作成してもうまくいきません。
(function() {
‘use strict’;
// 一覧画面が表示された後に処理を実行
kintone.events.on('app.record.index.show', function(event) {
const records = event.records;
let latestRecords = {}; // 各移行用フィールド値に対して最新レコードを保存
// 移行用フィールド値ごとに最新のレコードを特定
records.forEach(record => {
const migrationValue = record['データ移行用'].value;
const updateDate = record['更新日時'].value; // 更新日を基準に
if (!latestRecords[migrationValue] || latestRecords[migrationValue].value < updateDate) {
latestRecords[migrationValue] = record;
}
});
// チェックボックスフィールドの更新
records.forEach(record => {
const migrationValue = record['データ移行用'].value;
const checkboxField = record['最新'].value; // チェックボックスフィールド名
if (latestRecords[migrationValue].$id.value === record.$id.value) {
// 最新のレコードにチェックを入れる
record['最新'].value = ['NEW']; // チェックする値を設定
} else {
// それ以外のレコードはチェックを外す
record['最新'].value = []; // チェックを外す
}
});
// 更新後のレコードを再設定
event.records = records;
return event;
});
})();
Maple
(もみじ)
6
レコードの更新は複数のレコードを更新するでやらないといけません。
あとボタンが作られてないからレコード一覧画面にボタンを配置してみようを
参考にボタンを置いて、そのクリックイベントとして更新する必要があります。
全ての更新を終えたら、それを自動的に画面へ反映するために
location.reload(); でリロードしたり、alert で更新が終わった
ことを通知するといいかもしれません。
YTLOGI
7
色々と構成について教えていただいてありがとうございました!
おかげで無事実現したいことが再現できました!
system
(system)
クローズされました:
8
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。