【kintone】AアプリからBアプリへの関連レコード反映で反映できなかったものの抽出

表題のままですが、

AアプリからBアプリへ関連レコード一覧でBアプリにAアプリの内容を表示している状態

①AアプリにCSVファイルをインポート

②Bアプリに反映しなかった(紐づけているデータがBアプリにない)Aアプリ内のレコードを抽出

上記はkintone内で設定可能でしょうか。

山下祐樹様

お世話になっております.
トヨクモの江田と申します.

JavaScript等で処理するのが良いと思います.

  1. Bアプリの各レコードについて,kintone REST APIで関連レコードを取得する.
  2. 1の取得結果から,関連レコードに使われているAアプリのレコードをリスト化する.
  3. kintone REST APIでAアプリのレコードを全件取得する.
  4. 2と3から関連レコードに使われていないAアプリのレコードを抽出する.
    といった流れになるかと思います.

kintone REST APIでのレコードの取得方法については下記などをご覧ください.
https://developer.cybozu.io/hc/ja/articles/201941754
https://developer.cybozu.io/hc/ja/articles/202331474#step2

また,関連レコードの取得についてはナレッジノートでご紹介しているので,よろしければご覧ください.
https://developer.cybozu.io/hc/ja/community/posts/360017851006

江田 様

ご回答ありがとうございます。

お返事が遅くなりまして申し訳ございません。

色々と頂いた情報で自分なりに調べてみたのですが、恐縮ながら上手く設定ができません・・。

もしよろしければ、詳細の手順をご教授頂くことは難しいでしょうか?

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

連投ですみません。

ちなみにですが、一覧表示にて、Aアプリで、Bアプリに紐づけている情報がないレコードのみを表示する方法などはありますでしょうか?

山下祐樹様

お世話になっております。
返信遅くなりました。

下記JSで、「filteredRecord」にBアプリに反映しなかったAアプリ内のレコードが抽出されます。(こちらなどを参考にコンソール画面を確認してください)
アプリAで、こちらの「RelatedRecordsFieldManager.js」を読み込み後、下記JSを読み込んでください。
あとはカスタマイズビューなどで、「filteredRecord」をDOMに書き出せば表示できます。

(function() {
  "use strict";
  var getRecords = function(app, tmpRecords){
    var limit = 500;
    var tmpRecords = tmpRecords || [];
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
      app: app,
      query: 'limit ' + limit +' offset ' + tmpRecords.length
    }).then(function(response){
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
  };
  kintone.events.on([
    'app.record.index.show',
  ], function(event){
    var referencingApp = **** ; //アプリBのID
    var relatedRecordsField = ' ****'; //関連レコードのフィールドコード
    RelatedRecordsFieldManager.prototype.selfAppId = referencingApp;
    kintone.Promise.all([
      getRecords(kintone.app.getId()),
      kintone.Promise.all([
        RelatedRecordsFieldManager.prototype.getFieldProperties(),
        getRecords(referencingApp),
      ]).then(function(responses){
        return kintone.Promise.all(responses[1].map(function(referencingAppRecord){
          return (new RelatedRecordsFieldManager(relatedRecordsField)).getRecords(referencingAppRecord);
        }));
      })
    ]).then(function(responses){
      var relatedRecordIds = [].concat.apply([], responses[1].map(function(relatedRecords){
        return relatedRecords.map(function(relatedRecord){
          return relatedRecord.$id.value;
        });
      }));
      var filteredRecord = responses[0].filter(function(record){
        return relatedRecordIds.indexOf(record.$id.value) === -1;
      });
      console.log(filteredRecord);
    });
  });
})();

江田 様

ご回答ありがとうございます。

いただいた情報で試してみます。

丁寧なご対応ありがとうございました。