更新処理がうまくいかない。。。

お疲れ様です。

まず以下のアプリを作成しました。

処理について

① 更新したテスト書籍登録のレコードを取得

② 更新したレコードの書籍番号とテスト書籍登録サブにあるレコードの書籍番号が一致したレコード番号を取得

③ ②をもとにそのレコード番号のレコードに①で取得したレコード内容を更新

 

データの取得まではうまくできているのですが、更新処理が行われません。

何が原因なのかよくわからず質問させていただきました。

分かる方がいらっしゃれば教えていただけますでしょうか。

 

以下が作成した処理になります。

/*
*
* 全件レコード取得処理
*
*/
(function get_Records(){
“use strict”;

//変数宣言
var offset = 0;
var records = new Array();
var loopendflg = false;

var offset_sub = 0;
var loopendflg_sub = false;

/*書籍登録テスト 処理*/
while(!loopendflg){

var query = encodeURIComponent(‘order by レコード番号 asc limit 100 offset ’ + offset);
var appUrl = kintone.api.url(’/k/v1/records’) + ‘?app=’+ 33 + ‘&query=’ + query; //書籍登録テスト アプリID

//リクエストヘッダ
var xmlHttp = new XMLHttpRequest();
xmlHttp.open(“GET”, appUrl, false);
xmlHttp.setRequestHeader(‘X-Requested-With’,‘XMLHttpRequest’);
xmlHttp.send(null);

//格納
var respdata = JSON.parse(xmlHttp.responseText);
if(respdata.records.length > 0){
for(var i = 0; respdata.records.length > i; i++){
records.push(respdata.records[i]);

//書籍登録テストの書籍番号取得
alert(“appUrl :”+ appUrl +“配列”+ i +“番目の”+“書籍番号 :”+JSON.stringify(respdata.records[i].書籍番号.value));

var shoseki = JSON.stringify(respdata.records[i].書籍番号.value);

var offset_sub = 0;
var loopendflg_sub = false;

/*書籍登録サブ 処理*/
while(!loopendflg_sub){
var appUrl_sub = kintone.api.url(‘/k/v1/records’) + ‘?app=’+ 34 + ‘&query=’ + query; //書籍登録サブ アプリID
var xHp = new XMLHttpRequest();
xHp.open(“GET”, appUrl_sub, false);
xHp.setRequestHeader(‘X-Requested-With’,‘XMLHttpRequest’);
xHp.send(null);

//格納
var resp = JSON.parse(xHp.responseText);
if(resp.records.length > 0){
for(var j = 0; resp.records.length > j; j++){
records.push(resp.records[j]);

//書籍登録サブの書籍番号取得
alert(“appUrl_sub”+ appUrl_sub +“配列”+ j +“番目の”+“書籍番号 :”+ JSON.stringify(resp.records[j].書籍番号.value));

//書籍番号比較
if(resp.records[j].書籍番号.value == respdata.records[i].書籍番号.value){

var i_sub = JSON.stringify(resp.records[j].レコード番号.value); //レコード番号取得
var shoseki_sub = JSON.stringify(resp.records[j].書籍番号.value);

alert(“一致レコード発見”);

};
};
offset_sub += resp.records.length;

loopendflg_sub = true;
}else{
loopendflg_sub = true;
}
};

//書籍登録と書籍登録サブの書籍番号が一致した場合のみ以下の処理開始
if(shoseki == shoseki_sub){

alert(“同レコードのため更新開始”);

alert(JSON.stringify(respdata.records[i].シリーズ名.value));

var url = ‘https://devqsdtfb.cybozu.com/k/v1/records.json’;

var body = {
“app”:34,
“records”:[
{
“id”:i_sub,
“record”:{
“ID”:{
“value”:JSON.stringify(respdata.records[i].数値.value)
},
“ISBN番号”:{
“value”:JSON.stringify(respdata.records[i].ISBN番号.value)
},
“本体価格”:{
“value”:JSON.stringify(respdata.records[i].本体価格.value)
},
“書名”:{
“value”:JSON.stringify(respdata.records[i].書名.value)
},
“書名_フリガナ”:{
“value”:JSON.stringify(respdata.records[i].書名_フリガナ.value)
},
“シリーズ番号”:{
“value”:JSON.stringify(respdata.records[i].シリーズ番号.value)
},
“シリーズ名”:{
“value”:JSON.stringify(respdata.records[i].シリーズ名.value)
}

}
}
],
// CSRF TOKEN: kintone上からAPI(POST, PUT, DELETE)を実行する場合に設定する必要あり
“__REQUEST_TOKEN__”: kintone.getRequestToken()
};

// リクエストヘッダ
var xhr = new XMLHttpRequest();
xhr.open(‘PUT’, url);
xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
xhr.setRequestHeader(‘Content-Type’, ‘application/json’);
xhr.onload = function() {
if (xhr.status === 200) {
// success
console.log(JSON.parse(xhr.responseText));
} else {
// error
console.log(JSON.parse(xhr.responseText));
};
};
xhr.send(JSON.stringify(body));

};
}
offset += respdata.records.length;
}else{
loopendflg = true;
}
}
})();

 

 

 

