お世話になります。
テーブルのデータを別のアプリに受け渡すところで躓いております。
例えば、アプリAで一つのテーブルに3行あったとします。
この3行分のデータをそのままアプリBにJavascriptで受け渡そうと、各行を変数iとして0から2まで動かすと、最終行のみ1行がアプリBに表示される状況です。
受け渡しのデータは行数分取れています。どうやったら複数行、アプリBに受け渡されるのかわかる方がいればアドバイスをお願いします。
以下にアドバイスをお願いしたいソースを記載します。
kintone.events.on('app.record.create.submit.success', function(event) {
var record = event.record;
var tableRecords = record.table.value;
var tableCount = tableRecords.length -1;
var appURL = 'https://(中略)/k/v1/record.json';
var tmpHeades = {'X-Cybozu-Authorization': (中略)=','Content-Type': 'application/json'};
for(i=0; i<=tableCount;i++){
var reqBody =
{
"app": アプリBのID,
"updateKey": {
"field": "Bフィールド名",
"value": record.Aフィールド名.value
},
"record": {
"table":{
"id":i,
"value":[
{
"value":{
"table_facility": {
"value": tableRecords[i].value['table_1'].value
},
"table_start_point": {
"value": tableRecords[i].value['table_1'].value
}}}]}}
}
}
kintone.proxy(appURL, 'PUT', tmpHeades, reqBody, function(resp){
}, function(resp){
}
);
})
teranaka さん
ざっと見る限り、2点気になります。
1)ループをかける場所が違うかなと思います。
今のプログラムの場合、例えば、
"app": アプリBのID,
この部分も、テーブルの行数だけ生成されてしまいます。本来ループをかけるべきは、Tableの値の部分ですね。
フィールド形式
https://developer.cybozu.io/hc/ja/articles/202166330
こちらの、Subtableの部分を見てもらうと、イメージわくかなと思います。
2)reqBodyがループのたびに新しく生成されている
ループの中で、毎回 var reqBody = と宣言されるので、毎回毎回、新たに reqBodyが定義され、そこに値が
代入されている状態ですね。なので、最終行だけが、きちんとレコード登録されている状態かと。
変数定義は1回のみで、あとはループをまわしながら、その変数に文字を付け足していくのが、正しい流れだと思われます。
実際にアプリBへの登録は成功しているので、上記2点を調整すれば、上手くいくと思います。
上海レンユアー松村様
回答の方が遅くなってしまい大変失礼いたしました。
ありがとうございます、指定されたサイトから完成イメージがつきました。
ただ、「文字を付け足していく」の箇所を以下の2点を試してみましたがうまくいっていない状態です。
・reqBody内でfor文を定義
“record”: {
“G_table”:{
“value”:[
for(i = 0; i <= tableCount; i++)
{
この場合ではコンソールエラーが生じます
・新規変数bodyを作成、最後にreqBodyへ足し合わせ
for(i = 0; i <= tableCount; i++)
{
var body ={
“record”: {
“G_table”:{
~処理~
reqBody += body;
}
reqBodyに正しい値が入っていないようです。
申し訳ございませんが、再度ご教示いただけますと幸いです。
teranakaさん
細かくコード書いている時間がなく、またざっくりとしたアドバイスになってしまいますが、
御了承ください。
今回 teranakaさんが生成するJSONの最終系は以下の様な形式になると思います(APP指定部分は省略)
https://developer.cybozu.io/hc/ja/articles/202166330 より抜粋
"<フィールドコード>": {
"value": [
{
"value": {
"文字列 __1行__ 0": {
"value": "サンプル1"
},
"数値_0": {
"value": "1"
}
}
},
{
"value": {
"文字列 __1行__ 0": {
"value": "サンプル2"
},
"数値_0": {
"value": "2"
}
}
}
]
}
この形式の文字列を生成するのが、プログラムとしてのゴールとなります。
これを3つのグループにわけるとすると以下の様になります。
第一グループ
"<フィールドコード>": {
"value": [
第二グループ
{
"value": {
"文字列 __1行__ 0": {
"value": "サンプル1"
},
"数値_0": {
"value": "1"
}
}
},
{
"value": {
"文字列 __1行__ 0": {
"value": "サンプル2"
},
"数値_0": {
"value": "2"
}
}
}
第三グループ
]
}
この第二グループは、テーブルが2行あるパターンですね。つまりこの文字列の生成には、ループが必要ということです。
teranakaさんのコードを、
第一グループ生成 1回だけ
第二グループ生成 テーブル行数分ループ
第三グループ生成 1回だけ
にして、最後に、
第一グループ+第二グループ+第三グループ で最終版文字列を生成。
その形式が正しければ、上手く書き込めると思います。
あと、これは急がば回れですが、一旦、JavaScriptの中で、上記の様な文字列を
ベタ打ちで、生成して、書き込み成功するところまで、作ると良いと思います。
それで成功したら、それをロジックに落とし込んでいくと、よいかなと。
上海レンユアー松村様
お世話になっております。また返信が遅れてしまい申し訳ありません。
少々長い処理になりましたが指摘の通り、文字列のベタ打ちで望み通りの処理が動くようになりました。
ありがとうございました。