別アプリへ入力、登録したレコードから計算後のフィールド値を取得したい

背景・実現したいこと

アプリAへ入力した値をアプリBへ転記・計算させ登録したレコードから計算後のフィールド値を取得したいのですが、kintoneで実装可能でしょうか?

 

 

G.Qさん

こんにちは。

 

標準ではできないので、JavaScriptでカスタマイズするしかないと思います。

REST APIを使う必要があります。

APIの使い方や詳細は、当サイト上部にある「チュートリアル」または「APIドキュメント」も合わせてご覧ください。

 

流れとしては

①:アプリAからアプリBに対してPOST(登録)

②:①のレスポンスを受けた後、アプリBに登録したレコードをGET(取得)

③:②でGETしたレコードのフィールド情報をアプリA(自レコード)に入力

 

アプリAのレコード編集画面から①を実行するのであれば上記の流れになりますが

レコード登録後の詳細画面から①を実行するのであれば、③は自レコードへのPUT(更新)が必要です。

koichiさん

返信ありがとうございます。

上記通りまずはPOSTを試しているのですがうまくいきません。

初心者質問で申し訳ありません。ご教授よろしくお願いします。

(function() {
    "use strict";
    kintone.events.on('app.record.detail.show', function(event) { 
        // アプリIDの取得
        var appId =  event.appId;
        // レコード番号の取得
        var recordId = event.recordId;
        // リクエストプロパティ(JSON)
    var spp1 = event.record['テーブル_0']['value'][0]['value']['単重1']['value']
    var spp2 = event.record['テーブル_0']['value'][0]['value']['単重2']['value']
        var params = {
          "app": 420,  // ← 参照ログを格納するアプリのIDに書き換えてください
            "record": {
              "単重1": { "value": spp1 },
              "単重2": { "value": spp2}
            }
      };
        // kintone REST API リクエスト ~ レコードの登録(POST)
        kintone.api(
            kintone.api.url('/k/v1/record', true), // - pathOrUrl
            'POST',                                // - method
            params,                                // - params
            function(resp) {                       // - callback
                // (特に何もしない)
            },
            function(resp) {                       // - errback
                // (特に何もしない)
            }
        );
    });
})();

G.Qさん

ご確認ありがとうございます。

 

見た感じは問題ないように思うのですが、APIの処理後にconsole.logを入れて

ブラウザのデベロッパーツールで確認ください。

 

デバッグ方法は以下にも合わせてご覧ください。

https://developer.cybozu.io/hc/ja/articles/207613916

kintone.api(
kintone.api.url('/k/v1/record', true), // - pathOrUrl
'POST',                                // - method
params,                                // - params
function(resp) {                       // - callback
console.log(resp);
},
function(error) {                       // - errback
console.log(error)
}
);

 

koichiさん

返信ありがとうございます。

上記試しましたが、レコードの登録はできましたが、フィールドへの書き込みが

できていません。原因は何が考えられますか?

 

G.Qさん

最初の投稿の画像を改めて拝見して、書き込み先のフィールドは自動計算フィールドでしょうか?

自動計算されるフィールドには、書き込みができません(自動計算結果で上書きされます)。

そのため、自動計算しない別のフィールドに書き込みし、それを自動計算フィールドで参照する必要あります。

 

自動計算フィールドでなければ、また別のところに問題がありますが、まずは上記ご確認ください。

koichiさん

自動計算フィールドだったので、上記通りに行えば書き込みできるようになりました。ありがとうございました。

(function() {
  "use strict";
  kintone.events.on('app.record.detail.show', function(event) { 
      // アプリIDの取得
      var appId =  event.appId;
      // レコード番号の取得
      var record = event.record;
      console.log(event);
      //var yt = record['閲覧アプリID']['Value']
      // リクエストプロパティ(JSON)
      var params = {
          "app": 420,  // ← 参照ログを格納するアプリのIDに書き換えてください
          "record": {
             "日付": { "value": event.record.日付 },
              "計量機No": { "value": event.record.計量機No },
              "連番": { "value": event.record.receipts.value[0].value.no.value },
              "担当者1": { "value": event.record.担当者1 },
              "担当者2": { "value": event.record.担当者2 },
              "サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
              "めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
              "単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
              "単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
              "個数1A": { "value": event.record.receipts.value[0].value.個数.value },
              "形態": { "value": event.record.receipts.value[0].value.形態.value },
              
          }
      };

      // kintone REST API リクエスト ~ レコードの登録(POST)
      kintone.api(
          kintone.api.url('/k/v1/record', true), // - pathOrUrl
          'POST',                                // - method
          params,                                // - params
          function(resp) {                       // - callback
              // (特に何もしない)
          },
          function(resp) {                       // - errback
              // (特に何もしない)
          }
      );
  });
})();

ただ項目を増やしたせいか下記のエラーが出るようになりました。

