kntoneのアプリの保存が完了前に他のアプリから、電話番号をGETし、その値を主キーとして、別のサービスを更新するという事を行いたいです。
調べると下記コードで、レコード自体をGETする事はできそうなのですが、特定のフィールドのみをGETする方法が分かりません。
初心者の質問だったら申し訳ないですがよろしくお願いします。
//▲▲▲▲▲▲▲▲▲▲▲会社情報アプリから電話番号を取得▲▲▲▲▲▲▲▲▲▲▲
function getRecords(appId, opt_where, opt_offset, opt_limit, opt_records) {
var where = opt_where || ‘’;
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var params = {app: appId, query: where + ’ order by レコード番号 asc 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 getRecords(appId, where, offset + limit, limit, allRecords);
}
return allRecords;
});
};
//▲▲▲▲▲▲▲▲▲▲▲kintoneの保存完了前処理▲▲▲▲▲▲▲▲▲▲▲
kintone.events.on(“app.record.edit.submit”, function(event) {
var appIds = 16;
var value = event.record[‘record_company’].value;
var rank = record[‘rank’].value;
var maintenance = record[‘maintenance’].value;
var person = record[‘person’].value;
regRecords(rank,maintenance,person,getRecords(appIds,'record_company = ’ + value));
});
})();
Ryo Saido さん
レコード取得APIで、特定の項目のみ取得するには、fields オプションに配列でフィールドコードを指定します。
あと、submit イベントで Promise処理する場合は、非同期処理が完了後に 「return event」 を行う必要があります。
非同期処理の完了前に、submit イベント処理から抜けると、画面遷移が起こり、非同期処理がエラーになります。
パラメータに getRecords 呼び出しを指定した場合は、getRecords の完了を待たずに、regRecords が呼び出されます。
regRecords の内容が分かりませんが、ここでも非同期で API 処理を行う場合は、同様にAPI 完了後に「return event」する構造にします。
下記は、切り貼りしただけですので、ご参考程度に。
//▲▲▲▲▲▲▲▲▲▲▲会社情報アプリから電話番号を取得▲▲▲▲▲▲▲▲▲▲▲
function getRecords(appId, opt_where, opt_fields, opt_offset, opt_limit, opt_records) {
var where = opt_where || '';
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var params = {app: appId, query: where + ' order by レコード番号 asc limit ' + limit + ' offset ' + offset };
if (opt_fields) params.fields = opt_fields;
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return getRecords(appId, where, opt_fields, offset + limit, limit, allRecords);
}
return allRecords;
});
};
//▲▲▲▲▲▲▲▲▲▲▲kintoneの保存完了前処理▲▲▲▲▲▲▲▲▲▲▲
kintone.events.on("app.record.edit.submit", function(event) {
var appIds = 16;
var value = event.record['record_company'].value;
var rank = record['rank'].value;
var maintenance = record['maintenance'].value;
var person = record['person'].value;
return getRecords(appIds,'record_company = ' + value, ['電話番号']).then(function(resp) {
return regRecords(rank,maintenance,person, resp);
});
function regRecords(rank,maintenance,person,allrecords) {
...
...
return event;
}
})();
Ryo Saido さん、
投稿のご質問に刺激されて、次のようなアプリを作ってみました。
[アプリ内容]
他のアプリのレコードをクエリー参照して、特定のフィールドが特定の値であるもののみを
本アプリにレコード登録(POST)する、というものです。
※他のアプリと本アプリは同じフォーマットのレコードを持っています。
レコード詳細画面で、「保存」すると、他のアプリからクエリーされたデータを取得し、
本アプリに登録します。
以下、jsコード全文です。
同期処理で、レコードをGET/POSTしています。
何かのついでに、ご覧ください。
よろしくお願い致します。
(function() {
“use strict”;
//アプリ初動確認用
kintone.events.on(‘app.record.index.show’, function(event) {
window.alert(‘START’);
}); // kintone.events.on('app.record.index.show
kintone.events.on(“app.record.edit.submit”, function(event) {
var record = event.record;
var appId = 2434; // 他アプリ(参照先)
var company = record[‘record_company’].value;
var where = ‘record_company=“B会社” ‘;
var rank = record[‘rank’].value; // offset
var maintenance = record[‘maintenance’].value;
var person = record[‘person’].value; // limit
var opt_records = new Array();
opt_records = getRecords(appId, where, record[‘電話番号’].value, rank, person, opt_records);
regRecords(rank,maintenance,person, opt_records);
// (他アプリ)レコード取得
function getRecords(appId, opt_where, opt_fields, opt_offset, opt_limit, opt_records) {
var where = opt_where || ‘’;
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var b_query = where + ’ order by レコード番号 desc limit ’ + limit + ’ offset ’ + offset;
var a_query = encodeURIComponent(b_query);
var appUrl = kintone.api.url(’/k/v1/records’) + ‘?app=’+appId + ‘&query=’ + a_query;
var records = new Array(); // 取得レコードメモリ
var loopendflg = false; // whileループフラグ
var loop_count = 0; // 念のため、永久ループ発生対策
// ############while(!loopendflg)##################################
while(!loopendflg){
loop_count = loop_count+1; // 永久ループ回避キー
// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open(“GET”, appUrl, false);
xmlHttp.setRequestHeader(‘X-Requested-With’,‘XMLHttpRequest’);
xmlHttp.send(null);
//取得したレコードを格納 & JSONにパース
var respdata = JSON.parse(xmlHttp.responseText);
// 他アプリからの取得レコード
if(respdata.records.length > 0){
for(var i = 0; respdata.records.length > i; i++){
records[i] = respdata.records[i];
}
loopendflg = true;
offset += respdata.records.length;
}else{
loopendflg = true;
} // if(respdata.records.length > 0)
if(loop_count >5) { // 永久ループ回避キー チェック
loopendflg = true;
}
} // while(!loopendflg)
// ############while(!loopendflg)##################################
opt_records = records;
return opt_records;
} // function getRecords(appId
function regRecords(opt_offset ,maintenance,opt_limit, get_records) {
var offset = opt_offset || 0;
var post_records = new Array(); // 取得レコードメモリ
post_records = get_records;
var loopendflg = false; // whileループフラグ
var loop_count = 0; // 念のため、永久ループ発生対策
while(!loopendflg){
loop_count = loop_count+1; // 永久ループ回避キー
var post_r = get_records.length;
window.alert(‘post_r ‘+post_r);
var appId = kintone.app.getId();
// 同期リクエストを行う
// 他アプリからの取得レコードを、当アプリにレコード登録
for(var i = 0; post_r > i; i++){
var body = {
“app”: appId,
“record”: {
“数値An”: {
“value”: 5
},
“record_company”: {
“value”: “X会社”
},
},
// CSRF TOKEN: kintone上からAPI(POST, PUT, DELETE)を実行する場合に設定する必要あり
“__REQUEST_TOKEN__”: kintone.getRequestToken()
};
body.record.数値An.value = post_records[i].数値An.value;
body.record.record_company.value = post_records[i].record_company.value;
var url = kintone.api.url(’/k/v1/record’);
var xhr = new XMLHttpRequest();
xhr.open(‘POST’, url);
xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
xhr.setRequestHeader(‘Content-Type’, ‘application/json’);
xhr.onload = function() {
if (xhr.status === 200) {
window.alert('status === 200 ');
// success
console.log(JSON.parse(xhr.responseText));
} else {
window.alert('status === NOT 200 ');
// error
console.log(JSON.parse(xhr.responseText));
}
};
xhr.send(JSON.stringify(body));
} // for(var i = 0
loopendflg = true;
offset += post_records.length;
if(loop_count >5) { // 永久ループ回避キー チェック
loopendflg = true;
}
} // while(!loopendflg)
} // function regRecords(appId,
}); // kintone.events.on("app.record.edit.submit
})(); // (function()
皆さん、ありがとうございます!
早速使ってみます(^^)
ご協力ありがとうございます!これからもよろしくお願い致します。