T_jima さん
cstapの瀧ヶ平です。
登録前のデータが入った配列を100件ごとの配列の配列に変換し、その配列の要素ごとに登録する処理を行えばよいかと思います。
リンク先のコードを改変した以下のようなコードで実装できると思います。
(function() {
"use strict";
kintone.events.on(['app.record.index.show'], function(event) {
var appId = event.appId;
//ダイアログでファイルが選択された時の処理
$('#selfile').bind('change', function(evt) {
//読み込んだファイルをテキストエリアに表示
var reader = new FileReader();
reader.readAsText(evt.target.files[0]);
reader.onload = function(ev) {
$('textarea[name=\"txt\"]').val(reader.result);
};
});
//「post」ボタンが押された時の処理
$('#post_btn').bind('click', function() {
var text_val = $('textarea[name=\"txt\"]').val();
text_val = text_val.replace(/"/g, "");
var jsonArray = csv2json(text_val.split(''));
var obj = [];
var newRow = {};
var j = 0;
for (var i = 0; i < jsonArray.length; i++) {
if (jsonArray[i]['New Record Flag']) {
j++;
obj[j - 1] = {'sName': {value: jsonArray[i]['Store Name']}, 'Table': {'value': []}};
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}else {
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}
}
var objArray = [];
for(var j = 0; j < obj.length;){
objArray.push(obj.slice(j, j+99));
j += 100
}
if (window.confirm('データを登録します。よろしいでしょうか?')) {
// ログアプリへの登録処理
objArray.forEach(function(o){
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, function(resp) {
location.reload();
});
});
}else {
window.alert('キャンセルされました'); // 警告ダイアログを表示
}
});
//パース処理
function csv2json(csvArray) {
var jsonArray = [];
var items = csvArray[0].split(',');
for (var i = 1; i < csvArray.length; i++) {
var a_line = {};
var csvArrayD = csvArray[i].split(',');
// 各データをループ処理する
for (var j = 0; j < items.length; j++) {
//要素名:items[j]
//データ:csvArrayD[j]
a_line[items[j]] = csvArrayD[j];
}
jsonArray.push(a_line);
}
return jsonArray;
}
});
})();
瀧ヶ平さん
返信が遅れてしまい、誠に申し訳ございませんでした。
コードを使い、まずは300件で試させていただきましたが、無事取り込めました。
12000件も問題ないかと思います。
又の機会がありましたら、ご教授のほどよろしくお願いします。
瀧ヶ平さん
申し訳ございません。
先ほど1200件のデータで行ったところ、エラーは出ず取り込めたのですが
一覧を見てみると693で止まっていました。
これは何が原因でしょうか?
解決済みにしてしまった後に申し訳ございませんが、宜しくお願いします。
T_jimaさん
すいません。おそらくデータを登録している最中に登録成功時の更新処理が走ってしまって更新が途中になっているようですね。
以下のコードに修正してみてください。
(function() {
"use strict";
kintone.events.on(['app.record.index.show'], function(event) {
var appId = event.appId;
//ダイアログでファイルが選択された時の処理
$('#selfile').bind('change', function(evt) {
//読み込んだファイルをテキストエリアに表示
var reader = new FileReader();
reader.readAsText(evt.target.files[0]);
reader.onload = function(ev) {
$('textarea[name=\"txt\"]').val(reader.result);
};
});
//「post」ボタンが押された時の処理
$('#post_btn').bind('click', function() {
var text_val = $('textarea[name=\"txt\"]').val();
text_val = text_val.replace(/"/g, "");
var jsonArray = csv2json(text_val.split(''));
var obj = [];
var newRow = {};
var j = 0;
for (var i = 0; i < jsonArray.length; i++) {
if (jsonArray[i]['New Record Flag']) {
j++;
obj[j - 1] = {'sName': {value: jsonArray[i]['Store Name']}, 'Table': {'value': []}};
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}else {
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}
}
var objArray = [];
for(var j = 0; j < obj.length;){
objArray.push(obj.slice(j, j+100));
j += 100
}
if (window.confirm('データを登録します。よろしいでしょうか?')) {
// ログアプリへの登録処理
objArray.forEach(function(o){
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, function(resp) {
if(j > obj.length) location.reload();
});
});
}else {
window.alert('キャンセルされました'); // 警告ダイアログを表示
}
});
//パース処理
function csv2json(csvArray) {
var jsonArray = [];
var items = csvArray[0].split(',');
for (var i = 1; i < csvArray.length; i++) {
var a_line = {};
var csvArrayD = csvArray[i].split(',');
// 各データをループ処理する
for (var j = 0; j < items.length; j++) {
//要素名:items[j]
//データ:csvArrayD[j]
a_line[items[j]] = csvArrayD[j];
}
jsonArray.push(a_line);
}
return jsonArray;
}
});
})();
瀧ヶ平さん
回答ありがとうございます。
早速使わせてもらいましたがやはり途中までしか入っていません。
ドロップボックスの選択肢やカンマが関係しているのでしょうか?
1200件を100件ずつ入れた際にエラーが出ましたが原因がドロップボックスの
選択肢が足りない、カンマが入っている等でしたので。
最初に回答をいただいたサンプルでは、
kintone.api(‘/k/v1/records’, ‘POST’, {app: appId, records: o}, function(resp) {
にブレークポイントを設置してF8で実行していくと全て入りました。
もう少しこちらに原因があると思いますので調べてみたいと思います。
T_jima さん
すいません修正が間違っていたようです。
objArray.forEach(function(o){
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, function(resp) {
location.reload();
});
});
のところが原因なのは確かだと思います。
正しくは
objArray.forEach(function(o, index){
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, (function(resp) {
if(this.index === objeArray.length - 1) location.reload();
}).bind({index: index}));
});
とすれば問題ないと思います。
更新処理を手動で行うのであれば location.reload();の記述自体はなくてもいいかもしれません。
瀧ヶ平さん
返信が遅くなり申し訳ございません。
数回行ったところ、全て取り込めてはいますが元のデータとは1200件ほど順番が違っているものがあります。
お忙しい中恐縮ですが宜しくお願いします。
T_jima さん
順番が違うとは、 具体的にどういう順序になっていますでしょうか?
前回と同じように
kintone.api(‘/k/v1/records’, ‘POST’, {app: appId, records: o}, function(resp) {
にブレークポイントを設置してF8で実行したところ順番も正常に取り込めました。
大雑把ですみませんが、真ん中のレコード群が本来よりも前後しています。
もう少し、どのように変化しているのか調べてみます。
T_jima さん
おそらくレコードの登録の非同期通信のタイミングが順番どおりに終わらない場合があるため発生しているものかと思います。
Promiseによって書き直したコードを用意したのでこちらも試してみていただければ幸いです。
(function() {
"use strict";
kintone.events.on(['app.record.index.show'], function(event) {
var appId = event.appId;
//ダイアログでファイルが選択された時の処理
$('#selfile').bind('change', function(evt) {
//読み込んだファイルをテキストエリアに表示
var reader = new FileReader();
reader.readAsText(evt.target.files[0]);
reader.onload = function(ev) {
$('textarea[name=\"txt\"]').val(reader.result);
};
});
//「post」ボタンが押された時の処理
$('#post_btn').bind('click', function() {
var text_val = $('textarea[name=\"txt\"]').val();
text_val = text_val.replace(/"/g, "");
var jsonArray = csv2json(text_val.split(''));
var obj = [];
var newRow = {};
var j = 0;
for (var i = 0; i < jsonArray.length; i++) {
if (jsonArray[i]['New Record Flag']) {
j++;
obj[j - 1] = {'sName': {value: jsonArray[i]['Store Name']}, 'Table': {'value': []}};
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}else {
newRow = {
value: {
Item: {
type: 'SINGLE_LINE_TEXT',
value: jsonArray[i]['Item']
},
Number: {
type: 'NUMBER',
value: jsonArray[i]['Number']
}
}
};
obj[j - 1]['Table']['value'].push(newRow);
}
}
var objArray = [];
for(var j = 0; j < obj.length;){
objArray.push(obj.slice(j, j+100));
j += 100
}
if (window.confirm('データを登録します。よろしいでしょうか?')) {
// ログアプリへの登録処理
var promises = objArray.map(function (o) {
return function(){
new Promise(function(resolve){
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}).then(function(){
resolve();
});
});
}
});
var seq = promises.reduce(function(a,b){
return a.then(b);
}, Promise.resolve(null)).then(function(){
location.reload();
});
}else {
window.alert('キャンセルされました'); // 警告ダイアログを表示
}
});
//パース処理
function csv2json(csvArray) {
var jsonArray = [];
var items = csvArray[0].split(',');
for (var i = 1; i < csvArray.length; i++) {
var a_line = {};
var csvArrayD = csvArray[i].split(',');
// 各データをループ処理する
for (var j = 0; j < items.length; j++) {
//要素名:items[j]
//データ:csvArrayD[j]
a_line[items[j]] = csvArrayD[j];
}
jsonArray.push(a_line);
}
return jsonArray;
}
});
})();
瀧ヶさん
回答ありがとうございます。
申し訳ございませんが、急きょ対処しないといけない案件がございますので
確認が完了しましたらまた報告させていただきます。
瀧ヶ平さん
確認をさせていただきましたが、途中までしか入っておりませんでした。
あまりcsvの取り込みについて時間をかけていられませんので
申し訳ございませんが、ブレークポイントを使った方法で行いたいと思います。
また取り込みの際に、疑問が出てきましたら新規で質問をさせていただきます。
本当にありがとうございました。
T_jimaさん
何度もお手間をとらせてすいません。お時間がありましたら
new Promise(function(resolve){
の前に return をつけて実行してみてください。
滝ケ平さん
2回ほど行いましたが、2回とも全部取り込め、順番もバラバラになっておりませんでした。
これで、ブレークポイントを使用せずにできそうです。
度々の回答誠にありがとうございました。
何度もお手間をとらせてしまい、申し訳ございませんでした。
またの機会がありましたら、宜しくお願いします。
system
(system)
クローズされました:
16
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。