新規投稿
フォローする

Kintoneで全レコードを空更新する

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

ネットに出ていた情報を参考にしたのですが、上手く反映されず

もしわかる方いらっしゃいましたらお助けください。

https://qiita.com/iNaoki04/items/3cf8655ad58f2c9a1308 

・やりたいこと

アプリ内で文字列(1行)項目の【施設名】と【経営主体】を組み合わせ

新しく項目追加した、文字列(複数行)に反映するようにしました。

(function() {
"use strict";
kintone.events.on(["app.record.create.submit","app.record.edit.submit","app.record.index.edit.submit"],
function(event) {
var record = event.record;
record['文字列'].value = record['施設名'].value || '';
record['文字列'].value += '\n';
record['文字列'].value += record['経営主体'].value || '';
return event;
});
})();

全レコード数8,400件ある為、すべてを一括更新したいです。

ネット情報で拾ってきたので試しましたが上手く反映されませんでした。

(function() {
  "use strict";
  // レコード一覧画面の表示後イベント
  kintone.events.on('app.record.index.show', function(event) {
    // 増殖バグを防ぐ
    if (document.getElementById('my_index_button') !== null) {
        return;
    }

    // ボタン
    var myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerText = '全件空更新';

    // ボタンクリック時の処理
    myIndexButton.onclick = function() {
      var manager = new KintoneRecordManager;
      manager.getRecords(function(records) {
        // レコード取得後の処理
        console.log(records);

        // 取得したレコードを空更新する
        var body = {
          "app": manager.appId,
          "records": []
        }
        var record = {};
        var recordArr = [];
        for (var i = 0; i < records.length; i++) {
          record[i] = {
            "id": records[i]['レコード番号']['value'],
            "record": {}
          }
          recordArr.push(record[i]);
        }
        // 100件ずつ更新
        var s = 0;
        var e = 0;
        while (s < recordArr.length) {
          e = s + 100;
          body.records = recordArr.slice(s, e);
          kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', body, function(resp) {
            // success
            console.log(resp);
          }, function(error) {
            // error
            console.log(error);
          });
          s = s + 100;
        }
      });

      // 再読み込み
      location.reload();
    };

    // メニューの右側の空白部分にボタンを設置
    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  });

  /**
   * kintoneと通信を行うクラス
   */
  var KintoneRecordManager = (function() {
    KintoneRecordManager.prototype.records = [];    // 取得したレコード
    KintoneRecordManager.prototype.appId = null;    // アプリID
    KintoneRecordManager.prototype.query = '';      // 検索クエリ
    KintoneRecordManager.prototype.limit = 100;     // 一回あたりの最大取得件数
    KintoneRecordManager.prototype.offset = 0;      // オフセット

    function KintoneRecordManager() {
        this.appId = kintone.app.getId();
        this.records = [];
    }

    // すべてのレコード取得する
    KintoneRecordManager.prototype.getRecords = function(callback) {
      kintone.api(
        kintone.api.url('/k/v1/records', true),
          'GET',
          {
            app: this.appId,
            query: this.query + (' limit ' + this.limit + ' offset ' + this.offset)
          },
        (function(_this) {
          return function(res) {
            var len;
            Array.prototype.push.apply(_this.records, res.records);
            len = res.records.length;
            _this.offset += len;
            if (len < _this.limit) { // まだレコードがあるか?
                _this.ready = true;
                if (callback !== null) {
                    callback(_this.records); // レコード取得後のcallback
                }
            } else {
                _this.getRecords(callback); // 自分自身をコール
            }
          };
        })(this)
      );
    };
    return KintoneRecordManager;
  })();
})();
0

3件のコメント

Avatar
新屋 育男

TS 様

 

全件、空更新をされたいようですとCSVファイルでも可能かと思います。

手順としては、アプリに適当なフィールドを用意して、更新するファイルをCSVファイルで書き出します。

その時に含めるフィールド(レコード番号、適当なフィールド)

出力されたCSVファイルから、ファイルから読み込むでレコード番号をキーにして更新をし、適当なフィールドを消去する。

以上です。

 

また適当なフィールドですが、既存フィールドでも特に問題なく空更新されると思います。

注意点として、既存のフィールドでCSVを書き出した時に、Unicodeの影響で文字化けするなんてこともありますのでお気をつけください。

 

どうしても、scriptで更新をされたいようでしたら、@kintone/rest-api-client を利用するとよいと思います。

kintone JavaScript Client (@kintone/rest-api-client) – cybozu developer network

目指せ!JavaScriptカスタマイズ中級者(4) 〜kintone REST API Client編〜 – cybozu developer network

詳しい内容は、一読してご自身で勉強して頂けばと思います。

利用方法ですが、準備として以下を、JavaScript / CSSでカスタマイズ javaScriptファイルにURL指定で追加してください。
https://js.cybozu.com/kintone-rest-api-client/1.4.0/KintoneRestAPIClient.min.js

 

以下に空で一括更新するサンプルを置いておきます。

