テーブル内フィールドからの通常フィールドへのデータコピー

お世話になっております。

下記のコードを使いテーブルの日付(最終更新日)を通常フィールド(日付)へ同期させています。

その際に同じテーブルに所属する別の文字列フィールド(メモ)

も通常フィールドの文字列フィールド(メモ2)へ

同期させることは可能でしょうか?

ご教授いただければと思います。

 

(function () {
“use strict”;
kintone.events.on([‘app.record.create.change.日付’, ‘app.record.edit.change.日付’], function (event) {

var rec = event.record;

if(!rec.最終更新日.value) {
rec.最終更新日.value = rec.Table.value[0].value.日付.value;
} else {
for(var i = 0; i < rec.Table.value.length; i++) {
if(rec.最終更新日.value < rec.Table.value[i].value.日付.value) {
rec.最終更新日.value = rec.Table.value[i].value.日付.value;
}
}
}
return event;
});

 

 

 

 

青山昌司 さん

 

日付フィールドと同じく、文字列もコピーが可能です。

貼付されているコードとほとんど同じようなコードで実装できます。

HANSAさま

 

お世話になっております。

例えばですが、サブテーブル内に、「日付」と「対応内容」というフィールドが存在するとします。

上記jsでの場合、「日付」の部分を「対応内容」替え、「最終更新日」の部分をコピーしたい文字フィールドにしたらいいのでしょうか?

最新の日付とその対応内容のコピーを取りたいと考えています。

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

 

青山さん

「日付」を「対応内容」、「最終更新日」を「コピーしたい文字列フィールド」

変更 するだけだと、対応内容しか同期されなくなります。

「日付」を「最終更新日」に同期しているコードを参考に、

「対応内容」を「コピーしたい文字列フィールド」に同期するコードを 追加 する必要があります。

 

まず、どのタイミングで日付と対応内容をコピーしたいか決める必要があります。

例えば、日付が更新されたタイミングなのか、対応内容が更新されたタイミングなのか。

です。

その次にコピーする処理を実装する必要があります。

HANSAさま

ご連絡ありがとうございます。

サブテーブルへいわゆる対応記録を追加していっています。

最新の対応記録を他のアプリで関連付けレコードで表示したいと考えております。

レコードに変更があたときにサブテーブル内に記録された最新の日付を探し対応内容を

文字が追加されたに変更があった際に行いたいと考えております。。

 

>「対応内容」を「コピーしたい文字列フィールド」に同期するコードを 追加 する必要

の部分をどのようにしたらよいかわからずです。

ご教授いただければ幸いです。

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

青山さん

レコードに変更があたときにサブテーブル内に記録された最新の日付を探し対応内容を
文字が追加されたに変更があった際に行いたいと考えております。。

レコードに変更があったとき、
とありますが、ここをもう少し掘り下げる必要があります。

レコードのどのフィールドの値が変更されたときでしょうか?

いままのまま、サブテーブル内の日付が変更されたときでしょうか?

 

メモ、メモ2、対応内容など、いろいろな呼び方が出てきており混乱しています。
以下の認識であっていますか?(不明箇所あります。)

サブテーブル内のフィールド

・日付

・対応内容

同期先のフィールド

・最終更新日

・????

 

HANSAさま

 

お世話になっております。

うまく説明できてなくて申し訳ありません。

サブテーブルを追加していく中でもっとも新し行(横軸)を選択し対象のフィールドを

サブテーブルの外へ設置したフィールドへコピーを置きたいと考えています。

 

サブテーブル内のフィールドコードは下記の想定で考えております。

・日付

・対応内容

同期先のサブテーブル外のフィールドは下記のフィールドコードとなります。

・最終更新日

・最新対応内容

 

例)このようなイメージです。

サブテーブル内

日付 対応内容

12/1 〇〇様と面談

12/4 〇△様と面談

12/10       〇◇様と面談

 

・最終更新日 12/10

・最新対応内容 〇◇様と面談

 

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

青山さん

なるほど、もっとも新しい行の基準は
サブテーブル内の日付フィールドの値が新しい行だと想定しています。

1.イベントを追加する必要があります。
このままでは、対応内容が更新された際に、日付と対応内容を同期できないので、changeイベントを追加する必要があります。

2.元のコードの日付比較の処理だとうまく動作しないので、変更する必要があります。
元のコードだと、1行目に最新の日付があると、文字列のコピーができません。

 

以下コードです。

コメント部分に処理内容書いたのでご確認ください。

(function() {
'use strict';

const events = [
'app.record.create.change.日付',
'app.record.edit.change.日付',
'app.record.create.change.対応内容', // ①の修正
'app.record.edit.change.対応内容' // ①の修正
];

kintone.events.on(events, function(event) {
const rec = event.record
let date; // ②の修正:最新の日付を入れる箱
for(var i = 0; i < rec.Table.value.length; i++) { // ②サブテーブルの長さ分処理する
if(!date || date < rec.Table.value[i].value.日付.value) { // ②最新の日付を入れる箱が空 or 最新の日付を入れる箱より、i番目の日付の方が新しいとき
date = rec.Table.value[i].value.日付.value; // ②最新の日付を入れる箱にi番目の日付入れる
rec.最終対応内容.value = rec.Table.value[i].value.対応内容.value; // ②i番目の対応内容を最終対応内容にコピー
}
}
rec.最終更新日.value = date; // ②最終更新日に最新の日付が入っている箱の値を渡す
return event;
});
})();

 

HANSAさま

お世話になっております。

早速ご返信いただきありがとうございます。

頂いたコードにて確認をさせて頂きました。

日付が更新されるタイミングで、日付、対応内容が、最終更新日、最終対応内容へ同期しているのですが、

日付入力後、対応内容を記入した場合、対応内容の内容が最終対応内容へ同期をされないようです。

最終対応内容を更新後、さらに未来の日付へ変更すると同期されるようです。

日付入力後の対応内容の変更に対応することは可能でしょうか

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

 

 

青山さん

サンプルコードをあてるだけでなく、コメントは読んで頂けましたでしょうか。

私の環境では問題なく動いているので、おそらくフィールドコードのエラーか、イベントが発生していないかだと思います。

const events = [
‘app.record.create.change.日付’,
‘app.record.edit.change.日付’,
‘app.record.create.change.対応内容’, // ①の修正
‘app.record.edit.change.対応内容’ // ①の修正
];

↑の部分で対応内容が更新された際の処理はできているはずです。

デバッグの方法が下記の記事で紹介されているので確認してみてください。
https://developer.cybozu.io/hc/ja/articles/207613916

HANSAさま

お世話になっております。

早速ご返信いただきありがとうございます。

 

F12でコンソールでエラーが出ているか確認しましたが特にエラーは出ていないようです。

イベントが発生していないという事なのでしょうか?

 

理解が追い付けておらず申し訳ありません。

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

 

 

青山さん

もしかすると、文字列変更のイベントのタイミングかもしれません。

対応内容入力したら、入力欄や保存ボタン以外を一回クリックしてみてください。

 

入力されたタイミングと同時に同期させることはkintoneのイベント仕様上無理ですので、

①対応内容記入

②保存以外の何かしらのアクションを起こす

②のタイミングで変更イベントが発火します。

HANSAさま

お世話になっております。

早速ご返信いただきありがとうございます。

 

①対応内容入力 ←この時点では変化なし

②日付入力 ←この時点で最終更新日、最終対応内容へコピーされます。

③対応内容編集 ←この時点では変化なし

     このタイミングで「入力欄や保存ボタン以外を一回クリック」→テーブルの追加をしましたがだめでした。

     ほかに動作とは何かありますでしょうか?

④日付を一時的に未来へ ←このタイミングで③の内容が更新されます。

 

現状日付を一時的に未来へし正に戻す作業が必須な状況ですが、

仕様という理解となりますでしょうか?

また何か方法がございましたらご教授いただければと思います。

 

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

 

 

 

 

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

青山さん

 

私の環境で動いていることを考慮すると、他に考えられる原因は

・フィールドコードが間違っている

・ほかのJSカスタマイズで’app.record.create.change.対応内容’, ‘app.record.edit.change.対応内容’ のイベントを使っている

の2つだと思います。

よろしくお願いします。

HANSAさま

お世話になっております。

問題がわかりました。

文字列複数行を選択していることが原因だったようです。?

文字列1列でやったところ問題なく同期することが確認できました。

 

文字列複数行やリッチエディターで行うことは可能でしょうか?

 

青山さん

 

なるほど、勝手に文字列一行だと考えていました。すみません。

 

フィールド値変更時イベントについて調べればわかりますが、無理ですね。。。

https://developer.cybozu.io/hc/ja/articles/201941984#step3

HANSAさま

お世話になっております。

 

確認させていただきました。

おかげさまでやりたいことができそうです。

本件踏まえて運用を考えてみたいと思います。

 

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