新規投稿
フォローする

500件以上のレコード取得を用いたルックアップ の自動更新

 

お世話になっております。

以前より、「第11回 kintone REST APIを利用したレコード更新」を参考にカスタマイズを進めております。

社用では500件以上のレコードが登録されているアプリをルックアップ 元にし参照しているのですが行き詰まっており、質問いたします。

500件以上のレコードの取得はhttps://developer.cybozu.io/hc/ja/articles/360000826766-kintoneの大量レコード取得を高速化の手法1を参考にやっています。

エラーメッセージすら出ないので、途中で到達不能になってしまっていると思われます。

return後の命令が生きていないのかと思ったのですが、デバックではそういったエラーメッセージは出ず、'query':'lookup = "' + event.record['ルックアップ 元フィールドコード'].value'"' の部分で Uncaught SyntaxError: Unexpected string が出ます。

解決方法がありましたらご教授いただけますでしょうか。

 

初心者のため至らない点があるかと思いますが、どうぞよろしくお願いいたします。

 

***

// 保存成功後イベント
kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'],

// レコードの一括取得
function fetch(opt_offset,opt_records) {
var offset = opt_offset || 0;
var records = opt_records || [];
var paramGet = {
app: kintone.app.getId(),
query: 'order by $id asc limit 500 offset ' + offset
'query':'lookup = "' + event.record['ルックアップ 元フィールドコード'].value'"'
}
  return kintone.api(kintone.api.url('/k/v1/records',true),'GET', params).then(function(resp){
records = records.concat(resp.records);
if (resp.records.length === 500){
//limitで指定した条件分取得できている場合はまだ残りのレコードがある可能性が高いのでoffsetをlimit分だけずらして再取得
return fetch(offset + 500, records);
}
return records;
});

fetch().then(function (records){
console.log(records);
});

***

0

4件のコメント

Avatar
TK

queryの指定がおかしいかなと思います。

正しくはこんな感じかと

var paramGet = {
  app: kintone.app.getId(),
  query: 'lookup = "' + '"' + event.record['ルックアップ 元フィールドコード'].value + '"' + ' order by $id asc limit 500 offset ' + offset
}
TKにより編集されました
0
Avatar
にゃも

 

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

試してみましたが、Uncaught TypeError: Cannot read property 'ルックアップ 元フィールドコード' of undefinedとなります。

見つからないということで、アプリ内のルックアップ 元フィールドコードを確認しましたが、間違いはないようです。

クエリの条件で、500件以上のレコード取得のみ、または ルックアップレコードの取得のみだといずれも上手くいくのですが・・・

 

解決方法はございますでしょうか。

***

 

(function () {
'use strict';

// ルックアップ先アプリのアプリID
var updateAppId = 2;

/**
* kintone REST APIで一括更新するrecordsデータを作成する関数
* @param records kintone REST APIで一括取得したrecordsデータ
* @returns {Array} kintone REST APIで一括更新するrecordsデータ
*/
function createPutRecords(records) {
var putRecords = [];
for (var i = 0, l = records.length; i < l; i++) {
var record = records[i];
putRecords[i] = {
id: record.$id.value,
record: {
lookup: {
value: record.lookup.value
}
}
};
}
return putRecords;
}

// 保存成功後イベント
kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'],

// レコードの一括取得
function fetch(opt_offset,opt_records) {
var offset = opt_offset || 0;
var records = opt_records || [];
var paramGet = {
   app: kintone.app.getId(),
   query: 'lookup = "' + '"' + event.record['ルックアップ元フィールドコード'].value + '"' + ' order by $id asc limit 500 offset ' + offset
}
  return kintone.api(kintone.api.url('/k/v1/records',true),'GET', params).then(function(resp){
records = records.concat(resp.records);
if (resp.records.length === 500){
//limitで指定した条件分取得できている場合はまだ残りのレコードがある可能性が高いのでoffsetをlimit分だけずらして再取得
return fetch(offset + 500, records);
}
return records;
});

fetch().then(function (records){
console.log(records);
});
return
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', paramGet).then(function(resp) {

// ルックアップの更新
var records = resp.records;
var paramPut = {
'app': updateAppId,
'records': createPutRecords(records)
};
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', paramPut);

}).then(function(resp2) {

// 処理成功
return event;

}).catch(function(error) {

// エラー表示をする
alert('ルックアップの更新でエラーが発生しました。\n' + error.message);
return event;

});
});
})();

 

***

0
Avatar
TK

コード見させていただきましたが色々とおかしい気がします。

ちょっと直してみましたが、fetch()にevent渡さないと動かないかもしれません。

大量にレコード扱うときは個人的には再帰処理よりJSSDK使うと楽なので切り替えてもいいかもです。

(function () {

'use strict';

// ルックアップ先アプリのアプリID

var updateAppId = 2;

/**

* kintone REST APIで一括更新するrecordsデータを作成する関数

* @param records kintone REST APIで一括取得したrecordsデータ

* @returns {Array} kintone REST APIで一括更新するrecordsデータ

*/

function createPutRecords(records) {

var putRecords = [];

for (var i = 0, l = records.length; i < l; i++) {

var record = records[i];

putRecords[i] = {

id: record.$id.value,

record: {

lookup: {

value: record.lookup.value

}

}

};

}

return putRecords;

}

// レコードの一括取得

function fetch(opt_offset, opt_records) {

var offset = opt_offset || 0;

var records = opt_records || [];

var paramGet = {

app: kintone.app.getId(),

query: 'lookup = "' + '"' + event.record['ルックアップ元フィールドコード'].value + '"' + ' order by $id asc limit 500 offset ' + offset

}

return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', paramGet).then(function (resp) {

records = records.concat(resp.records);

if (resp.records.length === 500) {

//limitで指定した条件分取得できている場合はまだ残りのレコードがある可能性が高いのでoffsetをlimit分だけずらして再取得

return fetch(offset + 500, records);

}

return records;

});

}

// 保存成功後イベント

kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'], function(event) {

fetch().then(function (resp) {

// ルックアップの更新

var records = resp.records;

var paramPut = {

'app': updateAppId,

'records': createPutRecords(records)

};

return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', paramPut);

}).then(function (resp2) {

// 処理成功

return event;

}).catch(function (error) {

// エラー表示をする

alert('ルックアップの更新でエラーが発生しました。\n' + error.message);

return event;

});

});

})();
0
Avatar
にゃも

ありがとうございます。

当方、javascriptはkintoneを導入してから初めて触っているので至らない点が多々あるかと思います。

チュートリアルなどで勉強しつつ進めていますがなかなか難しいですね。

JSSDKに書き換えができるほどまだ知識がありません。

レコード大量取得に関しては再帰処理の方がコードが書きやすそうかなと思い、使ってみました。

 

いただいたコードを参考に直してみておりますが、同じUncaught TypeError: Cannot read property 'ルックアップ 元フィールドコード' of undefinedが出るのでもう少し格闘してみようと思います。

 

 

0
ログインしてコメントを残してください。