kintone一括更新 エラー時の入力について

お世話になります。

現在、一括更新ボタンを設置。対象レコードを絞り、ルックアップフィールドに一括更新する

処理を実施しております。

ですが、下記コード内の"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;
}

});

}
})();

>下記コード内の"lead_identity"が参照元にない場合、

そもそも、「lead_identity」ってフィールドコードだと思うのですが、
このフィールドが参照元のアプリにないということですか?
フィールドはあるけど中身が空っぽという状態ですか?

>JS1か月の初心者でアバウトな質問で大変申し訳ございません。

謝ることではないですし、プログラミング歴はあまり関係ないと思います。
ただ、アバウトな質問ですと、この界隈をウロウロしているエンジニアたちからの回答がつきにくいです。

私のこの回答のように、質問に質問が返ってきたりして多分手間だと思うので、
詳しく伝わりやすいように書けるようになる練習だと思って、是非、アバウトみを減らすように頑張ってください:eyes:

juridon様

いつもお世話になります。

ご返信有難うございます。アバウトな質問で申し訳ございませんでした。補足となります。

 

>下記コード内の"lead_identity"が参照元にない場合、

そもそも、「lead_identity」ってフィールドコードだと思うのですが、
このフィールドが参照元のアプリにないということですか?
フィールドはあるけど中身が空っぽという状態ですか?

→フィールドはございますが、マスタアプリフィールドの中身が空っぽの状態となります。

言葉足らずで申し訳ございません。

 

投稿したのち、私なりに対策案を検討してみたところ、23行目のgetRecords(params).部分にifを追加してルックアップ参照元へ

値があるかどうかを確認させる処理を追加すればよいのではと考えておりました。

検討にあたっては、下記の記事を参考にいたしました。

https://developer.cybozu.io/hc/ja/community/posts/900002407086-%E3%83%AB%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E8%87%AA%E5%8B%95%E5%8F%96%E5%BE%97%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E5%9B%9E%E9%81%BF

そもそもこのような方向で合っているかどうかも不明なので、アドバイスをいただけますと幸いです。

何卒よろしくお願い申し上げます。

想像で書きますが、

ひとまずlead_identityフィールドの中身がからっぽ・・・ということなので
let lookUpNum = resp_record[i][‘lead_identity’].value;
のところでlookUpNum には空のデータが入ってきているのだと思います。
そこで
if(!lookUpNum ){
// 値が正しく入っていなかった場合のなんらかの処理
}

をすれば良いのかなと思います。

juridon様

お世話になります。

ご返信いただきまして有難うございます。

 

また、ご回答が遅くなりまして大変申し訳ございません。

>>if(!lookUpNum ){
>>// 値が正しく入っていなかった場合のなんらかの処理

言葉足らずで申し訳ございません。

こちらのコードを実装したアプリ内の"lead_identity"に値は確実に入ってきます。

ですがマスタ側の"lead_identity"に相当するフィールドに値が入るのに

若干のタイムラグがありまして、値が正しく入っていない場合の処理を検討しております。

 

上記のコードだと対象レコードの取得→一括更新のみとなりますので、getRecords(params).then(function(resp) {

のあたりにマスタ側に"lead_identity"フィールドの値があるかどうかの処理を行う必要があるのかなと考えております。

 

こちらの方針で間違っておりませんでしょうか。お手数をおかけいたしますが、ご教示いただけますと幸いです。

何卒よろしくお願い申し上げます。

そういうことでしたか。
今気づいたんですが、
getRecords(params).then(function(resp) {
の行にreturnがないですね。

>上記のコードだと対象レコードの取得→一括更新のみとなりますので、getRecords(params).then(function(resp) {
>のあたりにマスタ側に"lead_identity"フィールドの値があるかどうかの処理を行う必要があるのかなと考えております。
>こちらの方針で間違っておりませんでしょうか。お手数をおかけいたしますが、ご教示いただけますと幸いです。

その方針は間違っています。

↓こちらを参考に、
kintoneにおけるPromiseの書き方の基本

getRecords(params).then(function(resp) {
~~
return event;
までを頑張ってつなげてください。

今の状態だと、たぶん非同期処理が上手く行ってなくて
getRecordsの処理してる間にreturn event;で終わっちゃってると思います。

juridon様

 

お世話になります。

ご返信有難うございます。承知いたしました。

いただきました内容で一度、修正を行っていきます。

また、何かございましたらご相談させていただくかもしれませんが

その際は何卒よろしくお願い申し上げます。