カスタマイズの一括更新について

いつも勉強させていただいております。

文字結合プラグインや、別フィールドへ特定の値を自動入力させるカスタマイズを後からつけました。データが1000件近くあるため一括更新キーを作り、更新したいと考えています。

以下のコードでは、自動計算フォームに対してはうまく動作するのですが、カスタマイズしたフィールドは更新されず。

どこを直せばうまくいくのでしょうか。

(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.innerHTML = ‘一括更新’;
 
        // ボタンクリック時の処理
        myIndexButton.onclick = function() {
            var appId = kintone.app.getId();
            kintone.api(‘/k/v1/records’, ‘GET’, {app: appId}, function(resp) {
                 //////// 空更新オブジェクトの生成
                 var param = {
                     “app”: appId,
                     “records”: []
                 };

                 for (var i = 0; i < resp[‘records’].length; i++) {
                     param[‘records’][i] = {
                         “id”: resp[‘records’][i][‘レコード番号’][‘value’],
                         “record”: {}
                     }
                 }
                    kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, param, function(resp) {
                     // success
                     console.log(resp);
                 }, function(error) {
                     // error
                     console.log(param);
                     console.log(error);
                 });
             });
         }
         kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
     });
 })();

natsuki さん

kintone のプラグインやJavaScript カスタマイズは、ブラウザーの画面上のイベントで実行されるしくみです。

そのため、REST API でレコード更新をしてもプラグインやJavaScript は実行されません。

一括で処理する場合は、プラグインやJavaScript カスタマイズと同等の処理をレコード毎に項目の値に設定してください。

rex0220 様

コメントありがとうございます。

お礼が遅くなってしまいすみません。

処理したい項目をきちんと設定しなければいけないのですね。

ifの条件に当てはまったら自動で特定の文字を入力させる、というカスタマイズを一括で適用させたいのですが、

そういったifを用いた値でも、項目の値に設定できますか?

分からないことだらけで申し訳ありません。

オブジェクトに値を設定するだけなので、 定数でも if 文でも問題ありません。
下記は、 切り貼りしただけですので参考程度に考えてください。

var param = {
"app": appId,
"records": []
};

resp.records.forEach(function(record) {
var newRec = {
"項目3": { value: record['項目1'].value + record['項目2'].value },
"数値3": { value: record['項目1'].value ? record['数値1'].value : record['数値2'].value }
};
if (record['数値1'].value && Number(record['数値1'].value) > 0)
newRec['項目4'] = { value: 'ABC' };
else
newRec['項目4'] = { value: 'XYZ' };
param.records.push({
"id": record['レコード番号']['value'],
"record": newRec
});
});

rex0220 様

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

恐縮ですが、もう少しお聞きしてもよろしいでしょうか。

上記で記載してくださったコードで、newRecで定義している中身の意味は何でしょうか。

「項目4」が更新したいフィールドですよね。

