レコード一覧を取得し、一括削除したい

お世話になります。

【実装したいこと】
①レコード一覧画面にボタンを設置
②ボタンをクリックでレコード一覧を取得
③取得したレコードを一括削除したい

上記のようなプログラムが可能か?可能であれば方法についてご教授頂きたいです。
当方開発初心者のため、kintone API ドキュメント等からコードをコピーし加工させて頂いております。

【試したコード】

 

  (function() {
      "use strict";
      kintone.events.on('app.record.index.show', function(event) {
          if (document.getElementById('my_index_button_01') !== null) {
              return;
          }
  //①レコード一覧画面にボタンを設置
          var myIndexButton = document.createElement('button');
          myIndexButton.id = 'my_index_button_01';
          myIndexButton.innerText = '一括削除ボタン';//ボタンの表示文字
  //②ボタンをクリックでレコード一覧を取得
          // ボタンクリック時の処理
          myIndexButton.onclick = function() {
              //レコードの一括取得
              const body = {
                  'app': kintone.app.getId(),
                  'fields': ['レコード番号'],
                };
              kintone.api(kintone.api.url('/k/v1/records/cursor.json', true), 'POST', body, (resp) => {
                  // success
                  console.log(resp);
  //③取得したレコードを一括削除したい
  //ここから
                  //レコードの一括削除
                    const body2 = {
                      'app': kintone.app.getId(),
                      'ids': (resp),
                      //'revisions': [1, 4]
                  };
                  kintone.api(kintone.api.url('/k/v1/records.json', true), 'DELETE', body2, (resp2) => {
                      // success
                      console.log(resp2);
                      }, (error) => {
                      // error
                      console.log(error);
                  });
  //ここまで
              }, (error) => {
                  // error
                  console.log(error);
              });            
          };
          kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
      });
  })();

②までは大丈夫そうなのですが、
②の配列(?)を③に引き渡す方法がイマイチよく分からず、
うまくいっていないようです。

【コンソールエラー】

DELETE https://h0hod.cybozu.com/k/v1/records.json 400 (Bad Request)

{
    "code": "CB_IJ01",
    "id": "uzAovNW7LyXV7X4x7KIL",
    "message": "不正なJSON文字列です。"
}

(コンソールエラーの内容はこのあたりで大丈夫でしょうか?)

③削除は一括ではなさそうなので、
②のデータをループして削除するようにした方がいいのでしょうか?
このあたりご教授頂けると幸いです。
以上、よろしくお願いいたします。

全件ということであれば、コードにあるようにCursorを使うことになりちょっと大変なので…

 

rest api clientをつかって、

  1. getAllRecordsをつかって対象のものを全件取得
  2. 1で取得したレコードからレコード番号だけとりだし配列化する
  3. deleteAllRecordsを使って(2で抽出したIDをパラメータに渡し)、全件削除

の流れが楽かなぁと思いました。

コードとしてはここらへんが参考になる、かもです

>村濱一樹様

アドバイスありがとうございます!
教えて頂いたこちらのページを参考にコード再構成してみたのですが、
getAllRecordsの使い方がイマイチつかめず、うまくいきませんでした。

【試したコード】

    (function() {
        "use strict";
        kintone.events.on('app.record.index.show', function(event) {
            if (document.getElementById('my_index_button_01') !== null) {
                return;
            }
    //レコード一覧画面にボタンを設置
            var myIndexButton = document.createElement('button');
            myIndexButton.id = 'my_index_button_01';
            myIndexButton.innerText = '一括削除ボタン';//ボタンの表示文字

            // ボタンクリック時の処理
            myIndexButton.addEventListener("click", async (event) => {

    //1.getAllRecordsをつかって対象のものを全件取得
                const client = new KintoneRestAPIClient();
                const res = await client.record.getAllRecords({ app: appId });
                const obj = kintone.app.record.get();

    //2.1で取得したレコードからレコード番号だけとりだし配列化する     
                // 取得レコードのレコード番号
                const ids = [];
                console.log(ids.value);

    //3.deleteAllRecordsを使って(2で抽出したIDをパラメータに渡し)、全件削除
                //レコード削除

                //const client = new KintoneRestAPIClient();
                const recs = [];
                text_all.value.split(",").forEach((r) => {
                  recs.push({ id: r });
                });
                const res_dell = await client.record.deleteAllRecords({
                  app: appId,
                  records: recs,
                });
            });

            kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
        });
    })();

【コンソールエラー】

Uncaught (in promise)
ReferenceError: KintoneRestAPIClient is not defined
    at HTMLButtonElement.<anonymous> 

再度アドバイス頂けないでしょうか?
お忙しいところ恐縮ですがよろしくお願いいたします。

>ReferenceError: KintoneRestAPIClient is not defined

とのことなのでrest api clientが読み込めてないのだと思われます

https://developer.cybozu.io/hc/ja/articles/900000767263-kintone-JavaScript-Client-kintone-rest-api-client-#usage

こちらの導入方法(ブラウザ)からご確認ください

村濱一樹様