(function () {
  "use strict";

  kintone.events.on("app.record.index.show", function (event) {
    if (document.getElementById('my_index_button') !== null) {
      return;
    }
    let el = kintone.app.getHeaderMenuSpaceElement();
    let bu = document.createElement("button");
    bu.id = "my_index_button";
    bu.innerText = "全件空更新";
    el.appendChild(bu);

    // クライアントの作成
    let client = new KintoneRestAPIClient();

    // リクエストパラメータの設定
    const APP_ID = kintone.app.getId();

    let params = {app: APP_ID};
    // レコードの取得と空データの作成及びデータの更新

    const getAll = async () => {
      let res = await client.record.getAllRecords(params).catch(function(err) {
        alert(err.message);
      });

      let putRecords = [];
      for(let i =0; res.length > i; i++) {
        let putId = res[i].レコード番号.value;
        let put = {id: putId, record: {}};
        putRecords.push(put);
      }

      params = {app: APP_ID, records: putRecords};
      const rec = await client.record.updateAllRecords(params).catch(function(err) {
        alert(err.message);
      });
      alert("更新が終了しました。");
      location.reload();
    }

    //一括オフ クリック時
    bu.onclick = function () {
      if(!event.records[0]) {
        return alert("レコードがありません");
      }
      getAll();
      return;
    };
  });
})();
8400件ですと、かなり更新に時間がかかるかと思います。
spinner等は設定しておりませんので、アラートが何か表示されるまでページ更新をお待ちください。
また、spinner等はご自身で設置下さい。
 
また、ご自身が作成された内容で一括更新をしたいということであれば for文を以下に変更すれば可能かと思います。
for(let i =0; res.length > i; i++) {
  let putId = res[i].レコード番号.value;
  let putDocument = `${res[i].施設名.value || ''}\n${res[i].経営主体.value || ''}`
  let put = {id: putId, record: {'文字列': {value: putDocument}}};
  putRecords.push(put);
}
新屋 育男により編集されました
1
Avatar
TS

新屋 育男 様

お世話になっております。
ご教示いただきありがとうございます。

CSVファイルを使用する方法にて空更新を行うことができました。

しかし、
やりたい事ができずもう一度お力添えお願いいたします。

<やりたい事>
各レコードを「編集」→「保存」を繰り返す方法。

空更新では、

(function() {
"use strict";
kintone.events.on(["app.record.create.submit","app.record.edit.submit","app.record.index.edit.submit"],
function(event) {
var record = event.record;
record['文字列'].value = record['施設名'].value || '';
record['文字列'].value += '\n';
record['文字列'].value += record['経営主体'].value || '';
return event;
});
})();

上記のコードが動かず、どうやら[レコード編集→保存を行う]事で動くみたいです。

 

何卒宜しくお願い致します。

0
Avatar
新屋 育男

TS 様

 

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

そちらのコードでは、空更新時に挙動はしないはずです。

その理由としては、アプリで保存ボタンを押したときがトリガーとなり更新されるからです。

 

また現状として、他のコードやCSV等を当てているときに自動更新されるAPIはないかと思います。

以上のことから、残念ながらCSVでもコードでも、空更新時にはTS様のコードは適用されないという事になってしまいます。

ただ私が前回上げたコードを利用すると、スムーズに更新ができるかと思います。

【PC用JavaScriptファイル】の上段に下記のURLを指定して、

https://js.cybozu.com/kintone-rest-api-client/1.4.0/KintoneRestAPIClient.min.js

sample.jsに下記のコードを入れて試して頂ければ幸いでございます。(注意事項前回に記述しております。ご確認ください。)

(function () {
  "use strict";

  kintone.events.on("app.record.index.show", function (event) {
    if (document.getElementById('my_index_button') !== null) {
      return;
    }
    let el = kintone.app.getHeaderMenuSpaceElement();
    let bu = document.createElement("button");
    bu.id = "my_index_button";
    bu.innerText = "全件空更新";
    el.appendChild(bu);

    // クライアントの作成
    let client = new KintoneRestAPIClient();

    // リクエストパラメータの設定
    const APP_ID = kintone.app.getId();
    let params = {app: APP_ID};

    // レコードの取得と空データの作成及びデータの更新
    const getAll = async () => {
      let res = await client.record.getAllRecords(params).catch(function(err) {
        alert(err.message);
      });

      let putRecords = [];
      for(let i =0; res.length > i; i++) {
        let putId = res[i].レコード番号.value;
        let putDocument = `${res[i].施設名.value || ''}\n${res[i].経営主体.value || ''}`
        let put = {id: putId, record: {'文字列': {value: putDocument}}};
        putRecords.push(put);
      }

      params = {app: APP_ID, records: putRecords};
      const rec = await client.record.updateAllRecords(params).catch(function(err) {
        alert(err.message);
      });

      alert("更新が終了しました。");
      location.reload();
    }

    //一括オフ クリック時
    bu.onclick = function () {
      if(!event.records[0]) {
        return alert("レコードがありません");
      }
      getAll();
      return;
    };
  });
})();
前回の内容のfor文を変更し、記述し直しただけです。
ご確認いただけますと幸いでございます。
新屋 育男により編集されました
1
サインインしてコメントを残してください。