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

自動計算のフィールドなどを後から追加した場合に自動で計算フィールドが埋まらないので全件更新したいときに使います。
一覧画面のヘッダーにボタンを配置して任意のタイミングでできるようにしたかったのでまとめました。
ボタンをクリックして全件取得して何かしたい、と思った時にはこちらを改造すればいいと思います。
公式にあるサンプルプログラムを組み合わせていきます。

## サンプルプログラム
- [第2回 レコード一覧画面にボタンを置いてみよう！](https://developer.cybozu.io/hc/ja/articles/201767270)
- [全レコードの取得方法](https://developer.cybozu.io/hc/ja/articles/203702800-%E5%85%A8%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95)
- [後で追加した計算フィールドに一括で値を反映する方法](https://developer.cybozu.io/hc/ja/articles/201883830-%E5%BE%8C%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E8%A8%88%E7%AE%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E4%B8%80%E6%8B%AC%E3%81%A7%E5%80%A4%E3%82%92%E5%8F%8D%E6%98%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [レコードの更新（PUT）](https://developer.cybozu.io/hc/ja/articles/201941784-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B4%E6%96%B0-PUT-)

## できました

JSファイルを作って以下をコピーして読み込ませる。

```allUpdate.js
(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;
  })();
})();

```

以上

## 追加
テキストボックスを用意してアプリID指定して遠隔で空更新したい場合はテキストボックスの追加と入力内容を取得すればよい。
以下の場合は入力内容のチェックをしていないので適宜追加してください。

```allUpdate.js
    // テキストボックス
    var myIndexInputBox = document.createElement('input');
    myIndexInputBox.id = 'my_index_input';
    myIndexInputBox.type = "text";
~
    function KintoneRecordManager() {
        // テキストボックスの入力内容を取得
        var appId = document.getElementById('my_index_input').value === "" ? kintone.app.getId() : document.getElementById('my_index_input').value;
        this.appId = appId;
        this.records = [];
    }
```