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

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

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

下記URLを参考にkintone JavaScript Client (@kintone/rest-api-client)を入れて、設定してみましたが、正しく動作しませんでした。
【kintone】レコードを全件取得する【カスタマイズAPI編】
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;
});
})();

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

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 => {
// 以下略

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

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

 

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

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

mls-hashimoto さま

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

kintone.events.on~を1つに修正しました。

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

(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;
});
})();

Ichiro Saito さま

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

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

「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;
});
})();

また、長文で申し訳ないのですが、最終的に実現したいことは、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;

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

//結合パターンその2
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
}

//結合パターンその3
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
}

//結合パターンその4
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
}

//結合パターンその5
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;
}
);
})();

Ichiro Saito さま

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

 

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

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

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

 

 

      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()していく必要があります。

mls-hashimoto さま

Ichiro Saitoです。

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

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

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

1 Like

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