新規投稿
フォローする

kintoneの一覧に、計算フィールドを一括更新するボタンを設置したいです。

kintoneの一覧に、計算フィールドを一括更新するボタンを設置したいです。

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

このサンプルコードを入れても、ボタンとして正しく動かず、どこを見ても正しく完成されたソースコードが載っていません。

そして同様の質問だけがたくさんあります。皆さん困っています。

この一括更新の部分だけであまり使いたい人はいなくて、ボタンに入れた時にどうやって動かすのかちゃんと書いたらいいんじゃないですか?

kintoneのアプリにjsとして登録するとすぐに使える計算フィールドの一括更新ボタンの正しいソースコードをそろそろだれか書いてください。

0

8件のコメント

Avatar
江田篤史

neenya様

お世話になっております
トヨクモの江田です.

質問への回答に至らぬ点があるとのご指摘,誠にありがとうございます.
今後は明快な回答となるよう,気をつけてまいります.

参考になられた記事に関しまして,他社様の記事であるため,弊社からの対応はできかねます.
Cybozu様あるいは,ラジカルブリッジ様にお問い合わせいただければと存じます.

一括更新については,下記のようなコードで実装できるかと思います.

(function() {
  "use strict";
  var getRecords = function(app, tmpRecords){
    var limit = 500;
    var tmpRecords = tmpRecords || [];
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
      app: app,
      query: 'limit ' + limit +' offset ' + tmpRecords.length
    }).then(function(response){
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
  }
  var putRecords = function(app, records){
    var limit = 100;
    return kintone.Promise.all(
      records.reduce(function(recordsBlocks, record){
        if(recordsBlocks[recordsBlocks.length - 1].length === limit){
          recordsBlocks.push([record]);
        }else{
          recordsBlocks[recordsBlocks.length - 1].push(record);
        }
        return recordsBlocks;
      }, [[]]).map(function(recordsBlock){
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
          app: app,
          records: recordsBlock
        });
      })
    );
  }
  kintone.events.on('app.record.index.show', function(event){
    if(document.getElementById('updateButton') !== null) return;
    var button = document.createElement('button');
    button.innerHTML = 'update';
    button.id = 'updateButton';
    kintone.app.getHeaderMenuSpaceElement().appendChild(button);
    button.addEventListener('click', function(){
      getRecords(kintone.app.getId()).then(function(records){
        putRecords(kintone.app.getId(), records.map(function(record){
          return {
            id: record.$id.value,
            record: {}
          };
        })).then(function(){
          alert('updated');
          location.reload();
        });
      });
    });
    return event;
  });
})();

今後ともよろしくお願いいたします.

0
Avatar
岩島章太

江田篤史 様、

 

すみません教えてください。

全くの初心者です。

上記スレッド見て見様見真似でjavascriptを組んだのですがいまいち理解していなく、助けてほしいです。

やりたい事は一括ボタンを一覧で作成し、一括ボタンを押した際、(レコードコード:kaikake)および(レコードコード:urikake)を更新した後、(レコードコード:計算)を更新したいと考えております。

且つ、一覧で検索した(絞った)案件のみの更新を行いたいと思っております。

ご教示いただけると幸いです。

 

(function() {
"use strict";
var getRecords = function(app, tmpRecords){
var limit = 500;
var tmpRecords = tmpRecords || [];
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: app,
query: 'limit ' + limit +' offset ' + tmpRecords.length
}).then(function(response){
tmpRecords = tmpRecords.concat(response.records);
return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
});
}
var putRecords = function(app, records){
var limit = 100;
return Promise.all(
records.reduce(function(recordsBlocks, record){
if(recordsBlocks[recordsBlocks.length - 1].length === limit){
recordsBlocks.push([record]);
}else{
recordsBlocks[recordsBlocks.length - 1].push(record);
}
return recordsBlocks;
}, [[]]).map(function(recordsBlock){
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
app: app,
records: recordsBlock
});
})
);
}
kintone.events.on('app.record.index.show', function(event){
if(document.getElementById('updateButton') !== null) return;
var button = document.createElement('button');
button.innerHTML = '売一括更新';
button.id = 'updateButton';
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener('click', function(){
getRecords(kintone.app.getId()).then(function(records){
putRecords(kintone.app.getId(), records.map(function(record){
return {
id: record.レコード番号.value,
record: {
urikake: {
kaikake: {
value: record.計算.value
}
}
}};
})).then(function(){
alert('更新しました。');
location.reload();
});
});
});
return event;
});
})();

