お世話になります。
【実装したいこと】
①レコード一覧画面にボタンを設置
②ボタンをクリックでレコード一覧を取得
③取得したレコードを一括削除したい
上記のようなプログラムが可能か?可能であれば方法についてご教授頂きたいです。
当方開発初心者のため、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 をつかって、
getAllRecords をつかって対象のものを全件取得
1で取得したレコードからレコード番号だけとりだし配列化する
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);
});
})();
よかったです、学習大変だとおもいますが、がんばってください!!!!
system
(system)
クローズされました:
2024 年 9 月 9 日午前 6:05
9
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。