お世話になっております。
サブテーブルのあるカラムが変更された時に、他のアプリからデータを取得する機能を考えています。(ルックアップのような機能。)
変更イベントは「“app.record.create.change.サブテーブル内のフィールドコード”」で取得できたのですが、どの行で変更があったのかを特定する情報が取得できていません。
サブテーブルのchangeイベント時に、変更のあった行番号などを取得することは出来ないのでしょうか?
以上、よろしくお願いします。
お世話になっております。
サブテーブルのあるカラムが変更された時に、他のアプリからデータを取得する機能を考えています。(ルックアップのような機能。)
変更イベントは「“app.record.create.change.サブテーブル内のフィールドコード”」で取得できたのですが、どの行で変更があったのかを特定する情報が取得できていません。
サブテーブルのchangeイベント時に、変更のあった行番号などを取得することは出来ないのでしょうか?
以上、よろしくお願いします。
h.egamiさん
event.changes.row.idで変更のあった行番号が分かります。
武井様
ご回答ありがとうございます。
「event.changes.row.id」試してみましたが、以下の点が思った挙動と異なりました。
・試しに出力したidの値は"607324"でした。
⇒サブテーブル内の1行目を変更したので、“0”(配列の0番目)が出力されると期待した。
・保存済のレコード内のサブテーブルに対しては、id値があるが、新規登録時(record.create)やサブテーブルの行追加時には、idがnull。
⇒「app.record.create.change.“サブテーブルのフィールドコード”」イベント時に行を特定したい。
・idが特定できた場合でも、そのidがどの行かを特定するのに、「event.record.Table.value[行番号].id」を行数分ループして比較しないといけない。
「event.changes.row.id」の仕様は、上記のような認識で問題ないでしょうか?
度々の質問になりますが、よろしくお願いいたします。
h.egamiさん
同様の認識です。
create.changeイベント内ではサブテーブルの変更行を特定する情報は得られないと思います。
この場合は、かなり力技になりそうな予感ですが、
独自にchangeイベントを生成するとかの方法になりそうです。
武井様
ご回答ありがとうございます。
そうなのですね。ちょっとやり方を考えてみます。
row.idは知らなかったので、勉強になりました。
ありがとうございました。
row.id はサブテーブルの行idのようなもので一度保存された後に発行されるので、おふたりがおっしゃってるようになります。サブテーブルの行を更新する際に(暗に)使ってると思います。
また、今回のようなケースは event.changes を有効に使えると良いのですが、リンクの記事にも記載がありますが、変更イベントに対してはkintone.Promiseオブジェクトないし非同期処理経由でのreturn event が効かないので、kintone.app.record.set() を使った力技での対応になると思います。
Ryu Yamashita様
ご回答ありがとうございます。
リンクも確認させていただきました。大変参考になります。
最終的に、kintone.Promiseオブジェクトでの値取得/設定を考えていたので、深みにはまるところでした。。。
アプリの構成も含めて、もう一度設計から考えてみます。
恐れ入りました!
このようなスマートな方法があるとは全く存じませんでした。
山下さんのおっしゃる方法が現時点でのベストプラクティスかと思います!
非同期処理をPromiseで処理すること自体は問題ないのですが、最終的にreturn event できないので、kintone.app.record.set() の利用することになるというところですね。全イベントで return できることを切望しています。
横から大変失礼致します。
上記投稿と同様の機能(レコード追加時、サブテーブルの項目変更時に別アプリから項目を取得し、サブテーブルの任意項目に値を設定する)を実装したいと考えているのですが、こちらの回答に類似するようなサンプルソースを掲載しているサイトなどあればご教授お願いしたいです。
サブテーブルのchangeイベント時にどうしても行番号が必要な場合は下記の関数を使えば取得できます。
function getRowIndex(event, table_field) {
var row = event.changes.row;
var tbl = event.record[table_field].value;
for (var i=0; i<tbl.length; i++) {
if (row == tbl[i]) { //same reference
return i;
}
}
return -1;
}