アプリIDからアプリ名を取得して文字フィールドへ入力する(サブテーブル)

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

サブテーブルに下記のようなフィールドを作っています。

「アプリID」へ任意のアプリIDを入力し、隣の「アプリ名」へアプリ名を入れています。

現状テーブルを追加しアプリIDを入れますと1行目で取得したアプリ名を上書きしてしまいます。

アプリID:112 顧客情報、 アプリID:24 問い合わせ管理

コードは下記のとおりですが、修正すべきところがわかりません。

ご教授いただけますと幸いです。

よろしくおねがいします

function(event){
                            
                            var record = event.record;
                            var subTotals = {};
                            
                            
                                for (var i = 0; i < record.テーブル.value.length; i++) {
                                var AppID = record.テーブル.value[i].value['アプリID'].value;

                                subTotals += ","+AppID
                                
                                
                                }
                                
                                record.APP連結キー.value=subTotals
                         
                                
                                if(!AppID){}else{
                                
                                const body = {
                                    'id': AppID

                                };
                                
                                
                                
                                
                              return kintone.api(kintone.api.url('/k/v1/app.json', true), 'GET', body, (resp) => {
                          //      return kintone.api(kintone.api.url('/k/v1/app.json', true), 'GET', body).then(function(resp) => {
                                    // success
                                    console.log(respAPPname)
                                    var respAPPname = resp.name
                                    var respRecord = kintone.app.record.get();
                                     
                                     for (var i = 0; i < respRecord.record.テーブル.value.length; i++) {
                                         
                                         respRecord.record.テーブル.value[i].value.アプリ名.value=respAPPname
                                         
                                     }
                                     
                                      kintone.app.record.set( respRecord );
                                  
                              
                                    
                                }, (error) => {
                                    // error
                                    console.log(error);
                                    
                                    var respRecord = kintone.app.record.get();
                                    
                                    for (var i = 0; i < respRecord.record.テーブル.value.length; i++) {
                                        
                                        respRecord.record.テーブル.value[i].value.アプリ名.value="不正なリクエスト"
                                        
                                    }
                                    
                                     kintone.app.record.set( respRecord );

                                });
                                
                               // console.log(respAPPname);
                                
                                
                                
                                
                                }
                                
                                
                            
                            
                            return event;

                        });

青山昌司 さん

下記の点を修正すれば動作すると思います。

returnkintone.api(kintone.api.url('/k/v1/app.json',true),'GET', body, (resp) => {

アプリ情報の取得処理で使用しているAPIは1件しか取得できないため、アプリ情報の一括取得のAPIを使用します。

 respRecord.record.テーブル.value[i].value.アプリ名.value=respAPPname

アプリ情報取得後、サブテーブル各行のアプリIDと取得したアプリ情報を付け合わせて名前を設定します。

 

以上になります。実装してみて何か不明な点がありましたら、気兼ねなくご質問ください。

川村さま

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

ご返信ありがとうございます。

下記の変更で動くようにはなったんですが、理解はあっておりますでしょうか?

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

return kintone.api(kintone.api.url('/k/v1/apps.json', true), 'GET', body, (resp) => {
                                  
                          
                                    // success
                                    console.log(respAPPname)
                                    console.log(resp)
                                    console.log(resp.apps)
                                    var respAPPname = resp.name
                                    var respRecord = kintone.app.record.get();
                                    
                                   
                                     
                                     for (var i = 0; i < respRecord.record.テーブル.value.length; i++) {
                                         
                                         for (var r = 0; r < resp.apps.length; r++) {
                                             
                                             if(resp.apps[r].appId===respRecord.record.テーブル.value[i].value.アプリID.value){
                                             
                                             
                                             respRecord.record.テーブル.value[i].value.アプリ名.value = resp.apps[r].name
                                             
                                         }
                                             
                                         }
                                         
                                         
                                        
                                         
                                     }
                                     
                                      kintone.app.record.set( respRecord );

 

 

青山昌司 さん

はい、その理解で問題ありません。

下記は不要になるかと思います。

varrespAPPname = resp.name

以上になります。参考になれば幸いです。

川村さま

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

添削ありがとうございました。

因みにアプリが100個を超える場合は超えたアプリ名を取得できません。

回避する方法はありますでしょうか?

青山昌司 さん

アプリ情報の一括取得APIのパラメータに limit と offset があるのでそちらを使用すると全件取得できます。

全件取得する場合は Promise でループする必要があるので少し処理が複雑になります。参考としてコードも載せておきます。

再帰処理を使った実装

function getApps(offset = 0, limit = 100, apps = []) {
  return kintone.api('/k/v1/apps', 'GET', { offset, limit }).then((res) => {
    apps.push(...res.apps);

    if (res.apps.length === limit) {
    return getApps(offset + limit, limit, apps);
    }

    return apps;
  });
}

getApps().then(console.log);

上記を async await を使って書き直した実装

async function getApps(offset = 0, limit = 100, apps = []) {
  for (
    let params = { offset, limit }, res;
    res === undefined || res.apps.length === limit;
    params.offset += limit
  ) {
    res = await kintone.api('/k/v1/apps', 'GET', params);
    apps.push(...res.apps);
  }

  return apps;
}

getApps().then(console.log);

※ 動作環境までは考慮していません。最新のブラウザだと問題ありませんが、環境によっては動作しない書き方が含まれる可能性があります。

 

以上になります。書き方等何が不明な点がありましたら、気兼ねなくご質問ください。