CSVデータの取り込み処理について

お世話になります。

現在、下記のことを実現したいためにこの様なコードを書いてみました。

  1. CSV外部ファイルを読み込む
  2. CSV外部ファイルを取り込む
  3. CSVヘッダー情報が無い場合、エラーを出しインポートしない。
  4. 主キーがCSV上にない場合について、エラーを出しインポートしない。
  5. 取り込み後、一覧画面に移る。

1.2.5についての流れは、実際に確認出来まして、CSV外部ファイルの内容も全て反映されました。

また、kintoneUtility を使ってUPSERT処理も記述しておりますが、こちらも動作の確認が出来ております。

3.4.を実現したい際にどの様に処理を行えば出来るのかで、現在つまってしまっております。

大変恐縮ではございますが、ご指摘頂ければ幸いです。

jQuery.noConflict();

(function ($) {

"use strict";

kintone.events.on(['app.record.index.show'], function (event) {

var appId=event.appId;


$('#selfile').bind('change', function (evt) {

var reader=newFileReader();

reader.readAsText(evt.target.files[0]);

reader.onerror=function () {

alert('ファイル読み取りに失敗しました')

}

reader.onload=function (ev) {

$('textarea[name=\"txt\"]').val(reader.result);

};

});


$('#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= [];

for (var i=0; i<jsonArray.length; i++) {

obj[i] = {

updateKey: {

field: 'quote_number',

value: jsonArray[i]['test1']

},

record: {

'文字列__1行_': {

value: jsonArray[i]['test2']

},

'文字列__2行_': {

value: jsonArray[i]['test3']

},

'数値_1': {

value: jsonArray[i]['test4']

},

'数値_2': {

value: jsonArray[i]['test5']

},

}

};

var param= {

app: appId,

records: obj,

isGuest: false

};

}

var spinner=new kintoneUIComponent.Spinner();

var body=document.getElementsByTagName("BODY")[0];

body.appendChild(spinner.render());

if (window.confirm('データを登録します。よろしいでしょうか?')) {

spinner.show();

kintoneUtility.rest.upsertRecords(param).then(function (resp) {

// 成功時の処理を記載する

spinner.hide();

window.alert('取り込みが完了いたしました')

location.href='https://XXXXX.cybozu.com/k/1/';

}).catch(function (error) {

// エラー時の処理を記載する

console.log(error.message);

})

} else {

window.alert('キャンセルされました');

}

});


function csv2json(csvArray) {

var jsonArray= [];

var items=csvArray[0].split(',');

for (vari=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;

}

});

})(jQuery);

 

KAZUYA TAKAHASHI さん

FileReader()はonload()内でファイル内容を読み取ることが可能です。

reader.onload=function (ev) {
$('textarea[name=\"txt\"]').val(reader.result);
console.log(reader.result); // ←ここでどのようなCSVが出てきてるか読み取ることができるので、ヘッダーがない場合エラーとすれば実装できそうです。
};

行単位で配列に格納する方法は下記のサイトが参考になるかと思います。

http://cly7796.net/wp/javascript/read-csv-file-with-file-api/

あとはkintoneのイベントオブジェクトなどを使って主キーがない場合も判定できそうです。

HANSA様

ご返信がだいぶ遅くなり申し訳ありませんでした。

  1. 主キーがCSV上にない場合について、エラーを出しインポートしない。

取り込みボタン押下時の処理として、下記の様に致しましたところ、思った通りに動いてくれました。

  if (jsonArray.find(obj => obj.主キー === "")) {
alert('取り込み出来ません');
return;
}

ありがとうございました m(_ _)m