アプリAのテーブルデータを、アプリBの文字列フィールドに条件付きでコピーしたい。

アプリBのルックアップフィールドに入力されている値(番号)が一致するレコードをアプリAから取得して、
取得したデータの中のテーブルデータのみを、アプリBの文字列フィールドにコピーしたいです。

REST APIを使用する事によって可能なのではと思うのですが、記述が難解で困っています…。

const Number = event.record.番号のフィールドコード.value;
const body ={

            'app': 99, //アプリAのID
            'query': 'アプリAの番号のフィールドコード = " ' + Number + ' " ';
            'fields': ['アプリAのテーブル内のフィールドコード']
};

kintone.api('/k/v1/records', 'GET', body) //これ以降の記述が分かりません…。

情報が足りない場合は追記しますので、教えてください。
JavaScript初級ですが、分からないなりに模索しながらカスタマイズをしております。
どうぞよろしくお願い致します。

こんにちは。

まず初めに、kintone REST API のレコード取得処理 “GET” では、
fields に テーブル内フィールを指定すると、各行のレスポンスが
空の状態になってしまうため、テーブルのフィールドコードを指定する必要があります。

そうするとテーブルデータを含んだレスポンスが返ってくるので、
kintone.api 関数からの戻り値を一旦変数に入れて、その変数を利用し、
アプリB へ実行するレコード登録/更新 API のリクエストを作成/実行する流れに
なるかと思います。

“GET” のレスポンスからテーブルデータを抽出するには、
以下のようなコードで可能です。

const Number = event.record.番号のフィールドコード.value;
const body ={

            'app': 99, //アプリAのID
            'query': 'アプリAの番号のフィールドコード = " ' + Number + ' " ';
            'fields': ['アプリAのテーブルのフィールドコード']
};

const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body);
const table = resp.records[0].テーブル.value;
console.log(table)

table 変数の代入処理では、 “GET” レスポンスに入っている 1番目のレコードから、
テーブルデータを抽出しています。

テーブル内データのデータ構造については、以下のページを見ることで、
理解することが出来るかと思います
※ フィールド形式 > 取得するとき項目を確認することで、
“GET” で取得されるデータがどのようになるか分かりますよ

上記ページをみながら、必要なデータを取得して、
レコード登録/更新処理を作成/実行することで、
希望する動作を行うことが可能と思います。

レコード登録/更新処理は、以下のページを参考に作成してみてください。

「いいね!」 1

返信が遅れまして申し訳ありません。
ご丁寧な回答をありがとうございます。

‘fields’ にテーブル内のフィールドコードを指定してしまうと、空のレスポンスが返ってくるという事は知りませんでした。
頂いたコードや記事を見ながら、変数「table」にアプリAのテーブルデータを入れるところまでは
出来ましたので、あとはどうやって目的のフィールドに、その値を入れるかという部分になるかと思います。

これについて、kintone REST API のレコード登録/更新処理 “POST” / “PUT”を検討しましたが、想定している動作とは異なると感じました。

実現したい機能について追記となってしまうのですが、アプリBのレコード新規作成画面にて、
日付フィールドに値が入力されたタイミングで、既に入力されている番号フィールドの値と一致するアプリAのレコード内のテーブルデータを、アプリBの新規作成中のレコード画面内の各文字列フィールドに即時反映させたいというものになります。

試したコードは以下となります。

kintone.events.on('app.record.create.show','app.record.edit.show', async (event)=>{

        const Record = event.record;
        const Number = Record.アプリBの番号のフィールドコード.value;

        const body ={

            'app': 99, //アプリAのID
            'query': 'アプリAの番号のフィールドコード = " ' + Number + ' " ';
            'fields': ['アプリAのテーブルコード']
        };

        const Resp = await kintone.api(kintone.api.url('/k/v1/records', true),'GET', body);
        const Table = Resp.records[0].アプリAのテーブルコード.value;

        Record.アプリBの文字列フィールドコード.value = Table[0].value.アプリAのテーブル内のフィールドコード.value; //テーブルデータの中の一部を抽出して代入。
        return event;
    });

本当は「app.record.create.change.アプリBの日付フィールドコード」のタイミングで処理させたかったのですが、コンソールにエラーが出てしまったため、消しました。

実現したい機能を実現する場合、確認してもらっているように、
app.record.create.change イベントを利用する必要があります。

なお、app.record.create.change イベントは、Promise に対応していないため、
イベント内で Promise を利用すると、エラーが発生してしまいます。

そのため、app.record.create.change イベントを利用する場合には、
Promise を使用しない方法で、処理を作成する必要があります。

Promise を使用しない方法としては、kintone.api 関数の successCallback 引数内の
処理にて、以下の関数を利用してフィールド値を書き換える方法があります。

上記関数を利用して、以下のような処理を作成/実行することで、
app.record.create.change イベントで、フィールド値の書き換え処理を
実行することが出来ます。

※ 番号フィールドが数値フィールドと仮定して、
クエリ部分も少し変更してます。

(() => {
  "use strict";

  kintone.events.on('app.record.create.change.日付', (event) => {
    const Number = event.record.アプリBの番号のフィールドコード.value;
    const body = {
      app: 99, //アプリAのID
      query: "アプリAの番号のフィールドコード = " + Number,
      fields: ["アプリAのテーブルコード"],
    };
    kintone.api(
      kintone.api.url("/k/v1/records", true),
      "GET",
      body,
      function (Resp) {
        const Record = kintone.app.record.get();
        const Table = Resp.records[0].アプリAのテーブルコード.value;
        Record.record.アプリBの文字列フィールドコード.value = Table[0].value.アプリAのテーブル内のフィールドコード.value;
        kintone.app.record.set(Record);
      },
      function (Err) {
        console.log(Err);
      }
    );
  });
})();

↑ のような処理でご希望の動作ができるか、確認してみてくださいー

「いいね!」 1

ご返信ありがとうございます。

頂いたコードを試してみましたところ、最初はエラーが出てしまいましたが、クエリ部分を
以下のように修正しましたところ、エラーが解消され、想定通りの動作となりました!!
本当にありがとうございました!!

'query': 'アプリAの番号のフィールドコード = " '+ Number +' " ',
「いいね!」 1

このトピックは最後の返信から 60 分が経過したので自動的にクローズされました。新たに返信することはできません。