編集後の値のルックアップ再取得について

Aアプリのフィールドデータを、Bアプリでルックアップ取得している場合において。
Aアプリのレコードを編集した際に、自動的にBアプリのルックアップを再取得させる処理を実装したいと思っています。

現在、Aアプリの保存ボタンをトリガーにして、Bアプリのルックアップ再取得処理を走らせているのですが、Aアプリの保存前(編集前)のデータを再取得してしまうため、結果的に値が変わりません。
Aアプリの編集後の値をBアプリで再取得させたいのですが、よい方法はありますでしょうか。

さかもとさん
ラジカルブリッジの斎藤です。

Aアプリの「保存実行前」イベントをトリガーにしているので、保存前のデータが再取得されてしまうのですね。
「Bアプリのルックアップ再取得」を行わせたい理由は、A側のレコードを編集しても、最初のルックアップの際にAからBにコピーされたフィールドの値が書き換わらない(参照ではなくまさにコピーなので)からだと思いますが、Aアプリの保存時に無理にBアプリのルックアップの再取得をさせるのではなく、Aアプリの編集内容を関連するBアプリ側のレコードに直接更新をかけるというのはいかがでしょうか?

他の手としては、Aアプリの詳細画面表示時に、その前画面が編集画面だったかどうかを判定して、編集画面だった場合はルックアップ再取得を実行するというのができるかもしれません。
kintoneの場合、JavaScriptのリファラー(document.referrer)を使っても思うように前画面のURLが取れないので、前画面のURLでの判定はできないのですが、自前で前画面が何だったかを記録しておくことで、判定が可能になると思います。

そもそもの発端や目的は違うのですが、以前、四宮さんから以下のページにある質問と解決策が示されていましたので、こちらをご参照ください。
https://cybozudev.zendesk.com/hc/communities/public/questions/201391154-%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%BF%BD%E5%8A%A0-%E7%B7%A8%E9%9B%86%E5%BE%8C%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

斎藤様
回答、ありがとうございました。
その後、追加で確認しておりましたところ、実行結果が一定しない、ということがわかりました。
現在の設定の中で、保存ボタンを押下すると、編集後の値がルックアップ再取得される場合と、編集前の値がルックアップ再取得される場合とがあります。(後者は、結果的に何も値は変わりませんが、更新日時だけ更新されます)

これは、仕様上どうしようもないことなのでしょうか?

斎藤様にご提案いただいた、Bアプリ側のレコードに直接更新をかける、という手法については、BアプリユーザにはAアプリの項目の編集をさせたくなく、権限設定がかなり複雑になるので、できるだけ避けたいと思っている状況です。

さかもとさん

そもそもの質問ですが、最初に書かれた
「現在、Aアプリの保存ボタンをトリガーにして、Bアプリのルックアップ再取得処理を走らせているのですが」
について、どのようにしてBアプリのルックアップ再取得処理を実行させているのでしょうか?
私の理解では「ルックアップ再取得」というのは、あるアプリ内の追加・編集画面において、保存実行前イベントやフィールド値変更イベントの時に、あくまでそのアプリ内のルックアップフィールドを再取得させることができるものというふうに思っております。なので、AアプリのイベントをトリガーにBアプリのルックアップ再取得をさせるというところがどうにも理解できておりません。

また、実行結果が一定しないという件は了解しました。上記の質問への回答にもよるのかもしれませんが、タイミング的なものが絡んでいそうですね。

これは、仕様上どうしようもないことなのでしょうか?

さかもとさんがどのようにBアプリのルックアップ再取得処理を実装されているのかによるのではないかと想像します。

斎藤様にご提案いただいた、Bアプリ側のレコードに直接更新をかける、
という手法については、BアプリユーザにはAアプリの項目の編集をさせたくなく、
権限設定がかなり複雑になるので、できるだけ避けたいと思っている状況です。

権限の面などの要件がよくわかっておりませんが、元々AアプリのイベントをトリガーにしてBアプリを更新をさせたいという趣旨のご質問かと思いますので、Bアプリ側のレコードに直接更新をかけられるようにすることが権限設定上困難という意味がよくわかっておりません。元々やられていた方法でも、Aアプリを編集したユーザーがBアプリのルックアップ再取得処理を走らせる権限があるということなのでしょうから、特に違いは無いのではないかと思われます。

尚、私が書いたやり方は具体的には、AアプリのJSで保存実行前イベント発生時に、REST APIを使ってBアプリ側のレコードを更新するようなやり方を想定しています。

BアプリユーザにはAアプリの項目の編集をさせたくなく

BアプリユーザーにAアプリの編集をさせることは必須ではなく、AアプリユーザーがBアプリも更新できれば良いということになるかと思いますがいかがでしょうか?

前提にずれがあるかもしれないので、どのように実装しているかなど、もう少し詳しく教えてください。

斎藤様

ご丁寧に、ありがとうございます。
まず、現在の実装方式について、説明いたします。

前提として、Bアプリは、Aアプリレコード番号により、Aアプリの項目を
ルックアップ引用しています。

