他アプリのサブテーブルの更新

他のアプリのサブテーブのを条件に合ったフィールドを更新したいのです。

サブテーブルの更新処理で困っています。

今はこのようなエラーが発生しています。

動いているコードは以下のコードです。

jQuery.noConflict();
(function($) {
“use strict”;

kintone.events.on(‘app.record.detail.show’, function(event) {
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//スペースフィールドにボタンを設置
var mySpaceFieldButton = document.createElement(‘button’);
mySpaceFieldButton.id = ‘copy_button_id’;
mySpaceFieldButton.innerHTML = ‘年次レート反映’;
mySpaceFieldButton.onclick = function () {
var afterRec = event.record;
var copyRate;
var appId = kintone.app.getId();
var recId = event.recordId;
var yyyy = afterRec[‘copy_yyyy’].value;
var currency = afterRec[‘通貨’].value;
var manyappId =[22,0];
var body = {
“app”: appId
};
kintone.api(kintone.api.url(‘/k/v1/form’, true), ‘GET’, body, function(resp) {
// success
for(var i =0; i < resp.properties.length; i++) {
var detailName = resp.properties[i].label;
var detailCode = resp.properties[i].code;

if(detailName == yyyy){
copyRate = afterRec[detailCode].value;
}
}
//*************************************************************************************************************************************

// 次に、ルックアップ参照元(コピー先)の更新対象レコードを取得する
fetchRecords(manyappId[0], ‘見積通貨 = "’ + currency + ‘"’).then(function (records) {
var recCount = records.length;
var putCount = Math.ceil(recCount / 100);
for (var i = 0; i < putCount; i++) {
var offset = i * 100;
var limit = 100;
if (offset + limit > recCount) {
limit = recCount - offset;
}
var putLimit = limit + offset;
var editRecords = [];
var Tbl = [];
var tblRow = [];
var roeField = [];
for (offset; offset < putLimit; offset++) {
var record = records[offset];
var table_Row = record[‘Table_1’][‘value’].length;
var mknenuri1000 = [];
var mtnenuri = [];
var mtnenuri1000 = [];
var mtnenuri_kh = [];
var coment0 = [];
var krirekiauto = [];
var mknenuri = [];
var nenji = [];
var nenRate = [];

for(var j = 0; j < table_Row; j++) {
var tbl_1 = record[‘Table_1’][‘value’][j].value;
nenji[j] = tbl_1[‘年’][‘value’];
mknenuri1000[j] = tbl_1[‘見込年間売上_千円’][‘value’];
mtnenuri[j] = tbl_1[‘見積年間売上’][‘value’];
mtnenuri1000[j] = tbl_1[‘見積年間売上_千円’][‘value’];
mtnenuri_kh[j] = tbl_1[‘見積年間売上_確率反映’][‘value’];
coment0[j] = tbl_1[‘コメント_0’][‘value’];
krirekiauto[j] = tbl_1[‘改訂履歴_自動入力’][‘value’]
mknenuri[j] = tbl_1[‘見込み年間売上’][‘value’];

if (nenji[j] = yyyy) {
nenRate[j] = copyRate;
}else{
nenRate[j] = tbl_1[‘年次レート’][‘value’];
}
}
kintone.api(
kintone.api.url(‘/k/v1/record’,true),
‘PUT’,
{
“app”: manyappId[0],
“id” : record[‘$id’][‘value’],
“record”: {
“Table_1”:{
“value”: [
{
“value”: {
“見込年間売上_千円”: {
“value”: mknenuri1000
},
“見積年間売上”: {
“value”: mtnenuri
},
“見積年間売上_千円”: {
“value”: mtnenuri1000
},
“年”: {
“value”: nenji
},
“見積年間売上_確率反映”: {
“value”: mtnenuri_kh
},
“コメント_0”: {
“value”: coment0
},
“見込み年間売上”: {
“value”: mknenuri
},
“年次レート”: {
“value”: nenRate
},
“改訂履歴_自動入力”: {
“value”: krirekiauto
}
}
},
]
}
}
},
function(resp){
console.log(resp);
window.alert(‘更新処理を行いました。’);
},
function(resp) {
var errmsg = ‘レコード更新時にエラーが発生しました。’;
if (resp.message !== undefined){
errmsg += ‘’ + resp.message;
}
console.log(errmsg);
}
);
}
}
}
);
});
}
//**********************************************************************************************************************************************
kintone.app.record.getSpaceElement(‘copy_button_id’).appendChild(mySpaceFieldButton);
});
//**********************************************************************************************
// 全件取得関数
function fetchRecords(appId, query, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var params = {app: appId, query: query + ’ limit ’ + limit + ’ offset ’ + offset};
return kintone.api(‘/k/v1/records’, ‘GET’, params).then(function (resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, query, offset + limit, limit, allRecords);
}
return allRecords;
});
}
//*************************************************************************************************
})(jQuery);

