kintone.proxyでの動作処理後のレコード更新に

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

kintone.proxyを使用してメール送信し、送信した後得意先をサブテーブルに登録したいと考えております。

実現したい事

1.送信対象者のメールアドレス等を別アプリから取得

2.対象者にメールを送信する

3.送信した得意先をサブテーブルに登録する

 

メールの送信が完了し、サブテーブルに登録する事は出来たのですが、

登録件数が一致しない事があります。

 

ご教示ほどよろしくお願いします。

(function()
{
    "use strict";
    kintone.events.on('app.record.detail.show',function(event)
        //メール送信ボタン増殖防止
        if(document.getElementById('Mail_Send_Button')!=null){
            return;
        }
        var Mail_Send_Button = document.createElement('button');
        Mail_Send_Button.id = 'Mail_Send_Button';
        Mail_Send_Button.innerHTML = 'お知らせ送信';
        Mail_Send_Button.onclick = function()
        {
            //送信日時が空白の場合メール送信を行う
             if(event.record['送信日時'].value == '')
             {
                //お知らせメール送信対象者を取得する
                let type = event.record['メール送信対象得意先'].value;
                let query = '';

                switch(type)
                {
                    case '特定の得意先':
                        query = '得意先名 = "' + event.record['得意先選択'].value + '"';
                    break;
                    case '得意先A':
                    case '得意先B':
                        query = 'グループ in ( "' + type + '" )';                
                    break;
                }
                var params = {
                     "app": Master_APP_ID,
                     "query": query
                }
                
                kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params,function(resp) {
                 let resp_record = resp.records;
                 let err_flg = false;
                 let max_length = resp_record.length;

         //取得したレコード分回す
         for(let i = 0; i < resp_record.length; i++)
                 {                 
                     const record_id = kintone.app.record.getId();
           var out_data = { 
                         mail : resp_record[i]['メールアドレス'].value,
                         customer : resp_record[i]['得意先名'].value,
                         title : event.record['件名'].value,
                         body : event.record['本文'].value,
                         url : Kintone_URL+record_id,
           }
                    //メール送信
                     kintone.proxy('メール送信プログラム','POST',{'Content-Type': 'application/json'},out_data).then((args) =>{
console.log(i)                        
                         console.log(resp_record[i]['得意先名'].value)
                         console.log(event.record['確認履歴テーブル']);
                         
                         if(i==0)
                         {
                            event.record['確認履歴テーブル']['value'][i]['value']['得意先名'].value = resp_record[i]['得意先名'].value;
}
                         else
                         {
                             event.record['確認履歴テーブル']['value'].push({
                                    value:{
                                    "確認日時":{
                                        value:'',
                                        type:'SINGLE_LINE_TEXT'
                                    },
                                    "得意先名":{
                                        value: resp_record[i]['得意先名'].value,
                                        type:'SINGLE_LINE_TEXT'
                                    }    
                                }                     
                             })                             
                         } 
if(max_length == i && !err_flg)
                         {
                             var params = {
                             "app": appId,
                             "id": record_id,
                             "record":{
                                 "確認履歴テーブル":{
                                    "value":event.record['確認履歴テーブル'].value
                                    }
                                 }
                             }
                            kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params).then(function(resp) {
                                alert('更新');
                                window.location.reload();
                            },function(resp){
                            if (resp.message !== undefined) {
                                alert(resp.message);
                            } 
                            });                         
                             
                         }
                     },(error) => {
                         alert('メール送信に失敗いたしました。');
                     });                 
              }              
                });
          }
             else
             {
                 alert('メール送信済みの為送信処理を終了いたします。');
                 return false;
             }
        }
        kintone.app.record.getHeaderMenuSpaceElement().appendChild(Mail_Send_Button);
    });
})();

 

kintone.proxy が非同期処理なので、呼び出した順番には、応答が返ってきません。

「max_length == i」の時に、全部のメール送信が終わっていないケースでは抜けが発生すると思います。

 kintone.Promise.all を使って、非同期処理がすべて完了するまで履歴更新を待ってください。

 

rex0220様

返信が遅くなり申し訳ございません。

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

 kintone.Promise.all を使って、非同期処理がすべて完了するまで履歴更新を待ってください。

との事なのですが、非同期処理に当てはまるのが、kintone.proxy の事なのでしょうか?

for文で回している場合、全て完了はどのようにして判定したらいいのでしょうか?

知識不足や理解が足りていなくて申し訳ございません。

ご教示のほどいただけると助かります。

>非同期処理に当てはまるのが、kintone.proxy の事なのでしょうか?

はい。

適当なサンプルが無かったので、切り貼りで書いてみました。

kintone.Promise.all で、すべての kintone.proxy の完了を待ちます。

let parray = [];
for (let i = 0; i < resp_record.length; i++) {
    const record_id = kintone.app.record.getId();
    ...
    //メール送信
    let p1 = kintone.proxy('メール送信プログラム', 'POST', { 'Content-Type': 'application/json' }, out_data).then((args) => {
    ...
    });
    parray.push(p1);
}

kintone.Promise.all(parray).then(function (results) {
    var params = {
        ...
    };
    kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params).then(function (resp) {
        ...
    });
});

rex0220様

早速のご回答ありがとうございます。

また、サンプルコードもありがとうございます。

配列にpromiseを入れるやり方は思いつきませんでした。

サンプルコードを元にプログラムを修正し理想の動作が確認出来ました。

Promiseについても理解が深まりました。

以下修正したコード

kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params,function(resp) {
  let resp_record = resp.records;
let err_flg = false;
  let max_length = resp_record.length;
  let parray = [];
  const record_id = kintone.app.record.getId();  
  let count = 0;      
  for(let i=0; i< resp_record.length; i++)
  {
     var out_data = { 
          mail : resp_record[i]['メールアドレス'].value,
          customer : resp_record[i]['得意先名'].value,
          title : event.record['件名'].value,
          body : event.record['本文'].value,
          url : Kintone_URL+record_id,
      }
      let p1 = kintone.proxy('メール送信プログラム','POST',{'Content-Type': 'application/json'},out_data).then(function(args){
      if(count== 0)
      {
        event.record['確認履歴テーブル']['value'][count]['value']['得意先名'].value = resp_record[count]['得意先名'].value;
      }
      else
      {
        event.record['確認履歴テーブル']['value'].push({
              value:{
                      "確認日時":{
                                   value:'',
                                   type:'SINGLE_LINE_TEXT'
                                  },
                    "得意先名":{
                                   value: resp_record[count]['得意先名'].value,
                                    type:'SINGLE_LINE_TEXT'
                                  }  
                      }                    
               })                            
       }                                                
       count++;
       },(error) => {
              count++;
               err_flg = true;
               return error;
       });          
       parray.push(p1);
  }
  kintone.Promise.all(parray).then(function (result){
      if(!err_flg)
       {
         var params = {
             "app": appId,
             "id": record_id,
             "record":{
                          "確認履歴テーブル":{
                            "value":event.record['確認履歴テーブル'].value
                        }
                       }
             }
             kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params).then(function(resp) {
                  alert('更新');
                   window.location.reload();
                   },function(resp){
                     if (resp.message !== undefined) {
                          alert(resp.message);
                     }
            });    
       }                  
 });
});