サブテーブル1行ずつ他のアプリの1レコードとして登録したい

いつもお世話になります。

 

Aアプリにあるテーブルのデータ(+テーブル外のデータ)を1行ずつBアプリのレコードに登録したいです。

かなりの初心者のためご教示頂けますと幸いです。サンプルとなる記述などあれば教えていただけますと大変ありがたいです。

 

★Aアプリのサブテーブルのフィールド

・部屋番号(ドロップダウンフィールド)

・氏名(文字列1行フィールド)

・宿泊日時(日時フィールド)

★Aアプリのテーブル外のフィールド

・宿泊代表者氏名(文字列1行フィールド)

上記サブテーブルの1行目が、Bアプリの1レコードとして登録される仕組みです。

★Bアプリのフィールド

・部屋番号(ドロップダウンフィールド)

・氏名(文字列1行フィールド)

・宿泊日時(日時フィールド)

 

さらにこの後の処理として、Aアプリのテーブルの値を変更・更新した場合、Bアプリの該当レコードの値も変更されるようにしたいと思っておりますが可能なのでしょうか・・・

以上となります。何卒宜しくお願い致します。

 

 

 

 

 

 

 

つちのこさん

 

以下でどうでしょうか。アプリBに新たに数値のフィールドを追加してフィールドコードをkeyに設定し、以下のコードをアプリAに適用させてください。Aアプリの複数行のサブテーブルを分割しそれぞれ1行のサブテーブルとしてBアプリに登録、Aアプリのレコードの変更保存時に対応するBアプリのレコードも変更するという最低限の動きをします。

コメントで①②③と書かれている部分は以下のように書き換えてください。

①BappIdはBアプリのidに変更

②TableをBアプリのサブテーブルのフィールドコードに変更

③TableをAアプリのサブテービルのフィールドコードに変更

(function() {
"use strict";
const BappId = 15; //①
//Bアプリへ登録
kintone.events.on("app.record.detail.show", function(event) {
const regButton = document.createElement('button');
regButton.innerText = 'Bアプリへ登録';
regButton.onclick = function() {
const table = event.record.Table.value; //③
const recordId = event.recordId;
let postTable = [];
for (let i = 0; i < table.length; i++) {
const columns = table[i].value;
postTable.push(
{
"Table": {//②
"value": [
{
"value": {
"部屋番号": {
"value": columns.部屋番号.value
},
"氏名": {
"value": columns.氏名.value
},
"宿泊日時": {
"value": columns.宿泊日時.value
}
}
}
]
},
"key": {
"value": recordId
}
}
);
}

const postData = {
"app" : BappId,
"records": postTable
};

kintone.api(kintone.api.url('/k/v1/records', true), 'POST', postData,
function(resp) {
alert('アプリBへ登録しました');
},
function(error) {
console.log(error);
return event;
});
};
kintone.app.record.getHeaderMenuSpaceElement().appendChild(regButton);
});

//Aアプリを変更した際にBも変更
kintone.events.on("app.record.edit.submit.success", function(event) {
const recordId = event.recordId;
const body = {
'app': BappId,
'query': 'key = ' + recordId,
};
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body)
.then(function(resp) {
const records = resp.records;
const table = event.record.Table.value; //③

let putRecords = [];
for (let i = 0; i < records.length; i++) {
const columns = table[i].value;
putRecords.push(
{
"id": records[i].$id.value,
"record": {
"Table": {//②
"value": [
{
"value": {
"部屋番号": {
"value": columns.部屋番号.value
},
"氏名": {
"value": columns.氏名.value
},
"宿泊日時": {
"value": columns.宿泊日時.value
}
}
}
]
}
}
}
);
}

const putBody = {
'app': BappId,
"records": putRecords
}

kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', putBody,
function(resp) {
alert('アプリBも変更しました');
},
function(error) {
console.log(error);
return event;
});
});
});
})();

A_Suzukiさま

 

コメントありがとうございます!!

参考にさせて頂きました、追加で質問させて頂きたいのですが、

実は、実装したい処理は、Aアプリのテーブル1行ずつ、テーブルの数だけBアプリにレコードを自動生成することでした。

(例えば、Aアプリにて3行分のテーブルを登録したら、Bアプリには3つのレコードが生成されるイメージです)

大変恐縮ですが、そういった場合に頂いたコードにて変更となる箇所を教えていただけませんでしょうか・・?

 

また、頂いたコードでは、ボタン押下でBアプリへ登録されるような処理ですが、

できればAアプリの詳細画面にてさいごに「保存」ボタンを押下後にBアプリに登録されるようにしたいと思っております。

その場合のコードを教えていただくことはできるのでしょうか?

 

当方大変初心者で申し訳ございません、ご教示いただけますと大変助かります。

以上、宜しくお願い致します。

 

 

 

A_Suzukiさまより頂いたコードでは、