いつも大変お世話になっております。
今回、スケジュール管理を行いたく、各曜日の予定を1か月分自動登録するアプリを作成したのですが、データがきちんと登録されません。
データ数は全体で2000件ほどだと思うのですが、毎回登録されるデータ数が違います。
例)
・個人カード番号 1番 月曜日 10:00~ 火曜日 10:00~ 水曜日 13:00~
・個人カード番号 2番 月曜日 9:00~ 水曜日 12:00~ 金曜日 11:00~
・・・etc
個人カード側から曜日と時間を取得し、
カレンダーアプリ側に1か月分を登録しています。
取得はできているのですが、登録がところどころ落ちてしまったり、2000件あるにもかかわらず、100件程度しか登録できない時もあります。
また、2000件登録できる時もあります…。
見よう見まねでコードを書いているので、おかしな箇所が多々あるかと思うのですが、このような動きをするのは、PUTの部分に何か問題があるのか、それともそもそもこのような大量のデータを一括で登録しない方が良いのか、判断できずにおります。
Kintoneマスターの皆様、何卒ご教授よろしくお願い致します。
moment.locale("ja");
//個人カード
var personal_app = 111;
var schedule_app = 112;
var m = moment();
var year = m.year();
var month = m.month();
(function() {
"use strict";
kintone.events.on('app.record.index.show', function(event){
//増殖バグ防止
if (document.getElementById('my_put_button') !== null) {
return;
}
var myIndexButton = document.createElement('button');
myIndexButton.id = 'my_put_button';
myIndexButton.innerText = '予定の一括登録';
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
//カレンダーだけにボタン設置
// if(event.viewName !== 'カレンダー') return;
myIndexButton.onclick = function () {
if(window.confirm("データを登録します")) {
//個人カードからデータ取得
var manager = new KintoneRecordManager;
manager.appId = personal_app; // 個人カードアプリID
manager.getRecords(function(records) {
// レコード取得後の処理
console.log(records);
//予定登録
new_data(records);
});
} else {
return false;
}
// window.alert('予定一括登録しました。');
};
var KintoneRecordManager = (function() {
KintoneRecordManager.prototype.records = []; // 取得したレコード
KintoneRecordManager.prototype.appId = null; // アプリID
KintoneRecordManager.prototype.query = ''; // 検索クエリ
KintoneRecordManager.prototype.limit = 500; // 一回あたりの最大取得件数
KintoneRecordManager.prototype.offset = 0; // オフセット
function KintoneRecordManager() {
this.appId = kintone.app.getId();
this.records = [];
}
// すべてのレコード取得する
KintoneRecordManager.prototype.getRecords = function(callback) {
kintone.api(
kintone.api.url('/k/v1/records', true),
'GET',
{
app: this.appId,
query: this.query + (' limit ' + this.limit + ' offset ' + this.offset),
},
(function(_this) {
return function(res) {
var len;
Array.prototype.push.apply(_this.records, res.records);
len = res.records.length;
_this.offset += len;
if (len < _this.limit) { // まだレコードがあるか?
_this.ready = true;
if (callback !== null) {
callback(_this.records); // レコード取得後のcallback
}
} else {
_this.getRecords(callback); // 自分自身をコール
}
};
})(this)
);
};
return KintoneRecordManager;
})();
/*全データ登録*/
function new_data(records) {
records.forEach(function(data) {
//今月の予定を一括入力
var last_day = moment().endOf('month').format("DD")
var i = 0;
while(i < last_day) {
i++;
//曜日を取得
moment.updateLocale('ja', {weekdaysShort: ["日曜","月曜","火曜","水曜","木曜","金曜","土曜"]});
var hiduke = moment().set({'year': year, 'month': month, 'date': i}).format("YYYY-MM-DD");
var yobi = moment(new Date(hiduke)).format('ddd');
//データをセット
var yotei_yobi = yobi + "予定";
var yotei_status = yobi + "ステータス";
//0327
var user_no = data.レコード番号.value;
var name = data.facility_name.value;
var yobitime = data[yotei_yobi].value;
var status = data[yotei_status].value;
if (yobitime.length === 0) {
// window.alert(hiduke + yobi + name + "空");
} else {
// window.alert(hiduke + yobi + name + "空じゃない");
for (var y = 0; y < yobitime.length; y++) {
var work_time = yobitime[y];
var work_time2;
if(work_time == "9:00~") {
work_time = "09:00:00+09:00";
work_time2 = "11:00:00+09:00";
} else if(work_time == "11:10~") {
work_time = "11:00:00+09:00";
work_time2 = "12:00:00+09:00";
} else if(work_time == "13:10~") {
work_time = "13:10:00+09:00";
work_time2 = "14:00:00+09:00";
} else {
work_time = "00:00:00+09:00";
work_time2 = "00:00:00+09:00";
}
var start_time = hiduke + 'T' + work_time;
var end_time = hiduke + 'T' + work_time2;
//window.alert(start_time + "ユーザーNO."+user_no+"名前"+name+"予定"+yobitime+"ステータス"+status);
var postbody = {
'app': schedule_app,
'record': {
'user_no': {
'value': user_no
},
'start': {
'value' : start_time
},
'end': {
'value': end_time
},
'status': {
'value': status
}
}
}
// postbody end
kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', postbody).then((resp) => {
// success
window.alert(user_no + 'レコード登録完了');
}, (error) => {
// error:エラーの場合はメッセージを表示する
let errmsg = 'レコード登録時にエラーが発生しました。';
// レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
if (error.message !== undefined) {
errmsg += '' + error.message;
}
window.alert(user_no + errmsg);
console.log(error);
}); // kintone.api end
} //for end
}// if end
} //while end
});
window.alert('レコードを登録しました');
location.reload();
}
});
})();