SAKAgogo さん

このサンプルコードですが、ブラウザでkintoneを開いて開発者コンソール上で実行しているのでしょうか。

kintoneカスタマイズであれば、kintone JavaScript APIを用いて、コードを実行するタイミングをある程度制御する必要があります。

下記の記事が参考になります。
https://developer.cybozu.io/hc/ja/articles/201755040

前者である場合なら

① 更新したテスト書籍登録のレコードを取得
⇒更新したテスト書籍登録のレコード、というのがよくわからないのですが、提示頂いたコードだと全件取得しようとしています。
それで問題ないですか?

② 更新したレコードの書籍番号とテスト書籍登録サブにあるレコードの書籍番号が一致したレコード番号を取得
⇒テスト書籍登録とテスト書籍登録サブのレコードを全件取得してからレコード番号を比較している。
また、ループ処理のせいでうまくできていないような気がします。

③ ②をもとにそのレコード番号のレコードに①で取得したレコード内容を更新
⇒ループ処理と同じ名前の変数が多数用意されておりうまく動作していないように思います。

書き直して見ますので、①番の質問部分に回答お願いします。

 

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

まずは全件取得処理で行ってみようと考えこの処理にしましたが、最終的にはは更新したレコードのみ他アプリの関連レコードも更新というようにしたいです。

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

 

SAKAgogoさん

kintoneはJSイベントがあるので、全件取得するよりも
レコード編集画面の保存成功後イベントをつかって
更新されたレコードのみに絞った方がやりやすいです。

また、kintone内でkintone REST APIを実行する際は、xhrよりもkintone.api()メソッドを使ったほうがやりやすいです。

今回は、queryによる一括取得と、一括更新をしています。

作成してみました。

(function (){
'use strict';

kintone.events.on('app.record.edit.submit.success', function(event) {
var record = event.record;
var Id = record.書籍番号.value;
var tagetappID = xx; // おそらく34
var params = {
'app': tagetappID,
'query': '書籍番号 = "' + Id + '"'
}
kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
var subRecords = resp.records
var body = {
'app': tagetappID,
'records': [
]
};
for (var i = 0; i < subRecords.length; i++){
var putRecord = {
'id': subRecords[i].レコード番号.value,
'record': {
'書籍番号': {
'value': record.書籍番号.value
},
'ISBN番号': {
'value': record.ISBN番号.value
},
'本体価格':{
'value':record.本体価格.value
},
'書名':{
'value':record.書名.value
},
'書名_フリガナ':{
'value':record.書名_フリガナ.value
},
'シリーズ番号':{
'value':record.シリーズ番号.value
},
'シリーズ名':{
'value':record.シリーズ名.value
}
}
}
body.records.push(putRecord);
}
console.log(body);
return kintone.api('/k/v1/records', 'PUT', body)
}).then(function(resp) {
console.log(resp);
return event;
}).catch(function(err) {
console.log(err);
return event;
});

});

})();

もし処理内容がわからない場合、

はじめようkintone APIの第10回第11回を読んでみてください。

望んでいた処理ができました!

本当にありがとうございます。

queryをこのように書くんですね。勉強になりました。

SAKAgogo さん

良かったです!

ぜひ先ほどのリンク先の記事も読んで勉強してみてください!

申し訳ありません。

上記の処理について、どこで主アプリの書籍番号とサブアプリの書籍番号を比較しているのでしょうか 。

SAKAgogo さん

SAKAgogoさんはおそらくkintone JS APIのイベントについて理解されていないようなので、
まずは第1回 kintone javascript APIのイジりかた の kintoneのイベント処理に触れてみる を確認してみてください。

 

そのうえで少し解説すると、

イベントハンドラのeventの中身に主アプリのレコード情報が入っています。

console.log(event)で確認してみてください。

 

あとは、その中身の書籍番号を使って、サブアプリに対してレコード情報のGETリクエストを送っています。

kintone.events.on('app.record.edit.submit.success', function(event) {
var record = event.record; // 主アプリのレコード情報がある
var Id = record.書籍番号.value; // 書籍番号の値を格納する
var tagetappID = xx; // おそらく34
var params = {
'app': tagetappID,
'query': '書籍番号 = "' + Id + '"' // サブアプリの書籍番号と Id が一致する。というクエリを作成しています。
}
~~~~~~~~
})