新規投稿
フォローする

サブテーブルを含むPOSTリクエストの作り方

kintone javascriptカスタマイズ初心者です。
サブテーブルを含むリクエストボディの作り方で下記記事を参考にして進めておりました。

https://developer.cybozu.io/hc/ja/community/posts/360054948791-%E3%82%B5%E3%83%96%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%B8%E3%81%AEPOST%E6%96%B9%E6%B3%95

リクエストボディにサブテーブルを含んでおり、そのフィールドにユーザー選択が存在します。ユーザー選択のリクエストボディの作り方は下記記事を参考にしているのですが、

https://developer.cybozu.io/hc/ja/articles/202166160-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%99%BB%E9%8C%B2-POST-

ユーザー選択の部分がオブジェクトになっており、とりあえず下記のように記述してみました。※リクエストボディはえらくボリュームがあるので一部抜粋している形です。プログラム全般が必要であればおっしゃっていただけたら嬉しいです。

 

  let OHData = [];    //訪問履歴
 let VNData = []; //訪問したユーザー(ユーザー選択)
  let POST_Body = {
            
          'app':54,   //顧客管理アプリID
          'record':{
                
              'dc_num':{
                  'value':record.dc_num.value //歯科医院コード
              },

          'opportunity_history':{
                  'value':OHData     //新規訪問履歴
              }
      }
  };

  i=0;
  j=0;
  for(i=0; i<record.opportunity_history.value.length; i++){
          
    for(j=0; j<opportunity_history[i].value.visiter_name.value.length; j++){
          
      VNData.push({'value':{'code':opportunity_history[i].value.visiter_name.value[j].code}})
      }
    }
      
  i=0;    

  //POST_Bodyのサブテーブル追加
  for(i=0; i<record.opportunity_history.value.length; i++){
        
    OHData.push({'value':{
              
      'next_opportunity':{
          'value':opportunity_history[i].value.next_opportunity.value
       },
              
       'prospect':{
           'value':opportunity_history[i].value.prospect.value
       },

       'visiter_name':{
            'value':VNData[i]
             //'code':opportunity_history[i].value.visiter_name.value[0].code
             //'name':opportunity_history[i].value.visiter_name.name
       }
      }
    })
  }//end for

ところがユーザーが選択されているところは1ユーザーしかcodeがしていされていなかったり、POSTもBad Requestが返ってきており、確実にリクエストボディの作り方だと考えております。(ユーザー選択の部分を抜かすとPOSTは成功します)

どなたか、この部分の的確な記述の仕方をご教授いただけたら幸いでございます。

0

2件のコメント

Avatar
mls-hashimoto

見た限りだと、2行目の

  let VNData = [];    //訪問したユーザー(ユーザー選択)

この部分と、24行目の

      VNData.push({'value':{'code':opportunity_history[i].value.visiter_name.value[j].code}})

この部分に問題がありそうです。

ユーザー選択フィールドの配列は、サブテーブルのforループごとに宣言し直す必要があり、またpushする値にサブテーブルのような「value: {...}」は必要ありません(codeとnameだけの連想配列で問題ありません)。

2行目の宣言、20~26行目のループは削除し、それぞれ以下の場所に移して下さい。

  //POST_Bodyのサブテーブル追加
  for(i=0; i<record.opportunity_history.value.length; i++){
    let VNData = [];    //訪問したユーザー(ユーザー選択)

  for(j=0; j<record.opportunity_history.value[i].value.visiter_name.value.length; j++){
VNData.push(/* 囲んである部分は削除{'value': */{'code':record.opportunity_history.value[i].value.visiter_name.value[j].code}/* 囲んである部分は削除} */)
  };

// 以下そのまま    OHData.push({'value':{

ただ、そもそもPOSTする対象のアプリのフィールドが文字列フィールド等であればこの形でなければなりませんが、同じユーザー選択フィールドであれば、そもそもVNDataの宣言やpush等も必要なく、以下の書き方で問題ありません。

       'visiter_name': {
          'value': opportunity_history.value[i].value.visiter_name.value
       }

また、サブテーブルの値をforループで求める場合は

record['サブテーブルのフィールドコード'].value[/* インデックス番号 */].value[/* フィールドコード */].value

と求める必要があり、opportunity_history[i]という書き方ではエラーになると思われます(opportunity_history.value[i]...と書く必要があります)。

mls-hashimotoにより編集されました
1
Avatar
吉原大騎

mls-hashimoto

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

ご教授頂きました下記の記述

      'visiter_name': {
          'value': opportunity_history.value[i].value.visiter_name.value
       }

にてPOST成功することができました。ありがとうございます!

POST先のフィールドが同じであればこのような記述でよいことは大きな学びになりました!

また、opportunity_historyという変数がopportunity_history = record.oppotunity_history.valueとしたものを使っていたので先だっていた記述になっていました。この部分を共有しておらず申し訳ございません。

とはいえ、reocrd~を使う場合はご教授頂いた記述で書く必要があることについて大変勉強になりました。

mls-hashimoto様のお時間を頂きご教授いただきありがとうございます。

 

 

1
サインインしてコメントを残してください。