ルックアップ 自動更新について

お世話になります。

Kintonemカスタマイズ初心者で至らない点が多く恐縮です。

 

ルックアップ 自動更新をしたく、コードを書いたのですが、下記の部分でエラーになってしまいます。

ルックアップ元アプリ:名簿アプリ(1500件ほど)

ルックアップ先アプリ:顧客管理アプリ(名前でルックアップ)

 

query: ‘lookup = "’ + ‘"’ + event.record[‘名簿_名前’].value + ‘"’ + ’ order by $id asc limit 500 offset ’ + offset

}

“Uncaught TypeError: Cannot read property ‘名簿_名前’ of undefined”

 

フィールドコードを確認しましたが合っていました。

他に記述がおかしい所がありましたらご教示願います。

 

 

(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) {

//残りのレコードを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(‘ルックアップの更新でエラーが発生しました。’ + error.message);

return event;

});

});

})();

 

保存成功後イベント処理の event 引数は、fetch 関数から直接参照できません。

保存成功後イベント処理内に、fetch 関数を定義するか、またはfetch 関数のパラメータに event を追加してください。

 

rex0220さん

アドバイスありがとうございます。

先ほど調べていたところ、fetchはIEでは使えないというのを知りました。

fetchを使わずに500件以上取得する方法はありますでしょうか。

上記の fetch 関数をみたところ、特に IE で動作しないような構文等は使われていませんので、event 引数を直接参照している問題を解決すれば、動くと思います。

なお、 kintone 用に提供されている JavaScript ライブラリを使えば、ライブラリ内でループ処理を行ってくれます。

kintone Utility Library for JavaScript

kintone JS SDK ※「kintoneUtility」の後継

回答いただきありがとうございます。

fetch関数にeventを次のように定義してみましたが、上手くいきませんでした。

また、レコード件数100件以下のアプリではエラーは出ず、500件以上のアプリでのみエラーが起きてしまいます。

記述方法に問題がありますでしょうか。

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

 

function fetch(opt_offset, opt_records) {

var offset = opt_offset || 0;

var records = opt_records || [];

var event = true;

var paramGet = {

app: kintone.app.getId(),

query: ‘lookup = "’ + ‘"’ + event.record[‘名簿_名前’].value + ‘"’ + ’ order by $id asc limit 500 offset ’ + offset

}

まず、変数の使い方に誤解があるようです。

関数の引数や、関数内で定義された変数は、関数内でしか参照できません。

参考 関数とスコープ

 

とりあえず、変更案として

・fetch のパラメータに 抽出条件(query)を追加して、fetch 関数内で event 変数は参照しない。

 

次に fetch 関数は非同期処理なので、そのまま呼び出すと fetch 処理の終了を待たずに、イベント処理が終了します。

fetch 処理の終了後に、イベント処理が終了するように変更。

・fetch の呼び出しを 「return fetch(query).then(function (resp) {」に変える

 

>レコード件数100件以下のアプリではエラーは出ず、500件以上のアプリでのみエラーが起きてしまいます。

「kintone.api.url(‘/k/v1/records’, true), ‘PUT’,」は、最大100 レコードの更新を行うAPI です。

100 レコード以上の更新を行う場合は、fetch 関数を同様に再起呼び出しで処理しましょう。

 

下記は、切り貼りしただけなので検証はお願いします。

※100 レコードを超える更新処理は、変更していませんので、考えてみて下さい。

 

(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_query, opt_offset, opt_records) {

        var query = opt_query || ‘’;

        var offset = opt_offset || 0;

        var records = opt_records || [];

        var paramGet = {

            app: kintone.app.getId(),

            query: query + ’ 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) {

                //残りのレコードをoffsetをlimit分だけずらして再取得

                return fetch(query, offset + 500, records);

            }

            return records;

        });

    }

    // 保存成功後イベント

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

        var query = ‘lookup = "’ + ‘"’ + event.record[‘名簿_名前’].value + ‘"’;

        return fetch(query).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(‘ルックアップの更新でエラーが発生しました。’ + error.message);

            return event;

        });

    });

})();