Ryu
(JS初級)
1
アプリ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初級ですが、分からないなりに模索しながらカスタマイズをしております。
どうぞよろしくお願い致します。
ko_ji
(ko_ji)
2
こんにちは。
まず初めに、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
Ryu
(JS初級)
3
返信が遅れまして申し訳ありません。
ご丁寧な回答をありがとうございます。
‘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の日付フィールドコード」のタイミングで処理させたかったのですが、コンソールにエラーが出てしまったため、消しました。
ko_ji
(ko_ji)
4
実現したい機能を実現する場合、確認してもらっているように、
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
Ryu
(JS初級)
5
ご返信ありがとうございます。
頂いたコードを試してみましたところ、最初はエラーが出てしまいましたが、クエリ部分を
以下のように修正しましたところ、エラーが解消され、想定通りの動作となりました!!
本当にありがとうございました!!
'query': 'アプリAの番号のフィールドコード = " '+ Number +' " ',
「いいね!」 1
system
(system)
クローズされました:
6
このトピックは最後の返信から 60 分が経過したので自動的にクローズされました。新たに返信することはできません。