別アプリからの一括登録時のレコード追加イベントの動作について

お世話になります。

こちら(A)「一覧で表示したレコードのキーを使用して一括で別のアプリに登録したい」

こちら(B)「勤怠管理アプリをカスタマイズしてみよう」を参考に、

登録者を条件でフィルタした一覧から、タイムカードを一括登録したいと考えています。

それぞれのアプリは問題なく動作し、Aから一括登録される項目もBに問題なく反映されています。

ただ、Bのレコード内で自動で作成されるはずの1ヶ月分のテーブルが作成されません。

イベントが「app.record.create.show」となっていることが要因かと思うのですが、どう修正すれば良いのかわからず、お知恵を貸していただけますでしょうか。


(B)項目

・氏名(Aから反映)

・従業員番号(Aから反映)

・対象年月(Aから反映)

・始業時間(Aから反映)

・就業時間(Aから反映)

–B内テーブル項目–

・日付

・曜

・開始

・終了

・朝延長

・夜延長

・欠席


Bのコードは以下の通りです。

どうぞよろしくお願いいたします。

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

var holidayMST = 27; //休日マスタのアプリID
var kisanbi = 1; //起算日
var start = “0:00”; //デフォルト始業時間
var end = “0:00”; //デフォルト終業時間
var WeekChars = [“日”, “月”, “火”, “水”, “木”, “金”, “土”];
// hh:mm を分に変換
function strToMin(str) {
var hm = str.split(“:”);
return parseInt(hm[0]) * 60 + parseInt(hm[1]);
}
// 分をhh:mmに変換
function minToStr(min) {
var h = Math.floor(min / 60);
var m = min % 60;
return h + “:” + m;
}

// 全レコード取得関数
function fetchRecords(appId, query, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 500;
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;
});
}

// 休日取得関数
function fetchHoliday() {

var max, min;

if (kisanbi === 1) {
min = moment().format(“YYYY-MM-0” + kisanbi);
max = moment().endOf(‘month’).format(“YYYY-MM-DD”)
}

return fetchRecords(holidayMST, ‘日付 >= "’ + min + ‘" and 日付 <= "’ + max + ‘" order by 日付 asc’)
.then(function(holidayRecs) {
var result = {
maxDate: max,
minDate: min,
holidays: holidayRecs
};
return result;
});
}

kintone.events.on([“app.record.create.show”, “app.record.edit.show”], function(event) {
var record = event.record;
new kintone.Promise(function(resolve, reject) {

if (event.type === “app.record.create.show”) {
return fetchHoliday().then(function(resp) {
var tmpMinDate = resp.minDate;
var dObj = new Date(tmpMinDate);
var wDay = dObj.getDay();
var days = (moment(resp.maxDate).diff(moment(tmpMinDate), ‘days’) + 1);
for (var k = 0; k < days; k++) {
var flg = false;
for (var j = 0; j < resp.holidays.length; j++) {
if (tmpMinDate === resp.holidays[j].日付.value) {
flg = true;
break;
}
}
if (!flg) {
var newRow = {
“value”: {
“日付”: {
“type”: ‘DATE’,
“value”: tmpMinDate,

},

“曜”:{
“type”:‘SINGLE_LINE_TEXT’,
“value”:WeekChars[wDay],
},

“開始”: {
“type”: ‘TIME’,
“value”: start
},

“終了”: {
“type”: ‘TIME’,
“value”: end
},

“朝延長”: {
“type”: ‘TIME’,
“value”: ‘’,
},

“夜延長”:{
“type”:‘TIME’,
“value”:‘’,
},
“欠席”: {
“type”: ‘CHECK_BOX’,
“value”: []
}
}
};
record.Table.value.push(newRow);
}
tmpMinDate = moment(tmpMinDate).add(“days”, 1).format(“YYYY-MM-DD”);
var dObj = new Date(tmpMinDate);
var wDay = dObj.getDay();
}
record.Table.value.shift();
resolve();
});

}
resolve();
}).then(function() {
kintone.app.record.set(event);

return event;
});
});

})(jQuery);

MNさん、こんにちは。

プロジェクト・アスノートの松田です。

app.record.create.show等のイベントは各画面の操作・表示タイミングで発生するイベントなので、

AアプリからREST APIでBアプリにレコードを登録する場合には、イベントは発生しません。

今回の場合は、Bアプリ側の新規レコード作成イベントでテーブルへの行追加を行うのではなく、

Aアプリ側からBアプリへの書き込み時の処理でテーブルを追加してあげる必要があると思います。

参考になりますでしょうか。

 

 

松田様

早速のご回答ありがとうございます。

下記がAアプリのコードとなるのですが、どこに挿入すればよろしいのでしょうか。

最終的に、Bの日付はAの[対象年:Year]と[対象月:month]を利用し、

1日〜末日までの日付をテーブルに設定したいです。(休日マスタの日付を除く)


(function() {
‘use strict’;

kintone.events.on(‘app.record.index.show’, function(event) {
var records = event.records;
// ヘッダースペース要素の取得
var headerSpace = kintone.app.getHeaderMenuSpaceElement();
// ボタン要素の作成
var button = document.createElement(‘input’);
button.value = ‘入力表作成’;
button.type = ‘button’;

// ボタンがクリックされた時の処理
var submit = function() {
// PUTするRecordsを用意する。
var put_records = [];
// レコード一覧のイベントで取得したレコードそれぞれに対して登録の処理を行う
records.forEach(function(data) {
// 今日の日付を取得し正規表現で成形
var date = new Date()
var year = date.getFullYear();
var month = date.getMonth()+1;

// レコードの共通部分の定義
var record = {
‘対象年’: { ‘value’: year },
“対象月” : { “value”: month }
};
// レコードそれぞれに対して決定するフィールドを定義
record[‘従業員番号’] = data[‘従業員番号’];
record[‘従業員氏名’] = data[‘従業員氏名’];
record[‘始業時間’] = data[‘始業時間’];
record[‘終業時間’] = data[‘終業時間’];
put_records.push(record);

});

var param = {
‘app’: 31,
‘records’: put_records
};

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, param, function(resp) {
// success
alert(‘成功しました。’);
console.log(resp);
}, function(error) {
// error
console.log(error);
});
};

// ボタンをヘッダースペースに追加
headerSpace.appendChild(button);
// ボタンのクリックイベントに処理を登録
button.onclick = submit;
});
})();

MNさん

細かい記述は確認できていませんが、

Bアプリの処理で登録用テーブルデータを作っている処理をまるごとAアプリの処理の中に持ってきて、

put_recordsのレコードデータに、上のBアプリの処理で作り出しているテーブルデータを入れてあげればいいのではないかと思います。