エラー解除するには、減らすしかないのでしょうか?

{"code":"CB_JH01","id":"YtybBDsr6ANumeyo6VdR","message":"認証に失敗しました。セッション認証には、「X-Requested-With」
ヘッダーが必要です。"}

G.Qさん
日付、計量機No、担当者の末尾にvalueがないことが原因かと思います。
まずは、そちらを修正してみてください。

koichiさん

初歩的なミスで申し訳ないです。

上記、修正で無事全て登録できるようになりました。

本当にありがとうございます。

ただ次にアプリBで計算させた値を取得して書き込みたいのですが

うまくいきません。書き方が根本的に間違えていますでしょうか?

(function() {
  "use strict";
  kintone.events.on('app.record.detail.show', function(event) { 
      // アプリIDの取得
      // レコード番号の取得
      console.log(event);
      // リクエストプロパティ(JSON)
      var params = {
          "app": 420,  
          "record": {
             "日付": { "value": event.record.日付.value },
              "計量機No": { "value": event.record.計量機No.value },
              "連番": { "value": event.record.receipts.value[0].value.no.value },
              "担当者1": { "value": event.record.担当者1.value },
              "担当者2": { "value": event.record.担当者2.value },
              "サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
              "めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
              "単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
              "単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
              "個数1A": { "value": event.record.receipts.value[0].value.個数.value },
              "形態": { "value": event.record.receipts.value[0].value.形態.value },
              
          }
      };

      var getvalue = {
        "app": 418,  
        "record": {
           "単重計算後": { "value": event.record.単重計算後.value },
            
        }
    };

      // kintone REST API リクエスト ~ レコードの登録(POST)
      kintone.api(
          kintone.api.url('/k/v1/record', true), // - pathOrUrl
          'POST',                                // - method
          params,
          getvalue,                                // - params
          function(resp) {                       // - callback
              // (特に何もしない)
          },
          function(resp) {                       // - errback
              // (特に何もしない)
          }
      );
    });
})();

G.Qさん

1回のkintone.apiリクエストでは、全てを実装できないので

今回の場合は、3回に分けて実行する必要があります。

 

①登録先アプリへの登録(POST)

②登録先アプリに登録したレコードの取得(GET)

③取得したレコード情報を自レコードに更新(PUT)

 

大まかな流れで書くと以下のようなコードになります。

POSTが成功したらGET、GETが成功したらPUTという流れです。

(function() {

    'use strict';

    kintone.events.on('app.record.detail.show', function(event) {
        // アプリIDの取得
        // レコード番号の取得
        console.log(event);

        // POSTリクエストプロパティ(JSON)
        var params = {
            "app": 登録先アプリ番号,
            "record": {
              "フィールド1": { "value": "値" },
              "フィールド2": { "value": "値" },
              "フィールド3": { "value": "値" },
            }
        };

        // kintone REST API リクエスト ~ レコードの登録(POST)
        kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
            // POST成功

            // GETリクエストプロパティ(JSON)
            var params = {
                "app": 登録先アプリ番号,
                "id": resp.id    // POSTした結果のレコード番号
            };

            // kintone REST API リクエスト ~ レコードの取得(GET)
            kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
                // GET成功

                // PUTリクエストプロパティ(JSON)
                var params = {
                    "app": 自アプリ番号,
                    "id": kintone.app.record.getId(), // 自レコード番号
                    "record": {
                       "フィールド1": { "value": resp.フィールド1.value },
                       "フィールド2": { "value": resp.フィールド2.value },
                       "フィールド3": { "value": resp.フィールド3.value },
                    }
                };

                // kintone REST API リクエスト ~ レコードの更新(PUT)
                kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
                    // PUT成功

                }, function(error) {
                    // PUTエラー
                });

            }, function(error) {
                // GETエラー
            });

        });

    }, function(error) {
        // POSTエラー
    });

})();

koichiさん

返信ありがとうございます。

上記、試してみましたが、下記のエラーが出ました。

登録先から取得したいフィールドが、計算フィールドなので

取得できませんか?

