一括更新のイベントをボタンへ変更

特定フィールドの計算を、一覧画面表示時に一括更新するようなJSカスタマイズを見様見真似で運用しておりましたが、利用するユーザーが増えてきたことにより、一人が既存レコードを編集中に他のユーザーが一覧画面を開くと編集中レコードが保存出来なくなるという問題が発生してきました。

そこで、イベント発生のタイミングを一覧画面表示時に自動ではなく、一括更新ボタンを作って手動で一括更新するように変更したいのですがコードの書き方がいまいち分かりません。

(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event){
var changed = false;
var getBody = {
“app”: kintone.app.getId(),
};
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, getBody, function (resp) {
var records = resp[“records”];
var putBody = {
“app”: kintone.app.getId(),
“records”: []
};

この部分をどのように書き換えたら良いのでしょうか?

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

よろしくお願い致します

ishii様

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

下記のようになるかと思います.

(function() {
  "use strict";
  kintone.events.on('app.record.index.show', function(event){
    var button = document.createElement('button');
    button.innerText = 'update';
    kintone.app.getHeaderMenuSpaceElement().appendChild(button);
    button.addEventListener('click', function(){
      //ここに更新処理をかく
    });
  });
})();

江田様

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

ご教授頂いた通りにコードを編集したつもりですが、ボタンは作れたものの押しても更新がされません。

顧客情報アプリの中の契約情報テーブルの残り期間が自動計算されるようにしたいのですが。。

(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event){
var button = document.createElement(‘button’);
button.innerText = ‘残を更新する’;
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener(‘click’, function(){
//ここに更新処理をかく
records.forEach(function (record) {
var newRows = []
for (let row of record.契約情報.value) {
var date1 = new Date();
var date2 = new Date(row.value.終了日.value);
var Diff = date2.getTime() - date1.getTime();
var days = Math.floor(Diff / (1000 * 60 * 60 * 24 * 30) + 1);

newRows.push({
“value”: {
“販売会社”:{
“value”:row.value.販売会社.value
},
“契約種別”:{
“value”:row.value.物件種別.value
},
“契約形態”:{
“value”:row.value.契約形態.value
},
“終了日”: {
“value”: row.value.終了日.value
},
“期間”:{
“value”:row.value.期間.value
},
“残”: {
“value”: days
},
“料金”: {
“value”:row.value.料金.value
},
“契約番号”: {
“value”:row.value.契約番号.value
},
“構成”: {
“value”:row.value.構成.value
},

}
})

if (days != row.value.残.value) {
changed = true;
}
}

putBody.records.push({
“id”: record.$id.value,
“record”: {
“契約情報”: {
“value”: newRows
}
}
});
});
});
});
})();

デベロッパーツールでもエラー箇所を上手く見つけられなかったのですが、どこか間違っていますでしょうか?

ishii様

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

recordsが定義されていないので,エラーになるのかと思います.

元コードのkintone.events.on()のコールバック関数内のコード(下の「ここ」)を全て,button.addEventListener()のコールバック関数内のに移してみてください.

kintone.events.on('app.record.index.show', function(event){
//ここ
})();

江田様

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

ご指摘の通りに元コードの内容をコピーしてみたのですが、今度はボタンも消えてしましました。

(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event){
var button = document.createElement(‘button’);
button.innerText = ‘残を更新する’;
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener(‘click’, function(){
var changed = false;
var getBody = {
app: kintone.app.getId(),
};
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, getBody, function (resp) {
var records = resp[“records”];
var putBody = {
app: kintone.app.getId(),
records: []
}

records.forEach(function (record) {
var newRows = []
for (let row of record.物件情報.value) {
var date1 = new Date();
var date2 = new Date(row.value.終了日_2.value);
var Diff = date2.getTime() - date1.getTime();
var days = Math.floor(Diff / (1000 * 60 * 60 * 24 * 30) + 1);

newRows.push({
“value”: {
“販売会社”:{
“value”:row.value.販売会社.value
},
“種別”:{
“value”:row.value.種別.value
},
“契約形態”:{
“value”:row.value.契約形態.value
},
“設置日”:{
“value”:row.value.設置日.value
},
“終了日_2”: {
“value”: row.value.終了日_2.value
},
“期間0”:{
“value”:row.value.期間0.value
},
“残”: {
“value”: days
},
“料金”: {
“value”:row.value.料金.value
},
“契約番号”: {
“value”:row.value.契約番号.value
},
“構成”: {
“value”:row.value.構成.value
},

}
})

if (days != row.value.残.value) {
changed = true;
}
}

putBody.records.push({
“id”: record.$id.value,
“record”: {
“物件情報”: {
“value”: newRows
}
}
});
});

if(changed){
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, putBody, function(){
location.reload();
});
}
});
});
});
})

初歩的なところで躓いており、お手数お掛けして申し訳ございません。

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

ishii様

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

類似の質問があったため,コード全文作成してみました.

https://developer.cybozu.io/hc/ja/community/posts/900001057226/comments/900000369606

お知らせしておけばよかったです.
申し訳ございません.

江田様

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

リンクのコードを見てみたのですが、これはアプリ内の計算フィールドを全て一括更新してくれるボタンを作るという解釈で良いのでしょうか?

以前のコードではレコードの数値フィールドの値をJSカスタマイズに計算式を入れていましたが、計算式自体はアプリの方に設定することになりますか?

ishii様

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

はい,リンク先は計算フィールドを想定しております.

計算はJSカスタマイズで行っていたのですね.
見落としておりました.

ishii様が提示されたコード,拝見いたしました.
即時関数の括弧が不足しているかと思います.

最後の行を変更してみてください.

})

})();

江田様

カッコの追加で解決致しました。

DATEDIFF的な計算を行なってたので、kintoneの計算式では作れなかったので助かりました。

ご丁寧な対応ありがとうございました!!