0
Avatar
江田篤史

岩島章太様

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

順番が前後しますが,まず一覧で絞り込んだレコードのみを更新する方法について.
下記コードで実装できます.
ただし,絞り込み結果が多数あり,一覧が複数ページに及ぶ場合も,表示しているページ内のレコードしか更新されません.

(function() {
  "use strict";
  kintone.events.on('app.record.index.show', function(event){
    var oldButton = document.getElementById('updateButton');
    if(oldButton !== null) oldButton.parentNode.removeChild(oldButton);
    var button = document.createElement('button');
    button.innerHTML = 'update';
    button.id = 'updateButton';
    kintone.app.getHeaderMenuSpaceElement().appendChild(button);
    button.addEventListener('click', function(){
      kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
        app: kintone.app.getId(),
        records: event.records.map(function(record){
          return {
            id: record.$id.value,
            record: {}
          };
        })
      }).then(function(){
        alert('updated');
        location.reload();
      });
    });
    return event;
  });
})();

続いて,上記コードでいうところの16行目,「record」の記述方法について.
フイールドタイプが「計算」のフィールドに関しては,値を明示的に指定せずとも,自動計算した値に更新されます.
https://developer.cybozu.io/hc/ja/articles/202166330

フイールドタイプが「計算」でないフィールドに関しては,一括更新処理で特定の値に書き換えたいのであれば,上記コード16行目の「record」に値を指定してください.

record: {
  kaikake: {
    value: '新しい値'
  },
  urikake: {
    value: '新しい値'
  }
}
0
Avatar
cybozu Development team

neenya 様

cybozu developer network 運営局です。

コミュニティの注意書きにあるように、このコミュニティでは、有志のエンジニアが回答しております。
また、すぐにサンプルコードを求めるのではなく、ご自身でカスタマイズを試した上で発生した問題や疑問点を質問・相談する場となっています。

コミュニティの注意書き より
> ・コミュニティはトピック別に整理された質問と回答で構成されており、有志のエンジニアによって運営されています。
> ・サンプルコードをすぐに求めるのではなく、自分で試したものの解決できなかったプログラムを示すなど回答者が回答しやすい質問にしましょう

また、投稿された内容の一部について、利用規約 第10条の禁止事項に該当すると判断したため、該当箇所を削除いたしました。

今後とも、cybozu developer network をよろしくお願いいたします。

cybozu Development teamにより編集されました
0
Avatar
R.Imamura

上記のコードはレコードを個別に開いて保存して閉じた場合と

同じ処理が一括でできるという認識で良いでしょうか?

個別にレコードを開いて保存した場合には反映されるのですが、上記コードの

”UPDATE”ボタンでは反応しません。

何か違いがあれば恐れいりますが、お手すきの時にでも教授ください。

よろしくお願いします。

0
Avatar
R.Imamura

更新対象件数が4000件くらいあるのが原因でしょうか?

0
Avatar
江田篤史

R.Imamura様

お世話になっております.
返信が遅くなり申し訳ございません.

上記のコードはレコードを個別に開いて保存して閉じた場合と同じ処理が一括でできるという認識で良いでしょうか?
> はい,その通りです.

私の環境では,5,000件のレコードで動作確認取れました.

ボタンを押して1分以上経っても何も反応がないのであれば,エラーが発生しているかもしれません.
下記などを参考にエラーを確認してみてください.
https://developer.cybozu.io/hc/ja/articles/207613916

0
Avatar
R.Imamura

江田様

ご返信ありがとうございます。

更新している間、”更新中”などの表示がなく

処理中なのか否かが分からず

1分くらいたって更新済になりました。結構時間がかかるものなんですね。

無事解決いたしました。ありがとうございました。

 

 

1
サインインしてコメントを残してください。