サブテーブルの各行、各項目の取扱がいまいちなのでそのあたりが間違っているような気がしますがはっきりわかりません。

どうかご教示よろしくお願いいたします。

 

松本賢二さん

更新するrecord情報の設定が間違っているみたいです。

各フィールドに設定する値が配列となっていますが、実際は文字列や数値ではないでしょうか?

var mknenuri1000 = [];
var mtnenuri = [];
var mtnenuri1000 = [];
var mtnenuri_kh = [];
var coment0 = [];
var krirekiauto = [];
var mknenuri = [];
var nenji = [];
var nenRate = [];

 

あと、for文の中でkintone.api()で更新をしていますが、これは避けたほうがいいです。

kintone.api()は非同期関数なので、結果を待たずに次の処理を呼び出します。for文で呼び出しを行うと連打してしまうため、kintoneのAPIの同時アクセス数制限に引っかかる可能性があります。

APIの利用制限について

 

理想的な方法としてはfor文でRequest Bodyを作り終わってから、RestAPIで更新するのがいいと思います。

こちらのライブラリを使うと簡単に複数のレコード更新ができるので参考にしてみてください。

 

 

カキ氷様

早速の対策ありがとうございました。

FOR文中のkintoneでの更新は方法を考えてみます。(教えてもらったライブラリを参考にして)

あと、配列にしたのは、サブテーブルの行数がレコードの内容によってきまるので、可変になるためです。

サブテーブルの行数が未定の場合のフィールドの値の設定の方法はどの様になるのでしょうか?

ご教示いただけますと幸いです。

松本賢二さん

正しいテーブルの形はこちらのフォーマットになります。 これはテーブル行数が2行の場合です。

サブテーブル[‘value’] に配列型でJSONが入っていますが、この配列が行数になります。

"サブテーブル": {
 "value": [
  { // 1行目
   "value": {
    "文字列 __1行__ 0": {
     "value": "サンプル0"
    },
    "数値_0": {
     "value": "0"
    }
   }
  },  
  { // 2行目
   "value": {
    "文字列 __1行__ 0": {
     "value": "サンプル1"
    },
    "数値_0": {
     "value": "1"
    }
   }
  },
 ]
}

 

問題となっているコードでは フィールドのvalueに配列が指定されてしまっているため、フォーマットがエラーとなってしまいます。

"サブテーブル": {
 "value": [
  {
   "value": {
    "文字列 __1行__ 0": {
★    "value": ["サンプル0", "サンプル1"]
    },
    "数値_0": {
★    "value": ["0", "1"]
    }
   }
  }
 ]
}

 

カキ氷様

お返事ありがとうございます。

サブテーブルの更新用の設定についてご教示ください。

サブテーブルの行が同じアプり内のレコードで1行しかないレコードと5行あるレコードや9行あるレコード等を持っている

時(テーブルの行数は決まってない)ときのサブテーブル内のフィールドの設定はどの様にするのでしょうか。

何度もすみませんが、ご教示お願い致します。

 

松本賢二さん

 

イメージとしては以下のような感じでテーブルのJSONを組みます。いかがでしょうか?

 

var table = {"value": []};
for (var j = 0; j < table_Row; j++) {
 var row = {};
 var tbl_1 = record['Table_1']['value'][j].value;
 row['年'] = {['value']: tbl_1['年']['value']};
 row['見込年間売上_千円'] = {['value']: tbl_1['見込年間売上_千円']['value']};
 row['見積年間売上'] = {['value']: tbl_1['見積年間売上']['value']};
 row['見積年間売上_千円'] = {['value']: tbl_1['見積年間売上_千円']['value']};
 row['見積年間売上_確率反映'] = {['value']: tbl_1['見積年間売上_確率反映']['value']};
 row['コメント_0'] = {['value']: tbl_1['コメント_0']['value']};
 row['改訂履歴_自動入力'] = {['value']: tbl_1['改訂履歴_自動入力']['value']};
 row['見込み年間売上'] = {['value']: tbl_1['見込み年間売上']['value']};
 table["value"].push({"value": row});
}

var record = {
  "app": manyappId[0],
  "id": record['$id']['value'],
  "record": {
   "Table_1": table
  }
 };

kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', record).then(function(resp) {
 alert('success');
});

カキ氷様

スッキリしたコードまでご教示、ありがとうございました。

私にはコードがあった方がわかりやすかったです。

でも自分だけではカキ氷様のようなスッキリしたコードは

書けなかったと思います。

このサブテーブルの操作方法はしっかり頭に入れていきたいと思います。

それとライブラリも周りの人に「こんなライブラリがあったんだ。」と言われて

利用させてもらっています。本当にありがとうございました。