レコード保存時に、別アプリのサブテーブルへの値更新

お世話になっております。

 

掲題の件、レコード保存時に別アプリにあるフォームを更新したいと思っております。

以下URLを参照し、コードを作成しました。

https://cybozudev.zendesk.com/hc/ja/articles/201941784-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B4%E6%96%B0-PUT-

 

しかし、レコードの保存ボタンを押しても別アプリへ値が更新されません。

「// テーブルの中に配置されているフィールドの1行目の場合」以降のコードを削除し、

単体の日付フォームだけの更新であれば問題なく動作するので、サブテーブル更新のコード記載に誤りがあるのですが、

どこを直せばよいかわかりません。

 

修正箇所をご教授いただけないでしょうか。

よろしくお願いいたします。

==========================================================================

kintone.events.on([‘app.record.edit.submit’,‘app.record.create.submit’],function(event) {

var record = event.record;

var userinf = record[‘staffNo’].value;

// 別アプリに対象のレコードが存在することを確認
var masterAppId = 28;
var query = ‘staffNo="’ + userinf + '" order by staffNo desc limit 1 ';

return new kintone.Promise(function(resolve, reject) {
var params = {app: masterAppId, query: query};

kintone.api(‘/k/v1/records’, ‘GET’, params, function(resp) {
resolve(resp);
});

}).then(function(resp) {

if (resp.records.length) {

var respId = resp.records[0].レコード番号.value;
var resp1 = resp.records[0].日付.value;
var resp2 = resp.records[0].数値.value;

var json1 = {
app :masterAppId,
id:respId,
record : {
日付 : {
value : “2016-01-01”
},

// テーブルの中に配置されているフィールドの1行目の場合
Table : {
value : {
“0” :{
value : {
//テーブル内の日付フォーム
tb1 : {
value : resp1
},
//テーブル内の数値フォーム
tb2 : {
value : resp2
}
}
}
}
}

}
};

return kintone.api(‘/k/v1/record’, ‘PUT’, json1);
}

}).then(function(resp) {
return event;

});

});

==========================================================================

 

y-kishiさん

 

サブテーブル部分のJSONに問題がありそうに感じます。JSON厳格化関連トピック)に関連していると思いますが、Table.valueの配下が数値をキーにした連想配列になっているようですが、ここは配列になるかと思います。

Ryu Yamashita 様

お世話になっております。

ご回答いただきありがとうございます。

 

連想配列から配列にコードを書き換えたところ

無事動作いたしました。

 

まったく考えになかった修正だったので、大変助かりました。

ありがとうございます。

 

最終的にJSON部分の記載は以下のようになりました。

========================================================

var json1 = {
app :masterAppId,
id:respId,
record : {
日付 : {
value : “2016-01-01”
},

// テーブルの中に配置されているフィールドの1行目の場合
“Table” : {
“value” : [
{
“id” : “0”,
value : {
“tb1” : {
“value” : resp1
},
“tb2” : {
“value” : resp2

}
}

}
]
}

}
};

========================================================

解決されて、良かったです。

小出しのご質問で申し訳ありません。

 

Aアプリでレコード保存した際に、Bアプリへサブテーブルの値を入力することはできたのですが、

Bアプリのサブテーブルの1行目にまず空行を作成し、その空行に値を入力することは可能なのでしょうか?

 

 

以下のようなコードを作成したのですが、空行は作成されませんでした。

空行の挿入方法をご教授いただけないでしょうか。

よろしくお願いいたします。

============================================================================

~省略~

}).then(function(resp) {

if (resp.records.length) {

 

//サブテーブルの先頭に行を追加する
var newRow = {

“value”: {
“tb1” : {
“type”: “DATE”,
“value” : null
},
“tb2” : {
“type”: “NUMBER”,
“value” : “”
},
}
};

resp[‘record’][‘Table’][‘value’].unshift(newRow);

=====================================================================

出来るはずです(出来てことがあります)。ちなみにREST APIでの更新なのでサブテーブル行内に追加で指定する列は1つでも大丈夫です(必須のフィールドがあればそれはセットする必要がありますが)。

 

ブレークポイント打ったり、consoleに出した際に、Table.valueは意図した形になっていますでしょうか。

お世話になっております。

 

ご質問しておきながら、中途半端なまま放置しており申し訳ありませんでした。

 

別アプリへのテーブル更新の実装はできておりませんが、

運用方法を見直し、テーブルへの更新作業が必要がなくなりました。

 

Ryu Yamashita 様にはアドバイスをいただき大変参考になりました。

ありがとうございました。