kintoneチェックボックスへのPOST

【Garoon JavaScript API】ワークフロー承認時にkintoneにレコード登録する

こちらを参考にワークフロー承認時のデータをkintoneに登録しようとしております。

 

フィールドコード"文字列__1行_"のような、文字列フォームのみにPOSTする場合であれば通常通りレコードが登録されるのですが、

チェックボックス・複数選択・ユーザー選択フォーム のような値に配列を要求するものでは BadRequest が返ります。

リクエストボディはレコードの登録(POST)からほぼコピペしておりますので、間違いはないと思っておりますが、

どなたか解決策をご教示頂ければ幸いです。

 

※以下ソースコードです。ワークフローの「JavaScript / CSSによるカスタマイズ」に設定しております。

(function() {
    “use strict”;
    function addKintoneTask(token, request) {
        var body = {
          “app”:100,
          “record”:{
            “文字列__1行_”:{
              “value”: request[“items”][“Test”][“value”]
            },
            “チェックボックス”: {
              “value”: [
                “sample1”,
                “sample2”
              ]
            }
          }
        };
        var url = “https://弊社ドメイン.cybozu.com/k/v1/record.json”;
        var xhr = new XMLHttpRequest();
        xhr.open(“POST”, “/k/v1/record.json?__REQUEST_TOKEN__=” + token);
        xhr.setRequestHeader(“X-Requested-With”, “XMLHttpRequest”);
        xhr.setRequestHeader(“Content-Type”, “application/json”);
        xhr.send(JSON.stringify(body));
        xhr.onload = function() {
          if (xhr.status === 200) {
              // success
              alert(JSON.parse(xhr.responseText));
          } else {
              // error
              alert(JSON.parse(xhr.responseText));
          }
        };
    };
    garoon.events.on(“workflow.request.approve.submit.success”, function(event) {
        var request = event.request;
        return garoon.connect.kintone.getRequestToken().then(function(token) {
            try {
                addKintoneTask(token, request);
            } catch (e) {
                alert(e);
            }
        });
    });

})();

恐らく原因はこちらと同じくJSON.stringify() の挙動・結果によるものだと思います。

方策としては、4つだと思います。

(1) JSONのPolyfill(ポリフィル)を試してみる

(2) JSONをkintoneのリクエストボディにマッチする形式で文字列で記述してしまう

(3) JSON.stringify()を自作する

(4) 公式対応を待つ

 

(4) についてはプロダクト側での解決方法になるため、アンコントローラブルなことが課題です。現状あまりいい状態ではないので修正かかりそうですが、いつになるかがやはりわからないものです。

(3) は汎用性が高いですが、自作は正直面倒なところかと思います。

(2) が現状では最も確実な方法ではありますが、汎用性に乏しいところが難点でしょうか。

(1) が現実解かと思います。Polyfillは本来ブラウザ未実装な機能を補う意図で利用されますが、今回のようなケースに当てるのも良いかとも思います。MDMのページにだいたい紹介がありますので、それを参考にすることになると思います。JSONのMDMページを見るとPolyfillとしてソースの他にライブラリもJSON2、JSON3と紹介されていますので、試されると良いかと思います。私も実際に試したわけではないので、3パターン全てマッチしない可能性はあります。リスクとしては、Polyfillはwindow.JSONを上書きし直すことになるので、可能性は低そうですがGaroonがprototype.jsが上書きしているwindow.JSONを使っていたとすると、Garoonの他の機能に影響を与えうるというところですね(Polyfillがwindow.JSONの上書きをしないようにすれば良いのですが、キリないですね)。

 

Ryu Yamashitaさん

類似トピックのご紹介ありがとうございます。

原因については凡そ把握致しました。

頂いた方策を基にまずはPolyfillを試してみようと思います。

Polyfillの利用について、先のポストに追記させてもらいました。うまくいくことをお祈りしています。