お世話になっております。
下記投稿にてやり取りをさせていただいておりますが,REST APIを使用するためこちらに改めて投稿させていただきます。
レコード詳細画面・一覧表示画面でのフィールド値変更が定着しない
上記の投稿を経て,一覧画面にJSでボタンを設置し,クリックしたら全てのレコードの年齢フィールドを計算・年齢フィールドを最新の年齢に更新するというプログラムを作成中です。全レコード数はだいたい4000件ほどです。
下記のサイトを参考にさせていただき,プログラムを作成しておりますが,ボタンをクリックしても何も起こらない状況で困っております。Firebugを使用してブレークポイントを置いても何も反応しません。
行いたい処理の手順としては
①ボタンを設置・クリック
②レコードデータ取得(全件)
③取得したデータから年齢計算
④更新したデータでレコード更新
です。
毎度毎度大変お世話になっておりますが,どなたかおかしいところをご教授いただけますと幸いです。
どうぞよろしくお願いいたします。
参考にさせていただいたページ
多くのデータの取得と更新処理
http://urx.red/BC0e
レコードの一括更新について
http://urx.red/BC0k
第11回 REST APIを利用したレコード更新
http://urx.red/BC0p
念のため文字でも貼り付けさせていただきます。
(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
//ボタン作成
/////////////////////////////////////////////////////////////////
// ボタン増殖防止
if (document.getElementById(‘Menu_Button’) !== null) {
return;
}
// メニュ右側の空白部分にボタンを設置
var MenuButton = document.createElement(‘button’);
//ボタンのID指定
MenuButton.id = ‘Menu_Button’;
//ボタン名表示
MenuButton.innerHTML = ‘年齢一括更新’;
//ボタンサイズ
MenuButton.style.width = ‘200px’;
//左側のスペース
MenuButton.style.marginLeft = ‘250px’;
//ボタンをクリックしたら
MenuButton.onclick = function () {
/////////////////////////////////////////////////////////////////////////////////////
//年齢更新
/////////////////////////////////////////////////////////////////////////////////////
var afterRecord = event.record;
var appId = kintone.app.getId();
var recId = event.recordId;
// まず、変更前のデータを取得する
kintone.api(‘/k/v1/record’, ‘GET’, {app: appId, id: recId}, function (resp) {
var beforeRecord = resp.record;
// 次に、更新対象レコードを取得する
fetchRecords(“37”, ‘id = "’ + beforeRecord.id.value + ‘"’).then(function (records) {
var recCount = records.length;
var putCount = Math.ceil(recCount / 100);
for (var i = 0; i < putCount; i++) {
var offset = i * 100;
var limit = 100;
if (offset + limit > recCount) {
limit = recCount - offset;
}
var putLimit = limit + offset;
var editRecords = [];
// 更新対象レコードに更新後のデータを上書き
for (offset; offset < putLimit; offset++) {
var record = $.extend(true, {}, records[offset]);
var recNo = record[‘$id’].value;
var nenrei = getYearMonth(record[‘year’].value,record[‘month’].value,record[‘day’].value)
delete record[‘$id’];
delete record[‘$revision’];
delete record[‘レコード番号’];
delete record[‘作成日時’];
delete record[‘作成者’];
delete record[‘更新日時’];
delete record[‘更新者’];
record[‘id’] = afterRecord.id;
record[‘agec’] = afterRecord.agec;
editRecords.push({‘id’: recNo, ‘record’: nenrei});
}
// 最後に更新処理
kintone.api(‘/k/v1/records’, ‘PUT’, {app: 37, ‘records’: editRecords},
function (resp) {}
);
}
});
});
/////////////////////////////////////////////////////////////////////////////////////
}; //onclickイベント終了
//////////////////////////////////////////////////////////////////////////////
// 現在の年齢計算する関数
function getYearMonth(year, month, day) {
//本日の日付を取得
var today=new Date();
// 肝心の年齢計算について
// 年月日の日は、そのまま引き算。
// 年月日の月は、2ケタ左シフトして(100倍にする。1月は0なので+100からスタート)から、引き算。
// 年月日の年は、4ケタ左シフトして(1万倍にする)から、引き算。
// この計算方法の優れた所は、年・月・日を単独で計算して、足らなかったら上位からマイナスするという点!
// 単純ながら、確実な年齢計算が出来る優れたアルゴリズムです!
// ちなみに日数計算はできません。あくまで年数計算のみ
// 参照URL:http://d.hatena.ne.jp/toku-hiro/20070824
today=today.getFullYear()*10000+today.getMonth()*100+100+today.getDate();
// 生年月日一列に
var birthday=parseInt(year + month + day);
// 単純に引き算して、下4ケタを切り捨てて、年部分だけを返す
return(Math.floor((today-birthday)/10000));
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// 全件取得関数
function fetchRecords(appId, query, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
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;
});
}
//////////////////////////////////////////////////////////////////////////////
kintone.app.getHeaderMenuSpaceElement().appendChild(MenuButton);
})
})();