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;
});
})();
今後ともよろしくお願いいたします.
江田篤史 様、
すみません教えてください。
全くの初心者です。
上記スレッド見て見様見真似で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;
});
})();
岩島章太様
お世話になっております。
順番が前後しますが,まず一覧で絞り込んだレコードのみを更新する方法について.
下記コードで実装できます.
ただし,絞り込み結果が多数あり,一覧が複数ページに及ぶ場合も,表示しているページ内のレコードしか更新されません.
(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: '新しい値'
}
}
neenya 様
cybozu developer network 運営局です。
コミュニティの注意書きにあるように、このコミュニティでは、有志のエンジニアが回答しております。 また、すぐにサンプルコードを求めるのではなく、ご自身でカスタマイズを試した上で発生した問題や疑問点を質問・相談する場となっています。
コミュニティの注意書き より
> ・サンプルコードをすぐに求めるのではなく、自分で試したものの解決できなかったプログラムを示すなど回答者が回答しやすい質問にしましょう
`
``
`また、投稿された内容の一部について、利用規約 第10条の禁止事項に該当すると判断したため、該当箇所を削除いたしました。
`
`今後とも、cybozu developer network をよろしくお願いいたします。`
上記のコードはレコードを個別に開いて保存して閉じた場合と
同じ処理が一括でできるという認識で良いでしょうか?
個別にレコードを開いて保存した場合には反映されるのですが、上記コードの
”UPDATE”ボタンでは反応しません。
何か違いがあれば恐れいりますが、お手すきの時にでも教授ください。
よろしくお願いします。
更新対象件数が4000件くらいあるのが原因でしょうか?
R.Imamura様
お世話になっております.
返信が遅くなり申し訳ございません.
上記のコードはレコードを個別に開いて保存して閉じた場合と同じ処理が一括でできるという認識で良いでしょうか?
> はい,その通りです.
私の環境では,5,000件のレコードで動作確認取れました.
ボタンを押して1分以上経っても何も反応がないのであれば,エラーが発生しているかもしれません.
下記などを参考にエラーを確認してみてください.
https://developer.cybozu.io/hc/ja/articles/207613916
江田様
ご返信ありがとうございます。
更新している間、”更新中”などの表示がなく
処理中なのか否かが分からず
1分くらいたって更新済になりました。結構時間がかかるものなんですね。
無事解決いたしました。ありがとうございました。
system
(system)
クローズされました:
10
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。