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

**URL:** <https://community.cybozu.dev/t/topic/7700>\
**Category:** kintone 開発相談\
**Created:** [2023 年 6 月 30 日午前 3:23 UTC](https://community.cybozu.dev/t/topic/7700 "2023-06-30T03:23:25Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ryu](https://avatars.discourse-cdn.com/v4/letter/r/a88e4f/32.png) [@Ryu](https://community.cybozu.dev/u/Ryu)\
**Post date:** [2023 年 6 月 30 日午前 3:23 UTC](https://community.cybozu.dev/t/topic/7700/1 "2023-06-30T03:23:25Z")

</div>

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

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

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

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

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

```

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

---

<div class="post-metadata">

**Author:** ![ko\_ji](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/ko_ji/32/31_2.png) [@ko\_ji](https://community.cybozu.dev/u/ko_ji)\
**Post date:** [2023 年 6 月 30 日午前 3:57 UTC](https://community.cybozu.dev/t/topic/7700/2 "2023-06-30T03:57:56Z")

</div>

こんにちは。

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

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

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

```javascript
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” で取得されるデータがどのようになるか分かりますよ

> **[フィールド形式](https://cybozu.dev/ja/kintone/docs/overview/field-types/)**
>
> kintone のフィールド形式について説明します。

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

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

> **[レコード](https://cybozu.dev/ja/kintone/docs/rest-api/records/)**
>
> レコードを操作する kintone REST API です。

---

<div class="post-metadata">

**Author:** ![Ryu](https://avatars.discourse-cdn.com/v4/letter/r/a88e4f/32.png) [@Ryu](https://community.cybozu.dev/u/Ryu)\
**Post date:** [2023 年 7 月 4 日午前 6:57 UTC](https://community.cybozu.dev/t/topic/7700/3 "2023-07-04T06:57:36Z")

</div>

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

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

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

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

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

```javascript
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の日付フィールドコード」のタイミングで処理させたかったのですが、コンソールにエラーが出てしまったため、消しました。

---

<div class="post-metadata">

**Author:** ![ko\_ji](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/ko_ji/32/31_2.png) [@ko\_ji](https://community.cybozu.dev/u/ko_ji)\
**Post date:** [2023 年 7 月 4 日午前 8:29 UTC](https://community.cybozu.dev/t/topic/7700/4 "2023-07-04T08:29:48Z")

</div>

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

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

> **[イベントオブジェクトで実行できる操作](https://cybozu.dev/ja/kintone/docs/js-api/events/event-object-actions/#record-create-events)**
>
> kintone のイベントオブジェクトで実行できる操作を説明します。

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

Promise を使用しない方法としては、[kintone.api](https://cybozu.dev/ja/kintone/docs/js-api/api/kintone-rest-api-request/) 関数の successCallback 引数内の  
処理にて、以下の関数を利用してフィールド値を書き換える方法があります。

- [kintone.app.record.get()](https://cybozu.dev/ja/kintone/docs/js-api/record/get-record/)  
⇒ 現在開いているレコードのデータを取得します
- [kintone.app.record.set(record)](https://cybozu.dev/ja/kintone/docs/js-api/record/set-record-value/)  
⇒ 現在開いているレコードに値を設定します

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

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

```javascript
(() => {
  "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);
      }
    );
  });
})();

```

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

---

<div class="post-metadata">

**Author:** ![Ryu](https://avatars.discourse-cdn.com/v4/letter/r/a88e4f/32.png) [@Ryu](https://community.cybozu.dev/u/Ryu)\
**Post date:** [2023 年 7 月 5 日午前 4:17 UTC](https://community.cybozu.dev/t/topic/7700/5 "2023-07-05T04:17:56Z")

</div>

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

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

```javascript
'query': 'アプリAの番号のフィールドコード = " '+ Number +' " ',

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2023 年 7 月 5 日午前 5:18 UTC](https://community.cybozu.dev/t/topic/7700/6 "2023-07-05T05:18:15Z")

</div>

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