Aアプリのレコード番号N番を編集した際に、保存ボタンをトリガーにして
以下の処理をかけています。
①Bアプリ内から、ルックアップキーがN番のレコードを検索
②該当のレコードに対して、Nをルックアップキーにコピーしてアップデート
をかける

ルックアップの再取得処理というよりは、新たに同じルックアップキーを
コピーして取得させる処理、という方が正しい処理説明かもしれません。

BアプリユーザーにAアプリの編集をさせることは必須ではなく、Aアプリ
ユーザーがBアプリも更新できれば良いということになるかと思いますが
いかがでしょうか?

言葉足らずで、すみません。
Bアプリ内に存在する、Aアプリからコピーされてきた項目を、Bアプリユーザ
に編集させたくない、という意味です。
現状はルックアップ項目なので編集できませんが、REST APIを使ってBアプリ
側のレコードを更新する方式を取る場合は、項目ごとに権限設定をしなければ
ならなくなりますが、ルックアップ引用している項目が数十個に上るため、
権限設定がかなり複雑になってしまう、という趣旨でした。

設定困難なわけではなく、複雑というレベルの問題ですので、他に手段が
なければ設定をするしかないかな、とも思っております。

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

さかもとさん

Aアプリのレコード番号N番を編集した際に、保存ボタンをトリガーにして
以下の処理をかけています。
①Bアプリ内から、ルックアップキーがN番のレコードを検索
②該当のレコードに対して、Nをルックアップキーにコピーしてアップデート
をかける

理解いたしました。(少々勘違いしておりました)
先に書きましたように、ルックアップ再取得については、あるアプリ内のJSで、保存実行前イベントやフィールド値変更イベントの時に同じアプリ(レコード)内のルックアップフィールドの再取得しかできないと思っていたので、AアプリのイベントでどうやってBアプリの方の再取得をやらせるのか?と思っていたのですが、AアプリのJSからkintone.api()あるいはXMLHttpRequestを使ってBアプリの対象レコードのルックアップフィールドを更新されているということですね。(これで自動的に他のフィールドもコピーされる)

で、権限設定の煩雑さ等もあるので基本的にはルックアップに伴って多数の項目が自動コピーされるようにしておく形を取るのであれば、やはりAアプリの保存実行前イベントではなく、保存処理後の詳細画面表示時イベントでBアプリのルックアップ再取得処理を走らせるしか無いのではないかと思われます。

斎藤様

お礼、返事が遅くなりまして、申し訳ありません。

「保存処理後の詳細画面表示時イベントで・・・」とのことで、その実装について試みております。

現状、保存前イベントの際には、下記の処理で記述していた部分を、変更案のように変更するだけではダメでしょうか?
(意図通りに動きませんでした)
kintone.events.on([‘app.record.create.submit’,‘app.record.edit.submit’], function (event) {

<変更案>
kintone.events.on(‘app.record.detail.show’, function(event) {

初歩的な質問になってしまっているかもしれず、申し訳ありませんが、よろしくお願いいたします。

さかもとさん

<変更案>
kintone.events.on(‘app.record.detail.show’, function(event) {

詳細画面表示時イベントは’app.record.detail.show’ですので基本はこれで良いと思いますが、これだけだと編集された後の詳細画面なのか、単に詳細画面が閲覧されただけなのかの違いがわからないので、常に再取得処理が走ってしまいます。
一番最初の回答に書いたように、前画面が編集画面だったかどうかを判定した上で再取得処理を走らせるのがよろしいかと思います。(但し回答に書きましたように、リファラーでは判断できませんので、別のテクニックが必要になるかと思います)

ところでそもそも意図通りに動いていないとのことですが、なにがどのように意図通りに動いていないのでしょうか?詳細画面表示時に何も処理が走らないということでしょうか?

斎藤様

すみません、他の対応作業の優先順位があがってしまい、この件の確認・検証が止まってしまっていたのですが、結果的にいただいたアドバイスに沿って、トリガーを変更したところ、ルックアップ再取得処理が動きました。
ありがとうございました。
また、返信が遅くなり、失礼いたしました。
今後とも、よろしくお願いいたします。

さかもとさん

無事解決されたようでなによりです。
また何かありましたらお気軽にご質問ください。

田中と申します。
お話しが解決されている所申し訳ないのですが・・・
ルックアップの更新について、サンプルコードがございましたら
ご提示頂けますと幸いです。
ルックアップ元の値を更新した際に、
ルックアップ先の値も自動で更新させたいのですが、手間取っています。。
何卒よろしくお願い致します。

田中様

大変遅くなりましたが、こちらのスレッドにソースコードを掲載しましたので、よろしければご覧ください。
https://cybozudev.zendesk.com/hc/communities/public/questions/201653724-%E4%B8%80%E8%A6%A7%E7%94%BB%E9%9D%A2%E7%B7%A8%E9%9B%86%E3%82%92%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AB%E3%81%97%E3%81%9F%E4%BB%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E3%81%AE%E3%83%AB%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E5%86%8D%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

さかもと様
ありがとうございます!!とても助かります・・・!
参考にさせて頂きます。

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