別アプリへのレコード一括登録処理で、エラーでも最後まで処理を続ける方法

何を実現したいのかを書きましょう

レコード一覧画面でボタン押下時に、表示されているレコード全てを別アプリにコピーしたいです。ですがエラーが起きるとそこでエラー処理に行き終了してしまうので、処理を終わらせずに次のレコードから続けてコピーを行う方法は無いでしょうか?
もしあるのでしたら、コードまで教えていただけると大変助かります。

発生した問題やエラーメッセージを具体的に書きましょう

コピー先アプリのフィールドAは「値の重複を禁止する」設定になっているため、同じレコード内容だとエラーになりコンソールのメッセージには「値がほかのレコードと重複しています。」と表示され、コピー処理はそこで終了します。
このままですと、何度押下しても処理が止まってコピーできないレコードが出てきますので、キー重複のレコードがあったら次のレコードに移動して処理を続けるということはできないでしょうか?

実行したコードをコピー&ペーストしましょう

( function() {
  'use strict';

    // レコード一覧画面表示後イベント
    kintone.events.on( 'app.record.index.show', (event) => {
  
      const records = event.records;
  
      // ヘッダースペース要素
      const headerSpace = kintone.app.getHeaderMenuSpaceElement();
      if (headerSpace) {
        // 既存の子要素を全て削除
        while (headerSpace.firstChild) {
          headerSpace.removeChild(headerSpace.firstChild);
        }
      }
  
      // ボタン要素
      const button = document.createElement("input");
      button.value = "一括登録";
      button.type = "button";

      // ボタン作成
      headerSpace.appendChild(button);
      
      // ボタンクリック処理
      const click = function() {

        const postRec = [];

        // 取得したレコード分ループ
        records.forEach( function(eachRec) {

          postRec.push({
            "フィールドA": {value: eachRec.フィールドA.value},
            "フィールドB": {value: eachRec.フィールドB.value},
          });
        });

        // 転記先のアプリID設定
        const appId = 777;

        const postParams = {
          app: appId,
          records: postRec
        };
  
        kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', postParams, (resp) => {
          // 正常
          console.log(resp);
        }, (error) => {
          // エラー
          console.log(error);
        });
      };

      // ボタンのクリック処理
      button.onclick = click;

    });
  })();

mizunoさん、こんにちは。

残念ながら、複数のレコードを操作する /k/v1/records.json APIでは、エラー発生時にすべての処理をフォールバックするようになっているようです。

そのため、「取得したレコード分ループ」のforEach文の中で、1件のレコードを操作する /k/v1/record.json APIを使って繰り返し操作する必要があるように感じます。

※ 1件ごとにAPIリクエストがカウントされるので、上限に気を配る必要がありますが…

なお、10件や50件単位で /k/v1/records.json APIでレコードを登録し、エラーがあればそのブロックだけ /k/v1/record.json API で1件ずつ登録してみる、といった処理も考えられます。

また、そもそもコピー元アプリ側でレコードを追加する際に、コピー先アプリのフィールドAで重複が発生しないかチェックすることでも防げるかもしれません。

エラー発生頻度と、APIリクエスト数の余裕、本カスタマイズの実行頻度などを考慮してご検討ください。。。

余談ですが、手動で(kintoneの画面上から)CSVに書き出し、コピー先アプリに新しい読み込み形式で読み込むことで、エラーが発生しても処理を続行させることは可能と考えられます。

方法としては2つあるかなとおもいます

  1. 複数のレコードを登録するAPIを使わず1件のレコードを登録するAPIを使う
    • 一括で登録しようとすると一つエラーがあると処理がされない(ロールバックされる)のは仕様で、そこを変えることはできません。
    • なので、1件ずつレコードを処理することでその問題を回避するイメージです。(エラーがあってもダイアログに表示するに留め、処理は進めるなど)
    • デメリットとして、1件ずつ処理するので処理に時間がかかってしまう傾向なのと、APIコール数が増えてしまうことがあるかなとおもいます
  2. 先にエラーになりそうなものを除去したうえで一括で登録する
    • 重複でエラーになる、ということなので先にそのデータの精査を行うイメージです。
    • 複数のレコードを取得するAPIでレコードの検索ができるので、コピー先アプリのフィールドAに登録される情報が1件でもあるかを確認し、ある場合は登録しないようにします
    • こっちのほうが処理も早くAPIコール数も下げれはすると思います。

だいちゃん ご返信ありがとうございます。
メリット・デメリット・そしてアドバイスをしていただき、大変助かります!

このAPIですとエラーはどうすることもできませんか…。
APIリクエストのカウントの事もありましたね…考えていませんでした。
CSV含め、他の方法を考慮してやってみることにします。
ありがとうございました!

1 Like

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

方法をあげていただいた上での考えられる問題点、更に対策を提案していただきありがとうございます!
分かりやすくリンクまではっていただきありがとうございます。
この処理が行われる量や回数を考えたうえで、エラー問題の対策をしてみようと思います。
大変助かりました。ありがとうございます!

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