(function() {
  "use strict";
  kintone.events.on('app.record.detail.show', function(event) { 
      // アプリIDの取得
      // レコード番号の取得
      console.log(event);
      // リクエストプロパティ(JSON)
      var params = {
          "app": 420,  
          "record": {
             "日付": { "value": event.record.日付.value },
              "計量機No": { "value": event.record.計量機No.value },
              "連番": { "value": event.record.receipts.value[0].value.no.value },
              "担当者1": { "value": event.record.担当者1.value },
              "担当者2": { "value": event.record.担当者2.value },
              "サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
              "めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
              "単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
              "単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
              "個数1A": { "value": event.record.receipts.value[0].value.個数.value },
              "形態": { "value": event.record.receipts.value[0].value.形態.value },
              
          }
      };

     
        // kintone REST API リクエスト ~ レコードの登録(POST)
        kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
          // POST成功

          // GETリクエストプロパティ(JSON)
          var params = {
              "app": 420,
              "id": resp.id    // POSTした結果のレコード番号
          };

          // kintone REST API リクエスト ~ レコードの取得(GET)
          kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
              // GET成功

              // PUTリクエストプロパティ(JSON)
              var params = {
                  "app": 418,
                  "id": kintone.app.record.getId(), // 自レコード番号
                  "record": {
                      "receipts.value[0].value.単重計算後": { "value": resp.event.record.単重計算後.value },
                     // "フィールド2": { "value": resp.フィールド2.value },
                      //"フィールド3": { "value": resp.フィールド3.value },
                  }
              };
              // kintone REST API リクエスト ~ レコードの更新(PUT)
              kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
                  // PUT成功

              }, function(error) {
                  // PUTエラー
              });

          }, function(error) {
              // GETエラー
          });

      });

  }, function(error) {
      // POSTエラー
  });

})();

G.Qさん

respの中はeventは無いので、「resp.record.フィールド名.value」という書き方で良いですよ。

koichiさん

上記直しました。まだ別に問題があるようで、元アプリに計算後の値を取得し書き込みができていません。

また編集画面から保存を押すと下記のエラーが発生するようになりました。

G.Qさん

見落としていました。テーブルへのPUTですね。

テーブルへのPUTパラメータは、テーブル内の全行・全項目を記載しないといけません。

以下ご確認ください。

レコード更新におけるテーブル操作のテクニック

 

また、そちらのエラーが出るということは、PUT処理自体は行われたということです。

「ほかのユーザーがレコードを更新しました」というのが、APIでPUTしたからです。

そのため、PUT処理が成功した後に、画面リロード処理を入れてみてください。

上記、少々語弊がありました。
リンク先にも記載されてますが
更新するセル(フィールド)が決まっていれば、そのセル(フィールド)だけパラメータに渡せば良いです。

他の行は行IDだけ指定すれば良いです。

指定しなかったら行が削除されます。

必ずしも全項目を指定するということではなかったです。

koichiさん

返信ありがとうございます。

上記ですが、添付リンク先を見ながら修正してみましたが

自レコードへの書き込みもなく、編集画面に入ると更新が永久に起こってしまいます。

恐れ入りますが、またご教授いただけないでしょうか。

  // kintone REST API リクエスト ~ レコードの登録(POST)
        kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
          // POST成功

          // GETリクエストプロパティ(JSON)
          var params = {
              "app": 420,
              "id": resp.id    // POSTした結果のレコード番号
          };

          // kintone REST API リクエスト ~ レコードの取得(GET)
          kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
              // GET成功

              // PUTリクエストプロパティ(JSON)
              var params = {
                  "app": 418,
                  "id": kintone.app.record.getId(), // 自レコード番号
                  "record": {
                      "receipts.value[0].value.単重計算後.value": { "value": resp.record.単重計算後.value },
                     // "フィールド2": { "value": resp.フィールド2.value },
                      //"フィールド3": { "value": resp.フィールド3.value },
                  }
              };
              // kintone REST API リクエスト ~ レコードの更新(PUT)
              kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
                   location.reload();
     
                  // PUT成功

              }, function(error) {
                  // PUTエラー
                  
              });

          }, function(error) {
              // GETエラー
          });

      });

  }, function(error) {
      // POSTエラー
  });

})();

G.Qさん

更新対象のテーブルの全行を下記のように配列化しないといけません。

GETした情報を1行目に更新すると想定した書き方です。2行目以降は更新しません。

var putArray = [];
for (var i = 0; i < receipts.value.length; i++) {
  if (i == 0) {
    // 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
    putArray.push({
      "id": receipts.value[i].id,
      "value": {
        "単重計算後": {
          "value": resp.record.単重計算後.value
        }
     }
    });
  } else {
    // 2行目以降は更新しない(更新しない場合は行idのみ指定)
    putArray.push({
      "id": receipts.value[i].id,
    });
  }
}

// PUTリクエストプロパティ(JSON)
var params = {
  "app": 418,
  "id": kintone.app.record.getId(), // 自レコード番号
  "record": {
    "receipts": putArray
  }
};

 

 

画面リロードの件、こちらの処理は「app.record.detail.show」での実行でしたね。

無限ループしてしまいますので、一旦外してください。

 

根本からの見直しが必要になりますが

処理的に問題なければ「app.record.create.submit」「app.record.edit.submit」で実行した方が良いですね。

但し、同期処理が必要になりますので、kintone.Promiseまたはawait/asyncを使って、保存処理を待機する必要があります。

目指せ!JavaScriptカスタマイズ中級者(2) 〜Promiseのかわりにasync/await編〜

