# レコード一覧画面からレコード全件更新をしたい

**URL:** <https://community.cybozu.dev/t/topic/1660>\
**Category:** kintone 開発相談\
**Created:** [2023 年 6 月 12 日午後 2:24 UTC](https://community.cybozu.dev/t/topic/1660 "2023-06-12T14:24:07Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account1856](https://avatars.discourse-cdn.com/v4/letter/l/ce7236/32.png) [@Legacy\_Account1856](https://community.cybozu.dev/u/Legacy_Account1856)\
**Post date:** [2023 年 6 月 12 日午後 2:24 UTC](https://community.cybozu.dev/t/topic/1660/1 "2023-06-12T14:24:07Z")

</div>

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

レコード一覧画面から、レコード全件の更新をかけたいのですが、うまくできません…

下記URLを参考にkintone JavaScript Client (@kintone/rest-api-client)を入れて、設定してみましたが、正しく動作しませんでした。  
【kintone】レコードを全件取得する【カスタマイズAPI編】  
[https://yourkinlife.com/kintone-customize-javascript-api-get-all-records/](https://yourkinlife.com/kintone-customize-javascript-api-get-all-records/)

ご教示頂けますと幸いですm(\_ \_)m

```
(function () {
"use strict";
// ボタンクリックイベントのハンドラ

  function handleButtonClick() {
  alert("レコード全件を更新します");
  kintone.events.on(['app.record.index.show'], async event => {
    try {
      // クライアントの作成
      const client = new KintoneRestAPIClient();
      // リクエストパラメータの設定
      const params = {
        app: kintone.app.getId(), // アプリID
        fields: ['$id'], // フィールド
        // condition: '日付 >= TODAY()', // 条件
        orderBy: '日付 asc', // 順番
        withCursor: true // カーソル有無
      };
      // レコードの全件取得
      const resp = await client.record.getAllRecords(params);
      for (let i = 0; i < resp.length; i++) {
        console.log(resp[i].$id);
      }
    } catch (e) {
      console.log(e);
    }
})
}

kintone.events.on("app.record.index.show", function (event) {
// ボタンの作成
const button = document.createElement("button");
button.textContent = "ボタン";
button.addEventListener("click", handleButtonClick);
// レコード一覧画面のヘッダにボタンを追加
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
return event;
});
})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2023 年 6 月 15 日午前 1:22 UTC](https://community.cybozu.dev/t/topic/1660/2 "2023-06-15T01:22:16Z")

</div>

コードの意味を一つずつ理解していきましょう。

```
kintone.events.on("app.record.index.show", function (event) {
  // ボタンの作成
  const button = document.createElement("button");
// 略
button.addEventListener("click", handleButtonClick);

```

「『レコード一覧画面を開いた瞬間』にボタンを作成する処理」を登録し、ボタンをクリックすると

```
  function handleButtonClick() {
    alert("レコード全件を更新します");
    kintone.events.on(['app.record.index.show'], async event => {
// 以下略

```

「『レコード一覧画面を開いた瞬間』にレコードを全件取得する処理」を登録する

という動作になっています。

&nbsp;

kintone.events.on～は「処理を行う」のではなく「指定したイベントで処理を行うことを登録する」という意味なので「レコード一覧画面を開いた時にボタンを設置し、ボタンをクリックするとレコード一覧画面で動作する処理を登録する」では動作しないです（厳密にいえばボタン押下後に＜＞ボタンでページを推移すればイベントが発生するので動きます）。

kintone.events.on～は1つで良いということです。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1856](https://avatars.discourse-cdn.com/v4/letter/l/ce7236/32.png) [@Legacy\_Account1856](https://community.cybozu.dev/u/Legacy_Account1856)\
**Post date:** [2023 年 6 月 16 日午前 5:22 UTC](https://community.cybozu.dev/t/topic/1660/3 "2023-06-16T05:22:13Z")

</div>

mls-hashimoto さま

ご回答、ありがとうございます！

kintone.events.on～を１つに修正しました。

しかし、動作しませんでした…

```
(function () {
  "use strict";
  // ボタンクリックイベントのハンドラ

async function handleButtonClick() {
      try {
        // クライアントの作成
        const client = new KintoneRestAPIClient();
        // リクエストパラメータの設定
        const params = {
          app: kintone.app.getId(), // アプリID
          fields: ['$id'], // フィールド
          condition: '日付 >= TODAY()', // 条件
          orderBy: '日付 asc', // 順番
          withCursor: true // カーソル有無
        };
        // レコードの全件取得
        const resp = await client.record.getAllRecords(params);
        for (let i = 0; i < resp.length; i++) {
          console.log(resp[i].$id);
    alert("レコード全件を更新しました");
        }
      } catch (e) {
        console.log(e);
     }
  // })  
}

kintone.events.on("app.record.index.show", function (event) {
  // ボタンの作成
  const button = document.createElement("button");
  button.textContent = "ボタン";
  button.addEventListener("click", handleButtonClick);
  // レコード一覧画面のヘッダにボタンを追加
  kintone.app.getHeaderMenuSpaceElement().appendChild(button);
  return event;
});
})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2023 年 6 月 16 日午前 5:46 UTC](https://community.cybozu.dev/t/topic/1660/4 "2023-06-16T05:46:44Z")

</div>

Ichiro Saito さま

弊社環境では先ほど投稿されたコードでレコードが取得できているので、フィールドの設定（日付というフィールドがないとエラーになります）かカーソルの問題か、取得できたレコードが0件か（forループの中で「全件…」と書かれているので、取得できたレコードが0件なら何も表示されない可能性があります。逆を言えば100件取得できたら100回「全件…」と表示されるのでalert()はループ外が良いでしょう）何らかの問題があると思います。

コンソールにはどういったエラーが表示されていますか？withCursorを一度外すとエラーが見やすいかもしれません。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1856](https://avatars.discourse-cdn.com/v4/letter/l/ce7236/32.png) [@Legacy\_Account1856](https://community.cybozu.dev/u/Legacy_Account1856)\
**Post date:** [2023 年 6 月 16 日午前 10:17 UTC](https://community.cybozu.dev/t/topic/1660/5 "2023-06-16T10:17:00Z")

</div>

「alert(“レコード全件を更新しました”);」100回出てきました！

そして、よくよく見たら・・・・「getAllRecords」は「全件取得」なのですね！？  
全件「更新」をかけたかったので、「updateAllRecords」が正解でしょうか？

ただ…getAllRecordsをupdateAllRecordsに置き換えたところ、変化ありませんでした。  
また、[更新日時]フィールドを追加しましたが、更新日時は更新されず。  
（alert(“レコード全件を更新しました”);も出なくなりました。エラー表示はゼロ）

```
**■[getAllRecords]を[updateAllRecords]に変更、[更新日時]追加。**
(function () {
  "use strict";
  // ボタンクリックイベントのハンドラ

  async function handleButtonClick() {
      try {
        // クライアントの作成
        const client = new KintoneRestAPIClient();
        // リクエストパラメータの設定
        const params = {
          app: kintone.app.getId(), // アプリID
          fields: ['$id'], // フィールド
          // fields: ['更新日時'], // フィールド
          condition: '日付 >= TODAY()', // 条件
          orderBy: '日付 asc', // 順番
          withCursor: true // カーソル有無
        };
        // レコードの全件更新？
        const resp = await client.record.updateAllRecords(params);
        for (let i = 0; i < resp.length; i++) {
          console.log(resp[i].$id);
    alert("レコード全件を更新しました");
        }
      } catch (e) {
        console.log(e);
     }
  // })  
}

kintone.events.on("app.record.index.show", function (event) {
  // ボタンの作成
  const button = document.createElement("button");
  button.textContent = "ボタン";
  button.addEventListener("click", handleButtonClick);
  // レコード一覧画面のヘッダにボタンを追加
  kintone.app.getHeaderMenuSpaceElement().appendChild(button);
  return event;
});
})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1856](https://avatars.discourse-cdn.com/v4/letter/l/ce7236/32.png) [@Legacy\_Account1856](https://community.cybozu.dev/u/Legacy_Account1856)\
**Post date:** [2023 年 6 月 16 日午前 10:22 UTC](https://community.cybozu.dev/t/topic/1660/6 "2023-06-16T10:22:52Z")

</div>

また、長文で申し訳ないのですが、最終的に実現したいことは、csvファイルで取り込んだファイルに対して、  
「更新ボタン」クリックで、下記コードを適用させたいです。  
この場合、そもそも「updateAllRecords」は使えないのでしょうか？

```
■使用フィールドコード
請求年月
請求年月_YYYY年M月形式

(function () {
"use strict";
kintone.events.on([
"app.record.create.show", "app.record.edit.show", 
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.請求年月",
"app.record.edit.change.請求年月",
], function (event) {
const record = event.record;
const sixDigitNumber = record.請求年月.value; // 6桁の数字が格納されているフィールドのフィールドコード

if (sixDigitNumber && sixDigitNumber.length === 6) {
const year = sixDigitNumber.slice(0, 4); // 最初の4桁を年とする
const month = sixDigitNumber.slice(4); // 最後の2桁を月とする

const newNumber = year + '年' + month + '月'; // 4桁目の後に「年」、6桁目の後に「月」を追加する

record.請求年月_YYYY年M月形式.value = newNumber;
}

return event;
});
})();

■使用フィールドコード
請求社名
担当部門名
担当者名
敬称
請求社名_rep
担当部門名_rep
担当者名_rep

(function () {
"use strict";
kintone.events.on(
[
"app.record.create.show", "app.record.edit.show", 
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.請求社名",
"app.record.create.change.担当部門名",
"app.record.create.change.担当者名",
"app.record.create.change.敬称"
],
function (event) {
const record = event.record;

//グレーアウト
record.請求社名_rep.disabled = true;
record.担当部門名_rep.disabled = true;
record.担当者名_rep.disabled = true;

//結合パターンその１
if(
record.請求社名.value &&
record.担当部門名.value &&
record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value 
record.担当者名_rep.value = " " + record.担当者名.value + " " + record.敬称.value
}

//結合パターンその２
else if(
record.請求社名.value &&
!record.担当部門名.value &&
record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value 
record.担当者名_rep.value = record.担当者名.value + " " + record.敬称.value
}

//結合パターンその３
else if(
record.請求社名.value &&
record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value + " " + record.敬称.value
record.担当者名_rep.value = record.担当者名.value
}

//結合パターンその４
else if(
record.請求社名.value &&
!record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value + " " + record.敬称.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = record.担当者名.value
}

//結合パターンその５
else if(
!record.請求社名.value &&
!record.担当部門名.value &&
!record.担当者名.value
)
{
record.請求社名_rep.value = record.請求社名.value
record.担当部門名_rep.value = record.担当部門名.value
record.担当者名_rep.value = record.担当者名.value
}

return event;
}
);
})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2023 年 6 月 16 日午前 10:30 UTC](https://community.cybozu.dev/t/topic/1660/7 "2023-06-16T10:30:36Z")

</div>

Ichiro Saito さま

2つ前の投稿までは合っています。作りかけと判断しておりましたが、ご希望されるレコードの更新にはレコードの取得が必須なので、その状態（2つ前の投稿）から更に肉付けしていくことになります。

&nbsp;

レコードの更新のためには、更新したいレコードのID、もしくはupdateKey（更新のキーとする重複禁止のフィールド）が必要なので、日付フィールドが今日以降のレコードを全て更新したい場合

①日付を今日以降のレコードで絞り込みしてレコードを取得（getAllRecordsを実行し、レコードを更新するためのIDを取得）  
②取得したレコードのIDを使ってupdateAllRecordsを実行

という手順が必要で、2つ前の投稿でこの手順の①ができている状態です。

&nbsp;

&nbsp;

```
      const resp = await client.record.getAllRecords(params);
        for (let i = 0; i < resp.length; i++) {
          console.log(resp[i].$id);
      }

```

ここでconsole.log(resp[i].$id)をするのではなく、updateAllRecordsのリクエストボディを作り、そのリクエストボディのrecords配列にresp[i].$idを含めたオブジェクトをpush()していく必要があります。

---

<div class="post-metadata">

**Author:** ![silvenia](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@silvenia](https://community.cybozu.dev/u/silvenia)\
**Post date:** [2023 年 7 月 16 日午前 1:48 UTC](https://community.cybozu.dev/t/topic/1660/8 "2023-07-16T01:48:10Z")

</div>

mls-hashimoto さま

Ichiro Saitoです。

ご連絡大変遅れましたが、ご回答ありがとうございました。

まだ理解できておりませんが・・・時間をかけて勉強したいと思います！

７月で活動終了とのこと・・・今まで大変お世話になりました！！  
幸多からんことを願っています！！

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2023 年 9 月 27 日午前 5:07 UTC](https://community.cybozu.dev/t/topic/1660/9 "2023-09-27T05:07:15Z")

</div>

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