それをなぜnewRec['項目4’]と書くのかも知りたいです。

全く関係のないフィールド名でしたらすみません。

(JSの勉強を始めて3週間ですので、かなり初歩的な質問だと思います。申し訳ありません。)

var newRec = {
"項目3": { value: record['項目1'].value + record['項目2'].value },
"数値3": { value: record['項目1'].value ? record['数値1'].value : record['数値2'].value }
};

これは、newRec オブジェクトの初期化ですね。

項目3, 数値3, 項目4 も更新するフィールドコードになります。

newRec オブジェクトを定義時に 項目3, 数値3 を設定している例となります。

 

newRec['項目4’] = { value: 'ABC' };

これは、newRec オブジェクトのプロパティとして、項目4 を設定しています。

>なぜ newRec['項目4’] と書くのか

newRec.項目4 と書いてもいいです。

昔 JavaScript で全角文字を識別名に使えなっかた時代の名残で、私は newRec['項目4’] と書いてしまいます。

変数名・識別名に漢字を使うのがなんだか気持ち悪いというだけです。

この辺の詳細は、JavaScript の仕様を見ていただくのがいいです。

オブジェクト初期化子

 

rex0220 様

お忙しい中ご回答ありがとうございます。

今まで見よう見真似でやってきたので、とても勉強になります。

参考にして頑張っていきたいと思います。

またよろしくお願いいたします。

rex0220 様

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

度々すみません。いつも助けていただいている中大変恐縮ですが、もう1つお聞きしてもよろしいでしょうか…。

rex0220様のおかげで、思った通りの動作ができたのですが、最初の100件しか更新されず困っております。

cybozuの全レコード取得方法を参考に頑張ってみましたが、うまくいきません。

全件取得してから更新するのか、更新してから全件取得するのかも理解できません。

ボタンは作成されるのですが、更新はされず。厚かましいとは存じますが、どうかご回答願います。

 

(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.innerHTML = '一括更新';
         myIndexButton.onclick = function() {
             var appId = kintone.app.getId();
             kintone.api('/k/v1/records', 'GET', {app: appId}, function(resp) {
                 //////// 空更新オブジェクトの生成
         var param = {
                     "app": appId,
                     "records": []
                 };
                 resp.records.forEach(function(record) {
                     var newRec = {
                         "異常": { value: record['レコード番号']['value'] }
                     };
                     if (!record['納期'].value )
                     newRec['異常'] = { value: "未記入" };
                     else
                     newRec['異常'] = { value: "" };
                     param.records.push({
                         "id": record['レコード番号']['value'],
                         "record": newRec
                     });
                 });
                    kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param, function(resp) {
                     // success
                     console.log(resp);
                 }, function(error) {
                     // error
                     console.log(param);
                     console.log(error);
                 });
             });
    //全件取得(どこに書く??)        
             var manager = new KintoneRecordManager;
             manager.getRecords(function(records) {
              // レコード取得後の処理
              console.log(records);
          });
          return event;
      });
      /**
       * 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;
           }
         kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
      })();
  })();

 

いろいろ混乱されているようですね。

わざわざ全件操作の prototype を定義するよりも、kintone Utility for JavaScript を使われてはいかがですか?

「kintone Utility Library for JavaScript」の使い方

kintone Utility for JavaScript を使ってみたよ

 

使用例:切り貼りしただけなので、検証してください。

(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.innerHTML = '一括更新';
myIndexButton.onclick = function() {
var appId = kintone.app.getId();
var param = {
app: appId,
query: '',
fields: ['$id', '納期'],
totalCount: true,
isGuest: false
};

kintoneUtility.rest.getAllRecordsByQuery(param).then(function(resp) {
//////// 空更新オブジェクトの生成
var param = {
"app": appId,
"records": [],
isGuest: false
};
resp.records.forEach(function(record) {
var newRec = {};
if (!record['納期'].value)
newRec['異常'] = { value: "未記入" };
else
newRec['異常'] = { value: "" };
param.records.push({
"id": record['$id']['value'],
"record": newRec
});
});
kintoneUtility.rest.putAllRecords(param).then(function(resp) {
// success
console.log(resp);
}, function(error) {
// error
console.log(param);
console.log(error);
});
});
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
return event;
});

})();

 

rex0220 様

迅速なご回答ありがとうございます。

kintone Utility for JavaScript は勝手にindex.showでは使えないものだと思い込んでいました。

早速インストールして、ご教示いただいたコードを参考に書き直しましたら理想通りの動作をしました。

rex0220様のおかげです。助かりました。本当にありがとうございます。

rex0220natsuki

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

横から失礼いたします。この投稿ページを参考にさせていただいております。

初心者のもので、大変恥ずかしい限りでございますが、kintone Utility for JavaScript のインストールをしたいですが、

https://github.com/kintone/kintoneUtility をクリックして (廃止予定)という文字に気を取られて(汗)・・

 

kintone Utility for JavaScript を使ってみたよ でご紹介のように、インストールしても大丈夫でしょうか?

基本になると思いますが、お時間あるときに教えていただくことは可能でしょうか?お忙しいところ大変恐縮でございますが、どうぞよろしくお願いいたします。