koichiさん

上記はこのような形になりますか?

添付写真のようにエラーが発生し、保存、更新ができません。

(function() {
  "use strict";
  kintone.events.on('app.record.create.submit', 
                    'app.record.edit.submit',
  async function(event) { 
      // アプリIDの取得
      // レコード番号の取得
      console.log(event);
      // リクエストプロパティ(JSON)
      var params = {
          "app": 420,  
          "record": {
             "日付": { "value": event.record.日付.value },
              "計量機No": { "value": event.record.計量機No.value },
              "連番": { "value": event.record.receipts.value[0].value.no.value },
              "担当者1": { "value": event.record.担当者1.value },
              "担当者2": { "value": event.record.担当者2.value },
              "サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
              "めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
              "単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
              "単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
              "個数1A": { "value": event.record.receipts.value[0].value.個数.value },
              "形態": { "value": event.record.receipts.value[0].value.形態.value },
              
          }
      };

     
        // kintone REST API リクエスト ~ レコードの登録(POST)
        kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
          // POST成功

          var putArray = [];
          for (var i = 0; i < receipts.value.length; i++) {
            if (i == 0) {
              // 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
              putArray.push({
                "id": receipts.value[i].id,
                "value": {
                  "単重計算後": {
                    "value": resp.record.単重計算後.value
                  }
               }
              });
            } else {
              // 2行目以降は更新しない(更新しない場合は行idのみ指定)
              putArray.push({
                "id": receipts.value[i].id,
              });
            }
          }
          
          // PUTリクエストプロパティ(JSON)
          var params = {
            "app": 418,
            "id": kintone.app.record.getId(), // 自レコード番号
            "record": {
              "receipts": putArray
            }
          };              // kintone REST API リクエスト ~ レコードの更新(PUT)
              kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
                   location.reload();
     
                  // PUT成功

              }, function(error) {
                  // PUTエラー
                  
              });

          }, function(error) {
              // GETエラー
          });

    

  }, function(error) {
      // POSTエラー
  });

})();

G.Qさん

 

そちらのエラーは、edit.jsの258行目に「a」という変数が定義されていないというエラーですが

ひとまず以下を変更してみてください。

 

async/awaitを使用する場合は、各kintone.apiの前に「await」を付けることで同期処理になります。

 

「app.record.create.submit」「app.record.edit.submit」イベント内で処理する場合は、PUT処理は不要になります。

①POST

②GET

③テーブルの指定値を上書き

event.record.receipts.value[0].value.単重計算後.value = resp.record.単重計算後.value;

 

修正内容が二転三転してすみません。

koichiさん

上記直してみましたが、やはりうまくいきません。

POSTもできていないので、コードの書き方に誤りがあるのでしょうか。

こちらこそ、ながらくお付き合いいただき、ありがとうございます:bangbang:

(function() {
  "use strict";
  kintone.events.on('app.record.create.submit', 
                    'app.record.edit.submit',
   function(event) { 
      // アプリIDの取得
      // レコード番号の取得
      console.log(event);
      // リクエストプロパティ(JSON)
      var params = {
          "app": 420,  
          "record": {
             "日付": { "value": event.record.日付.value },
              "計量機No": { "value": event.record.計量機No.value },
              "連番": { "value": event.record.receipts.value[0].value.no.value },
              "担当者1": { "value": event.record.担当者1.value },
              "担当者2": { "value": event.record.担当者2.value },
              "サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
              "めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
              "単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
              "単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
              "個数1A": { "value": event.record.receipts.value[0].value.個数.value },
              "形態": { "value": event.record.receipts.value[0].value.形態.value },
              
          }
      };

        // kintone REST API リクエスト ~ レコードの登録(POST)
        await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
          // POST成功

          var putArray = [];
          for (var i = 0; i < receipts.value.length; i++) {
            if (i == 0) {
              // 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
              putArray.push({
                "id": receipts.value[i].id,
                "value": {
                  "単重計算後": {
                    "value": resp.record.単重計算後.value
                  }
               }
              });
            } else {
              // 2行目以降は更新しない(更新しない場合は行idのみ指定)
              putArray.push({
                "id": receipts.value[i].id,
              });
            }
          }
          

           // PUTリクエストプロパティ(JSON)
          var params = {
            "app": 418,
            "id": kintone.app.record.getId(), // 自レコード番号
            "record": {
              "receipts": putArray
            }
          };             
          
          event.record.receipts.value[0].value.単重計算後.value = resp.record.単重計算後.value;

/*           // kintone REST API リクエスト ~ レコードの更新(PUT)
              kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
                   location.reload();


              });
 *//*                   // PUT成功
              }, function(error) {
                  // PUTエラー
                  
              });
 */ 
          }, function(error) {
              // GETエラー
          });

  }, function(error) {
      // POSTエラー
  });

})();