新規投稿
フォローする

テーブル項目付きのcsv一括取り込み

お世話になっております。
アプリの方での取り込みですとテーブルが入れられないので
https://cybozudev.zendesk.com/hc/ja/articles/204972070-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92CSV%E3%81%A7%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-
のサンプルを使わせもらっています。
しかし、取り込む限度が100件までですが、取り込みたいデータは12000件ほどあります。

取り込みの方法としては
100件ずつをループして取り込むことを考えていますが、どこをループさせたら良いのか、
それとも、ループではなく他の方法があるのか
分かる方がいましたら、ご教授ください。
宜しくお願いします。

0

14件のコメント

Avatar
瀧ヶ平

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('\n'));
            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;
        }
    });
})();
0
Avatar
T_jima

瀧ヶ平さん
返信が遅れてしまい、誠に申し訳ございませんでした。
コードを使い、まずは300件で試させていただきましたが、無事取り込めました。
12000件も問題ないかと思います。
又の機会がありましたら、ご教授のほどよろしくお願いします。

0
Avatar
T_jima

瀧ヶ平さん
申し訳ございません。
先ほど1200件のデータで行ったところ、エラーは出ず取り込めたのですが
一覧を見てみると693で止まっていました。
これは何が原因でしょうか?
解決済みにしてしまった後に申し訳ございませんが、宜しくお願いします。

0
Avatar
瀧ヶ平

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('\n'));
            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;
        }
    });
})();
0
Avatar
T_jima

瀧ヶ平さん
回答ありがとうございます。
早速使わせてもらいましたがやはり途中までしか入っていません。
ドロップボックスの選択肢やカンマが関係しているのでしょうか?
1200件を100件ずつ入れた際にエラーが出ましたが原因がドロップボックスの
選択肢が足りない、カンマが入っている等でしたので。
最初に回答をいただいたサンプルでは、
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, function(resp) {
にブレークポイントを設置してF8で実行していくと全て入りました。
もう少しこちらに原因があると思いますので調べてみたいと思います。

0
Avatar
瀧ヶ平

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();の記述自体はなくてもいいかもしれません。

0
Avatar
T_jima

瀧ヶ平さん
返信が遅くなり申し訳ございません。
数回行ったところ、全て取り込めてはいますが元のデータとは1200件ほど順番が違っているものがあります。
お忙しい中恐縮ですが宜しくお願いします。

0
Avatar
瀧ヶ平

T_jima さん

順番が違うとは、 具体的にどういう順序になっていますでしょうか?

0
Avatar
T_jima

前回と同じように
kintone.api('/k/v1/records', 'POST', {app: appId, records: o}, function(resp) {
にブレークポイントを設置してF8で実行したところ順番も正常に取り込めました。
大雑把ですみませんが、真ん中のレコード群が本来よりも前後しています。
もう少し、どのように変化しているのか調べてみます。

0
Avatar
瀧ヶ平

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('\n'));
            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;
        }
    });
})();
0
Avatar
T_jima

瀧ヶさん
回答ありがとうございます。
申し訳ございませんが、急きょ対処しないといけない案件がございますので
確認が完了しましたらまた報告させていただきます。

0
Avatar
T_jima

瀧ヶ平さん
確認をさせていただきましたが、途中までしか入っておりませんでした。
あまりcsvの取り込みについて時間をかけていられませんので
申し訳ございませんが、ブレークポイントを使った方法で行いたいと思います。
また取り込みの際に、疑問が出てきましたら新規で質問をさせていただきます。
本当にありがとうございました。

0
Avatar
瀧ヶ平

T_jimaさん

何度もお手間をとらせてすいません。お時間がありましたら

new Promise(function(resolve){

の前に return をつけて実行してみてください。

0
Avatar
T_jima

滝ケ平さん
2回ほど行いましたが、2回とも全部取り込め、順番もバラバラになっておりませんでした。
これで、ブレークポイントを使用せずにできそうです。
度々の回答誠にありがとうございました。
何度もお手間をとらせてしまい、申し訳ございませんでした。
またの機会がありましたら、宜しくお願いします。

0
ログインしてコメントを残してください。