一覧画面表示時のサブテーブルの値追加

一覧画面表示時に、 フィールドコード:Processの値によって、サブテーブルの値を変更したいのですが、うまくいきません。
下記コードの間違い、または何か良い方法がございましらご教示頂けますと幸いです。


(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’,function(event){
var records = event.records;
for (var i = 0; i < records.length; i++) {
var record = records[i];
var Process = record[‘Process’][‘value’];

if(Process === "A"){
            kintone.api(
                kintone.api.url('/k/v1/record',true),
                'PUT',
                {
                    "app": 132,
                    "id" : record['レコード番号']['value'],
                    "record": {
                        "テーブル": {
                            "value": {
                                "0":{
                                    "value": {
                                        "process": {
                                            "value": "B"
                                        },
                                        "Date": {
                                            "value": null
                                        },
                                        "week": {
                                            "value": ""
                                        },
                                        "chk_P": {
                                            "value": []
                                        },
                                        "chk_C": {
                                            "value": []
                                        },
                                        "status": {
                                            "value": "C"
                                        },
                                        "comment": {
                                            "value": ""
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            );
        }
    }
});

})();

田中さん

サブテーブルの所で

"テーブル": {
  "value": {
    "0":{

となっている部分を、

"テーブル":{
  "value": [
    {
      "value": {
        "process": {
            "value": "B"
        },
        "Date": {
            "value": null
        },
        "week": {
            "value": ""
        },
        "chk_P": {
            "value": []
        },
        "chk_C": {
            "value": []
        },
        "status": {
            "value": "C"
        },
        "comment": {
            "value": ""
        }
      }
    },
    {
      "value": {
        "process": {
            "value": "B"
        },
        "Date": {
            "value": null
        },
        "week": {
            "value": ""
        },
        "chk_P": {
            "value": []
        },
        "chk_C": {
            "value": []
        },
        "status": {
            "value": "C"
        },
        "comment": {
            "value": ""
        }
      }
    }
  ]
}

といった感じにして頂けますと、通るのではないかと思います。[]の中に並べる分がサブテーブルの各行になります。
サブテーブルにあまり慣れていっらしゃらないのであれば、まずはGETメソッドで形を確認されてみると
良いかと思います。
また、サブテーブル関連のTips(1
2
3)も参考にされてみてください。

Ryu Yamashita さん
ありがとうございます!
ご指摘いただいた部分を修正したのですが、
PUT https://*****.cybozu.com/k/v1/record.json 400 (Bad Request)
とでてしまいます。こちらのエラーはどういった時にでるものなのでしょうか?

エラーメッセージを表示することは出来ますか?(リファレンスのサンプルのようにerrbackを指定する等)
400ですと、「不正なJSON文字列です」等が候補になってきます。

事前にrecordオブジェクトを個別に出して確認してみたり、サブテーブルに入れるフィールドを少なめからリクエストを試してみるのはいかがでしょうか?(サブテーブル中の全てのフィールドを指定しなくても、指定したフィールドのみ反映されますのでアプリ側のフィールドの変更等は不要です)

あとは、他の方法()でリクエストしてみたりして比べてみるのもひとつの方法だと思います。

Ryu Yamashitaさん
早急にご対応いただきありがとございます!
頂いたアドバイスを参考に試してみようと思います。
エラーメッセージには、"入力内容が正しくありません。"と表示されました・・・!

エラーメッセージには、"入力内容が正しくありません。"と表示され
ました・・・!

このメッセージには分岐がありますが、

まず、 必須であるリクエスト成功時コールバック関数 の指定がありませんでしたが、こちらはリファレンス通り対応頂きましたでしょうか?

また、補足になりますが、このJSを仕込むアプリに対するリクエストかなぁと推察させてもらったのですが、それであれば

  • アプリIDを kintone.app.getId() で与える(アプリコピー等しても書換が不要になりますね)
  • レコード番号を record['$id']['value'] で与える(レコード番号フィールドはアプリコードの追加やフィールドコードの変更が起こりえますが、$idはユニークなレコードIDです)

を適用されると良いのではないかと思います。

あと、ご存知かと思いますが ‘event.records’ は今回ですとレコード一覧画面表示時イベント発動時に得られるものですので、要は表示されているレコードを取得し、今回更新対象としていることとなりますので、アプリ内の全レコードに対してという意図でしたら100件超えた際に次の101件目は「次へ」ボタンを押した際に更新されるということになりますので、ご注意ください。

またご不明な点がありましたら、お問合せ頂ければと思います。

Ryu Yamashitaさん
エラーは、
レコード取得時にエラーが発生しました。
入力内容が正しくありません。
と表記されました。省略していましたすみません。

再度、いただいたアドバイスで試してみます!
本当にありがとうございます!!
また質問させていただくかもしれませんが、よろしくお願いいたします。

言葉足らずですみません^^; 「入力内容が正しくありません」って分かりにくいですよねぇ。という意で捉えて頂けますと幸いです。

レコード取得時にエラーが発生しました。

こちらは、リファレンスのサンプル中に挿入されていたテキストですね。

コードを取得し、今回更新対象としていることとなりますので、アプリ内の全レコードに対してという意図でしたら100件超えた際に次の101件目

この辺の話を外して当初の意図を実現しようとすると、これで通ると思います。あとは、コール数の節約等も考慮して/k/v1/recordsでやる方法も良いかと思います。

(function() {
  "use strict";

  kintone.events.on('app.record.index.show',function(event){
    var records = event.records;
    for (var i = 0; i < records.length; i++) {
      var record = records[i];
      var Process = record['Process']['value'];

      if(Process === "A"){
        kintone.api(
            kintone.api.url('/k/v1/record',true),
            'PUT',
            {
                "app": kintone.app.getId(),
                "id" : record['$id']['value'],
                "record": {
                  "テーブル":{
                    "value": [
                      {
                        "value": {
                          "process": {
                              "value": "B"
                          },
                          "Date": {
                              "value": null
                          },
                          "week": {
                              "value": ""
                          },
                          "chk_P": {
                              "value": []
                          },
                          "chk_C": {
                              "value": []
                          },
                          "status": {
                              "value": "C"
                          },
                          "comment": {
                              "value": ""
                          }
                        }
                      },
                      {
                        "value": {
                          "process": {
                              "value": "B"
                          },
                          "Date": {
                              "value": null
                          },
                          "week": {
                              "value": ""
                          },
                          "chk_P": {
                              "value": []
                          },
                          "chk_C": {
                              "value": []
                          },
                          "status": {
                              "value": "C"
                          },
                          "comment": {
                              "value": ""
                          }
                        }
                      }
                    ]
                  }
                }
            },
            function(resp){
                console.log(resp);
            },
            function(resp) {
              var errmsg = 'レコード更新時にエラーが発生しました。';
              if (resp.message !== undefined){
                errmsg += '' + resp.message;
              }
              console.log(errmsg);
            }
        );
      }
    }
  });
})();

いかがでしょうか?

Ryu Yamashitaさん

下記のコードで、テーブル項目の"必須項目にする"のチェックを外したところ出来ました!このチェックをしているしていないは関係するものなのでしょうか?

また、Dateの部分に
“Date”: {
“value”: “2015-02-06”
の様に値を入れたところ再び反応しなくなりました・・・。
ちなみに下記の様なエラーが出ています。
Uncaught TypeError: Cannot read property ‘value’ of undefined

重ね重ね申し訳ございませんが、よろしくお願いいたします。

下記のコードで、テーブル項目の"必須項目にする"のチェックを外したところ出来ました!このチェックをしているしていないは関係するものなのでしょうか?

文字通り必須のフィールドに値が指定されていないとエラーになってたと思います。

"Date": {
  "value": "2015-02-06"
}

こちらは私の方でも試してみましたが、更新できてしまいました^^; (フィールドのアクセス権や必須項目等の縛りはつけていません)

Uncaught TypeError: Cannot read property ‘value’ of undefined

これは、例えば record['Process']['value'] を得ようとする時に、Processプロバティが定義できていない(フィールドコードが誤っていたり)場合に出るエラーです。
先のサンプルコードで読み出しを行っているのは record['Process']['value']record['$id']['value'] だけですが、$id は不変ですので、前者に原因になっている可能性が高そうに思います。

Ryu Yamashitaさん
申し訳ございません・・・フィールドコードが間違っていました><
無事実装する事が出来ました!ありがとございます!!!
ただ正常に動作したのですが、下記エラーがでております。
Uncaught TypeError: undefined is not a function
こちらのエラーは、どういった時に出るものか教えていただきたいです。。

また、更新件数が100件以上ある場合は、
https://cybozudev.zendesk.com/hc/ja/articles/201501294
こちらを参考にすれば良いでしょか??

無事実装に至られた?ようで良かったです^^

Uncaught TypeError: undefined is not a function

は文字通りですが、定義されていない関数をコールしている時に出ますね。私が試した際には出ていませんし、今回のサンプル中で起きている事象ではなさそうに思います。

また、更新件数が100件以上ある場合は、

xmlHttpRequestに抵抗はありますが、こちらを参考にされてみてください。

Ryu Yamashitaさん
実装できました!ありがとうございます。
エラーに関しては、探ってみます・・・!

ちなみにxmlHttpRequest以外の方法で、何か良い方法はございますでしょうか?
何度もすみませんがご教示いただけますと幸いです><

ちなみにxmlHttpRequest以外の方法で、何か良い方法はございますでしょうか?

今回既に使われていますが、kintone JavaScript APIとしてサポートされている kintone.api() の利用が推奨されています。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。