PUTでのテーブルへの登録ができない

 

レコード詳細画面の表示時に、apiを使用してテーブルに値を登録したいと思います。

 

色々調べてみたのですが、apiは成功しているようですが登録がされません。

 

apiの実行後のタイミングで変数が初期化されているようなので、同期実行がうまくできておらず、イベントが終了してしまっているのでしょうか。

 

もしくは、apiで使用するbodyの中身を設定後にみたところ、変数の中身でなく、変数名が表示されているのですが、フィールドコードを変数で指定することができないのでしょうか。

 

 

 

function touroku(event){
  var record = event.record;
  var user = kintone.getLoginUser();
  var workerName = user.name;
  var hiduke = “2018-04-24”;  //Get_hiduke();
  var Table = record[“入力テーブル”];
  var Table_name = “入力テーブル”;
  //console.log(Table);
  var i = 0;
  var ii = 0;
  var Low = Table.value[ii].value;
  var work = Low[“設定表示名_”+(i+1)].value;
  var work_f =   “作業名_”+(i+1);
  var worker_f = “作業者名_”+(i+1);
  var workday_f = “作業日_”+(i+1);
  var body = {
        “app”: kintone.app.getId(),
        “id”: kintone.app.record.getId(),
        “record”: {
            Table_name: {
                “value”: [{
                    “id”: i+1, //行
                    “value”: {
                      work_f: {“value”:work},
                      worker_f: {“value”: workerName},
                      workday_f: {“value”: hiduke}
                    }
                }]
            }
        }
  };
  console.log(body);
  return new kintone.Promise(function(resolve, reject) {
      kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body,function(resp) {
            console.log(resp);
            resolve(event);
      }, function(error) {
            console.log(error);
            resolve(event);
      });
  });
}

(function () {
  “use strict”;
    kintone.events.on([‘app.record.detail.show’,‘mobile.app.record.detail.show’], function(event) {
      touroku(event);
    });
})();

阿部 謙二さん

var i = 0;
var ii = 0;
var Low = Table.value[ii].value;
var work = Low[“設定表示名_”+(i+1)].value;
var work_f = “作業名_”+(i+1);
var worker_f = “作業者名_”+(i+1);
var workday_f = “作業日_”+(i+1);

↑のコードではvar work ~の行がエラーになっていると思うのですが、一度下記の記事を参考にデバッグしていただきたいのと、
https://developer.cybozu.io/hc/ja/articles/207613916
実装したい機能はどのような機能でしょうか?
・テーブル一行目に初期値を挿入したい。
などなどあると思うのでそちらを教えていただければお答えできるかもしれません。

HANSA様

ご連絡ありがとうございます。詳細の記載が無かった件、申し訳ありません。初めての質問で、よくわかっていませんでした。

 

実装したい機能は、決裁情報の印刷です。

プロセス管理を使用して決裁を行い、承認者、承認者の役職および承認日時を印字したいのですが、使用している「RepotoneU PRO」では決裁情報は印刷できないとのことでした。

また、印刷したい決裁情報は特定のステータスのみですので、次の手順で決裁情報を集めることとしました。

1.予めテーブルを用意する。

フィールド(コード)は①設定_ステータス_(行数) (プロセス管理上のステータスとの照合用)(例:課長承認中)

           ②設定\_表示名\_(行数)  (印字用のステータス)(例:課長)

           ③作業名\_(行数)

           ④作業者名\_(行数)

           ⑤作業日\_(行数)

2.予め入力しておくことができないため、新規作成時に、jsで①②のフィールドが入力されるようにしています。

3.決裁時に、①のステータスが一致した場合、「②のフィールドを③にコピー&④⑤を入力」されるようにしたい。

となります。

モバイル端末を考える前の段階では承認時のイベントを使用し、問題なく動作していました。

モバイル端末の利用もあり得ることから、承認時のイベントが使用できず、承認後に表示される詳細画面の表示イベントに切り替えました。

これにより、ステータス変更の確認と、apiでの登録が必要となりましたが、この内「apiでの登録」がうまくできませんでした。

質問と関係ない部分が多くなってしまうことから、かなり省略して掲載させて頂きましたが、apiリクエストに関係する部分を残そうと思い、中途半端になっていたことから、そのままでは検証できないコードになってしまっていました。

大変申し訳ありませんが、テーブルとそのフィールドを設定し、②のフィールドは値を入力して頂くことでご指摘のエラーはなくなります。

問題点の指摘だけでも頂ければと思い、安易に質問してしまいましたが、もう一度、リクエストのbodyの問題か、同期実行の問題かを切り分けてから、改めて、この質問の続きに投稿させて頂きます。

先ほどの投稿の補足

印字したいステータスは特定の、複数のステータスとなります。

動作を確認したところ、bodyの指定の際、フィールドコードを変数にすると登録ができないことがわかりました。

検証しやすいように修正したコードは以下の通りとなります。

 

function touroku(event){
  var record = event.record;
  var user = kintone.getLoginUser();
  var workerName = user.name;
  var hiduke = “2018-04-24”;  //Get_hiduke();
  var field = “文字列__1行_”;
  //console.log(Table);
  var body = {
        “app”: kintone.app.getId(),
        “id”: kintone.app.record.getId(),
        “record”: {
            field: {
                “value”:workerName
            }
        }
  };
  console.log(body);
  return new kintone.Promise(function(resolve, reject) {
      kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body,function(resp) {
            console.log(resp);
            resolve(event);
      }, function(error) {
            console.log(error);
            resolve(event);
      });
  });
}

(function () {
  “use strict”;
    kintone.events.on([‘app.record.detail.show’,‘mobile.app.record.detail.show’], function(event) {
      touroku(event);
    });
})();

新規アプリに文字列一行のフィールドを置けば動作しますが、登録はできません。

bodyの指定の際の変数「field」を直接「文字列__1行_"」と入力すれば登録ができます。

 

ここで改めてご質問となるのですが、このフィールドコードを変数で使用することは可能でしょうか。

可能でしたら、方法を教えていただけると助かります。

26日の18:44の投稿に誤りがありました。

テーブルのフィールドコードは、

設定_ステータス_(行数)

ではなく

設定_ステータス_(テーブル数)

でした。

1つのテーブルで、行数によりフィールドコードを変えることはできないです。

このように複数の決裁データ印刷用のテーブルを設けている理由は、プロセス管理上で、事前と事後等、申請者に戻った後で改めて申請するアプリが多くあるからです。

阿部さん

詳細にありがとうございます。

再度になりますが、bodyの問題か、非同期処理の問題かの切り分けのためにも、一度デバッグして頂くのが正確です。
https://developer.cybozu.io/hc/ja/articles/207613916

ですが、読み返してみて、1点最初の投稿のコードで気になった点があります。

var body = {
    “app”: kintone.app.getId(),
    “id”: kintone.app.record.getId(),
    “record”: {
        Table_name: {
            “value”: [{
                “id”: i+1, //行
                “value”: {
                    work_f: {“value”:work},
                    worker_f: {“value”: workerName},
                    workday_f: {“value”: hiduke}
                }
            }]
        }
    }
};

こちらのbodyですが、「Table_name」の部分は変数で持たせるのであれば[]で囲う必要があります。

HANSA様

大変助かりました。ありがとうございます。

サンプルの動作を確認した後、本番用はテーブルの他の行への対応が必要であったことから、動的に作成する方法を調べて実装してていたことで、返信が遅れました。

 

おかげさまで予定していた動作をすることができました。

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