kintone.promiseの使用方法?

kintone.promiseを使ってkintone.apiをコントロールしようとしたのですが、

思ったように動きません。

内容は、マスターアプリとマスター使用(ルックアップで)アプリの関係で、

ルックアップ元のマスターを変更した時にマスターしようアプリのルックアップ先を

変更しようとするものです。更新成功のメッセージは出るのですが、実際の更新

はされていません。私はpromise の使い方が間違っているのかなと思うのですが

違っているのかもしれません。

以下のコードで実行してます。

jQuery.noConflict();
(function($) {
“use strict”;

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

var afterRecord = event.record;
var appId = kintone.app.getId();
var recId = event.recordId;
var manyappid = [12];
var appname = [“プログラ”];
var j;
var n = 0;
var orquery;
return new kintone.Promise(function(resolve, reject) {
// まず、変更前のルックアップデータを取得する
kintone.api(‘/k/v1/record’, ‘GET’, {app: appId, id: recId}).then(function (resp) {
var beforeRecord = resp.record;
for ( j = 0; j < manyappid.length; j++ ) {
// 次に、ルックアップ参照元(コピー先)の更新対象レコードを取得する.
orquery = ‘車種名 = "’ + beforeRecord.車種名.value + ‘" ‘+‘or’+’ 関連車種1 = "’ + beforeRecord.車種名.value + ‘"’;

var before_pname = beforeRecord.車種名.value;
fetchRecords(manyappid[j], orquery).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 pname1 = records[offset][‘車種名’].value;
var pname2 = records[offset][‘関連車種1’].value;
var pname3 = records[offset][‘関連車種2’].value;
var recNo = records[offset][‘$id’].value;
var record = [];
var somerecord;
if (beforeRecord.車種名.value == pname1){

somerecord = {“車種名”: {“value”: afterRecord.車種名.value},
“車種名”:{“value”: afterRecord.車種.value}
};
record.push(somerecord);

}
if(beforeRecord.車種名.value == pname2){
somerecord = {“関連車種1”: {“value”: afterRecord.車種名.value},
“設定用2”:{“value”: afterRecord.車種名.value}
};
record.push(somerecord);
}
if(beforeRecord.車種名.value == pname3){
somerecord = {“関連車種2”: {“value”: afterRecord.車種名.value},
“設定用3”:{“value”: afterRecord.車種名.value}
};
record.push(somerecord);
}

editRecords.push({‘id’: recNo, ‘record’: record});

}

// 最後に更新処理
console.log(editRecords);
kintone.api(‘/k/v1/records’, ‘PUT’, {‘app’: manyappid[n], ‘records’: editRecords}).then(
function () {
alert(‘更新処理出来ました。’);
// resolve(“処理OK”);

}, function() {
// error

alert(‘更新処理出来ませんでした。’);
});
n = n + 1;
}
});
}
});
resolve(event);
}).then(function(resp_) {

alert(“処理完了!”);
return event;
});
});
// 全件取得関数
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;
});
}
})(jQuery);

promiseのサンプルコードを色々見て作ったものです。

足らない所を教えてもらえれば幸いです。

よろしくお願いします。

松本賢二さん

submit イベントではなく、submit.success イベントで更新処理しましょう。
submit イベントでは、まだ更新内容がDBに反映されていません。
このイベント内でルックアップ先を更新しても、更新前のデータを取得するだけです。

submit イベントでは、更新前情報を取得し、セッションストレージなどに退避しておき、
submit.success イベントで参照します。
(edit.show でevent.record を退避してもOK)

あといくつか気になった点です。
・もし車種名、関連車種1、関連車種2 に同じ値が設定されている場合は、更新レコード100件を超える
1レコードに車種名、関連車種1、関連車種2を設定したほうが良い
・コピー項目があるなら、無条件で対象レコード更新でもよい
コピー項目が最新に更新されます。
・全件取得関数で 100 件ごとに取得となっているが、全件取得なら500 件のほうがパフォーマンス改善になる
・同じく全件取得で、fields で必要な項目のみ取得に絞ったほうが良い
・全件取得、対象レコード更新ならkintone Utility for JavaScriptを使ってはどうか?

rex0220様

ご教授ありがとうございます。

早速実行してみます。本当にありがとうございました。