新規投稿
フォローする

カーソルを使った複数レコードの削除について

お世話になっております。
以下のコードにて、カーソルを使った複数レコードの削除を試みたのですがエラーになってしまいます。
解決方法をご教授いただけないでしょうか。
よろしくお願い致します。
 
 
return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'POST', { 'app': 43, 'fields': ['$id'], 'query': query })
      .then(function (resp) {
 
      alert(JSON.stringify(resp));...※①

        // カーソル 'GET'
        return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'GET', { 'id' : resp.id })
      }).then(function (resp2) {
 
      alert(JSON.stringify(resp2));...※②

        // 削除するレコードのレコードID配列を作成
        let ids = [];
        for (let i = 0; i < resp.totalCount; i++) {
          ids.push(resp2.records[i].$id.value);
        };

        // 'DELETE' 実行
        return kintone.api(kintone.api.url('/k/v1/records', true), 'DELETE', { 'app': 43, 'ids': ids });
      }).then(function (resp3) {
 
        alert('正常終了');
        return event;

      }).catch(function (error) {

        alert('異常終了');
        return event;
      });
 

現象としては、※①部分でrespの内容をalert表示させるとidにカーソルidが入っており、totalCountも想定の件数が表示されますが、直後に'異常終了'がalertされます。

※2部分のalert(resp2)は実行されません。

0

6件のコメント

Avatar
y_jedi

こんにちは。

現状、どのような内容のエラーが出ていますか?

動かない?そんな時はデバッグをしてみよう!入門編などの記事を参考にして
エラーの文言を載せていただけると、原因がわかるかもしれません。

0
Avatar
nike

お世話になっております。

教えていただいた記事を元にエラーメッセージを確認したところ、以下のように出力されており

"Uncaught ReferenceError: resp is not defined"

投稿した現象に誤りがあったことがわかりました。

※2部分のresp2はalert表示されておりました。

 

また、エラー箇所については以下の部分だろうということは当たりがつきました。

 // 削除するレコードのレコードID配列を作成
        let ids = [];
        for (let i = 0; i < resp.totalCount; i++) {
          ids.push(resp2.records[i].$id.value);
        };

 

カーソル生成時のrespはカーソルからレコードを取得する'GET'メソッド実行時には参照できないのでしょうか?

0
Avatar
y_jedi

エラーの確認ありがとごうございます。

 for 内の resp.totalCount の指定が間違っていますね。
ご質問の通り、関数内の変数は別の関数で参照することができません。

カーソルAPIの外側に resp を代入するための変数を作成し、POST実行後にrespを代入、
その後GET 実行後に呼び出すという形にすれば、resp.totalCount の値を GET メソッド実行後にも使用できます。

0
Avatar
nike

お世話になっております。

解答いただきましてありがとうございます。

非常にすっきり致しました。

 

実は他のアプリのカスタマイズで以下のようなコードで実行した時は正常に動作したので絶対上手くいくはず!と思い込んで

ハマっておりました。

このように記述するとresp.totalCountが参照できるのはなぜなのでしょう・・・。

 

(function () {
  'use strict';

  // 詳細画面-削除前イベント(PC/モバイル)、一覧画面-削除前イベント
  let excuteEvents = ['app.record.detail.delete.submit', 'mobile.app.record.detail.delete.submit', 'app.record.index.delete.submit'];
  kintone.events.on(excuteEvents, function (event) {

    let record = event.record;
    return kintone.Promise.all([CreatePromiseListForDeleteThisAppRecords(record)])
    .then(function (results) {
      alert('正常終了');
      return;
    }).catch(function () {
      alert('異常終了');
      event.error = '異常終了';
      return;
    });
  });
})();

function CreatePromiseListForDeleteThisAppRecords(record)
{
  let query = '日付 = "' + record.日付.value + '" ';

  // カーソルの作成
  return new kintone.Promise(
    function (resolve, reject) {

      // カーソル生成 'POST'
      kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'POST', { 'app': 43, 'fields': ['$id'], 'query': query },
      function (resp) {

        // カーソル 'GET'
        return kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'GET', { 'id' : resp.id },
        function (resp2) {

          // 削除対象のレコードが存在しない場合は終了
          if (resp.totalCount == 0)
          {
            resolve();
          }

          // 削除するレコードのレコードID配列を作成
          let ids = [];
          for (let i = 0; i < resp.totalCount; i++) {
            ids.push(resp2.records[i].$id.value);
          };

          // 'DELETE' 実行
          return kintone.api(kintone.api.url('/k/v1/records', true), 'DELETE', { 'app': 43, 'ids': ids }, function () { resolve(); }, function () { reject(); });
        }, function() { reject(); });
      }, function() { reject(); });
    }
  );
};
0
Avatar
y_jedi

解決できたようで何よりです。

添付いただいたコードで実行できたのは、
POST の コールバック関数(funtion(resp){} )のなかで、GET の処理を実行しているためです。

.then() を用いたメソッドチェーンでは、POST の処理と GET の処理はそれぞれ別のものになるため
今回のコードでは、POST 時の戻り値である resp を参照できませんでした。

0
Avatar
nike

お世話になっております。

非常にわかりやすい説明ありがとうございます。

コメントいただいた内容でカラクリが理解できました。

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

0
ログインしてコメントを残してください。