お世話になります。
現在、一括更新ボタンを設置。対象レコードを絞り、ルックアップフィールドに一括更新する
処理を実施しております。
ですが、下記コード内の"lead_identity"が参照元にない場合、エラーで返されてしまい
処理が進みません。
実現できるかどうかは不明ですが、下記2通りの対策を検討しています。
どちらの場合でも構いませんので、お知恵をお借り出来ないでしょうか。
エラーが見つかった場合
①エラーとなる値を自動で入力
②対象レコードをスキップする
最後に運用しているコードを記載いたします。
JS1か月の初心者でアバウトな質問で大変申し訳ございません。
お知恵をお借り出来ますと幸いです。何卒よろしくお願い申し上げます。
(function() {
“use strict”;
// レコード一覧画面
kintone.events.on([‘app.record.index.show’], function (event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerHTML = ‘ルックアップ一括更新’;
// ボタンクリック時の処理
myIndexButton.onclick = function() {
var putRecords = {
“app” : kintone.app.getId(),
“records” : []
};
//更新したいレコードを取得
var params = {
app: kintone.app.getId(),
filterCond:‘influx_source like “【ホットリード】” and 文字列__1行__1 not like “満了” and 文字列__1行__1 not like “完了” and 関連レコード一覧_1.delivery_permission in (“承認”) and ルックアップ_0 = “” ’ , //ここにクエリ
fields: [’$id’, ‘influx_source’ , ‘lead_identity’] //ここに取得したいフィールド
};
getRecords(params).then(function(resp) {
console.log(resp);
var resp_record = resp.records;
for (var i = 0; i < resp_record.length; i++ ) {
let tagId = resp_record[i][‘influx_source’].value.slice(-10).replace(/[^0-9]/g, ‘’);
let lookUpNum = resp_record[i][‘lead_identity’].value;
//console.log(lookUpNum);
putRecords[“records”][i] = {
“id”: resp_record[i][‘$id’].value,
“record” : {
‘ルックアップ_0’: {‘value’: tagId},
‘ルックアップ_2’: {‘value’: lookUpNum}
}
};
//console.log(putRecords);
}
return fetchAllRecords(0,putRecords);
}).then(function(resp2) {
// 処理成功
alert(‘レコード更新しましたリロードします’);
location.reload(); // 成功したら画面を更新
}).catch(function(error) {
console.log(error);
// エラー表示をする
alert(‘Error Occurred’ + error.message);
return error;
});
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
return event;
});
/*
* @param {Object} params
* - app {String}: アプリID(省略時は表示中アプリ)
* - filterCond {String}: 絞り込み条件
* - sortConds {Array}: ソート条件の配列
* - fields {Array}: 取得対象フィールドの配列
* @return {Object} response
* - records {Array}: 取得レコードの配列
*/
var getRecords = function(_params) {
var MAX_READ_LIMIT = 500;
var params = _params || {};
var app = params.app || kintone.app.getId();
var filterCond = params.filterCond;
var sortConds = params.sortConds || [‘$id asc’];
var fields = params.fields;
var data = params.data;
if (!data) {
data = {
records: [],
lastRecordId: 0
};
}
var conditions = [];
var limit = MAX_READ_LIMIT;
if (filterCond) {
conditions.push(filterCond);
}
conditions.push('$id > ’ + data.lastRecordId);
var sortCondsAndLimit =
’ order by ’ + sortConds.join(', ‘) + ’ limit ’ + limit;
var query = conditions.join(’ and ') + sortCondsAndLimit;
var body = {
app: app,
query: query
};
if (fields && fields.length > 0) {
// $id で並び替えを行うため、取得フィールドに「$id」フィールドが含まれていなければ追加します
if (fields.indexOf(‘$id’) <= -1) {
fields.push(‘$id’)
}
body.fields = fields;
}
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body).then(function(r) {
data.records = data.records.concat(r.records);
if (r.records.length === limit) {
// 取得レコードの件数が limit と同じ場合は、未取得のレコードが残っている場合があるので、getRecords を再帰呼び出して、残りのレコードを取得します
data.lastRecordId = r.records[r.records.length - 1].$id.value;
return getRecords({ app:app, filterCond:filterCond, sortConds: sortConds, fields:fields, data:data });
}
delete data.lastRecordId;
return data;
});
};
//100件以上の更新
function fetchAllRecords(offset, put_records){
//offsetは、取得したデータの先頭からいくつスキップするかを表す
offset = offset || 0;
//kintone.apiでレコード取得するためのパラメータ
var params = {
“app” : kintone.app.getId(),
“records” : []
};
var t=0
//100件ずつのパラメータを作る(パラメータが100件以上ある場合PUTリクエストが停止するまたは弾かれるため)
if (put_records.records.length - offset > 100) {
for (var s = offset; s < offset+100; s++) {
t++;
params[“records”][t-1] = put_records[“records”][s];
}
}else if (put_records.records.length - offset < 100) {
for (var s = offset; s < put_records.records.length; s++) {
t++;
params[“records”][t-1] = put_records[“records”][s];
}
}
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, params).then(function(put_resp){
//allRecords.concat(put_resp);
//取得したレコード数が上限に達していれば再帰呼び出し
if(put_resp.records.length === 100){
return fetchAllRecords(offset + put_resp.records.length, put_records);
}else{
return event;
}
});
}
})();