レコード登録時に他のアプリの特定のレコードを取得したい。

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

皆さん、ありがとうございます!

早速使ってみます(^^)

ご協力ありがとうございます!これからもよろしくお願い致します。