何度も見て頂き、ありがとうございます。
rest api clientの読み込みを行い、以下のコードで全件削除できました!

    (function() {
        "use strict";
        kintone.events.on('app.record.index.show', function(event) {
          if (document.getElementById('my_index_button_01') !== null) {
                return;
            }
    //レコード一覧画面にボタンを設置
            var myIndexButton = document.createElement('button');
            myIndexButton.id = 'my_index_button_01';
            myIndexButton.innerText = '一括削除ボタン';//ボタンの表示文字

            // ボタンクリック時の処理
            myIndexButton.addEventListener("click", async (event) => {
                //アラート
                alert("既存データ削除します。");

    //1.getAllRecordsをつかって対象のものを全件取得
                const client = new KintoneRestAPIClient();
                const appId = kintone.app.getId();
                const res = await client.record.getAllRecords({ app: appId });
                const obj = kintone.app.record.get();
                const tblRecords = [];

    //2.1で取得したレコードからレコード番号だけとりだし配列化する     
                // 取得レコードのレコード番号
                const ids = [];
                res.forEach((r) => {
                  ids.push(r.$id.value);
                  tblRecords.push({
                    id: null
                  });
                });
                  // テキストボックスに取得レコード番号をカンマ区切りで入力する
                const text_all = new Kuc.Text({
                    //placeholder: "レコードID(,区切り)",
                  });
                text_all.value = ids.join(",");
                console.log(text_all.value);

    //3.deleteAllRecordsを使って(2で抽出したIDをパラメータに渡し)、全件削除
                //レコード削除

                //const client = new KintoneRestAPIClient();
                const recs = [];
                text_all.value.split(",").forEach((r) => {
                  recs.push({ id: r });
                });
                const res_dell = await client.record.deleteAllRecords({
                  app: appId,
                  records: recs,
                });
                
            //リロード
            location.reload();
            //アラート
          alert("既存データ削除しました。");            
          });
            kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
        });
  })();

実行時に以下の2つのコンソールエラーがでているのが気になります。
このままでも大丈夫でしょうか?

xhr.js:220          POST https://h0hod.cybozu.com/k/v1/bulkRequest.json 400 (Bad Request)

Uncaught (in promise) KintoneAllRecordsError: 0/1 records are processed successfully
    at RecordClient._callee17$ (RecordClient.ts:568:13)
    at tryCatch (index.ts:42:8)
    at Generator._invoke (index.ts:42:8)
    at Generator.throw (index.ts:42:8)
    at asyncGeneratorStep (index.ts:42:8)
    at _throw (index.ts:42:8)

ご教授いただければ幸いです。よろしくお願いいたします。

そのエラー気になりますね。。。対象のものを全件消せてるなら、問題なさそうですが。。

全件取得と全件削除、どちらでエラーでてるかをまず整理したほうが良いかと思います。

 

また、    //2.1で取得したレコードからレコード番号だけとりだし配列化する     というところと削除ですが、下記のようにできます
(削除のためだけなら、一度テキストボックスに置く必要はない、といういみです)
参考

const targetRecords = res.map((r) => { // idだけ抽出(mapは、ある配列から新しい配列を作る機能です)
return {
id: r.$id.value,
};
});
constres_dell =awaitclient.record.deleteAllRecords({
                 app: appId,
                 records: targetRecords,
              });

村濱一樹様

ありがとうございます!
教えて頂いたコードに書き替え、実行してみたところエラーも出ず成功しました!
サンプルコードのつぎはぎで、きちんと理解できていない部分もあり、
直したいけど、直し方が分からない状態だったので大変助かりました。
改めてありがとうございました!

記録として、全コード残しておきます。

    (function() {
        "use strict";
        kintone.events.on('app.record.index.show', function(event) {

            if (document.getElementById('my_index_button_01') !== null) {
                return;
            }
    //レコード一覧画面にボタンを設置
            var myIndexButton = document.createElement('button');
            myIndexButton.id = 'my_index_button_01';
            myIndexButton.innerText = '一括削除ボタン';//ボタンの表示文字

            // ボタンクリック時の処理
            myIndexButton.addEventListener("click", async (event) => {
                //アラート
                alert("既存データ削除します。");

    //1.getAllRecordsをつかって対象のものを全件取得
                const client = new KintoneRestAPIClient();
                const appId = kintone.app.getId();
                const res = await client.record.getAllRecords({ app: appId });
                const obj = kintone.app.record.get();
                const tblRecords = [];

    //2.1で取得したレコードからレコード番号だけとりだし配列化する     
                // 取得レコードのレコード番号
                const targetRecords = res.map((r) => {  //  idだけ抽出(mapは、ある配列から新しい配列を作る機能です)
                  return {
                  id: r.$id.value,
                  };
                });

    //3.deleteAllRecordsを使って(2で抽出したIDをパラメータに渡し)、全件削除
                //レコード削除
                const res_dell = await client.record.deleteAllRecords({
                  app: appId,
                  records: targetRecords,
                });
                
            //リロード
            location.reload();
            //アラート
            alert("既存データ削除しました。");
            
            });

            kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
        });
    })();

 

よかったです、学習大変だとおもいますが、がんばってください!!!!

 

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