テーブル内の残り月数の自動更新について

今回、初めてkintoneカスタマイズに手を出した超初心者です。

以下の過去投稿を参考に顧客の契約の残り月数の自動更新をしたいと思っています。

https://developer.cybozu.io/hc/ja/community/posts/360046182411-%E6%AE%8B%E6%9C%88%E6%95%B0%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

日数計算の部分を月計算に書き換え(*30を追加しただけですが)、単独フィールドでは上手く動作したのですが、テーブル内フィールドに適用したい場合はどう書き換えれば良いのでしょうか?

調べても良く分からなかったので・・。

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

ishii様

お世話になっております。 トヨクモの加納と申します。

ご希望の動作についてですが、以下画像のようなテーブルがあり、「残り月数」フィールドを自動更新されたいという認識でよろしいでしょうか?

であれば、GETリクエスト時のコールバックを以下のようにすることでひとまず解決するかと存じます。各フィールド名はご自身のものに置き換えてください。

お役に立てば幸いです。

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.Table.value) {
var date1 = new Date();
var date2 = new Date(row.value.日付_0.value);
var Diff = date2.getTime() - date1.getTime();
var days = Math.floor(Diff / (1000 * 60 * 60 * 24 * 30) + 1);

newRows.push({
"value": {
"日付_0": {
"value": row.value.日付_0.value
},
"残り月数": {
"value": days
}
}
})

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

putBody.records.push({
"id": record.$id.value,
"record": {
"Table": {
"value": newRows
}
}
});
});

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

加納様

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

おっしゃる通り、日付を入れたらその日までの残り月数を自動計算してくれるテーブルを作りたいのです。

教えて頂いたコードを貼り付けてみましたが自動計算されませんでした。。。

以下が実際のコードなのですが、どこか間違っていますでしょうか?

見にくくて申し訳ありません。

 

(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”: []
};

records.forEach(function (record) {
var newRows = []
for (let row of record.Table.value) {
var date1 = new Date();
var date2 = new Date(row.value.日付_0.value);
var Diff = date2.getTime() - date1.getTime();
var days = Math.floor(Diff / (1000 * 60 * 60 * 24 * 30) + 1);

newRows.push({
“value”: {
“日付_0”: {
“value”: row.value.日付_0.value
},
“残り月数”: {
“value”: days
}
}
})

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

putBody.records.push({
“id”: record.$id.value,
“record”: {
“Table”: {
“value”: newRows
}
}
});
});

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

ishiiさま

ご活用ありがとうございます。ご提示のコードですが、一読したところ特におかしなところは見受けられませんでした。

「日付_0」や「残り月数」などのフィールドコードはご自身のものと同じになっていますでしょうか?前回の投稿でフィールド名と書いてしまいましたが、フィールドコードです。誤解させてしまっていましたら申し訳ございません。

エラーの原因について、ブラウザのデベロッパーツールを使うと発見できる場合がございます。例えばChromeをお使いであれば、「表示」タブ→「開発/管理」→「デベロッパーツール」から起動し、「Console」タブからエラーメッセージの確認などが行えます。エラーの原因が分からないときなどにご活用できるかもしれませんので、ぜひお試しください。

加納様

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

細かく調べ直したところ、フィールド名は合っていたのですが、テーブルコードが間違っていたことがわかりました。

 

無事に自動計算されました!!

ありがとうございました。

度々申し訳ありません。

別の問題が発生いたしました。。

日付と残り月数のフィールドは解決したのですが、以下のように他の項目のフィールドも含むテーブルにした場合、自動計算後に日付と残り月数以外のフィールドが全て消えてしまいました。。

これは何かコードを書き足す必要があるのでしょうか?

ishiiさま

putBodyにテーブル内フィールドの一部を記載しなかった場合、そのフィールドの値は削除されます。削除したくない場合、以下の部分に「日付_0」や「残り月数」以外の全てのフィールドについて記載する必要があります。

newRows.push({
"value": {
"日付_0": {
"value":row.value.日付_0.value
},
"残り月数": {
"value":days
}
}
})

kintone REST APIを使ったレコードの更新については以下URLに、特に今回の仕様については「注意事項」に記載がありますので、ぜひご一読ください。

https://developer.cybozu.io/hc/ja/articles/201941784#step2

加納様

勉強不足でした。お手数お掛けしてすみません。

教えて頂いたchromeのconsoleなどで四苦八苦して解決いたしました。

ありがとうございました!!

加納様

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

以前に教えて頂いたコチラのカスタマイズを運用していますが、利用するユーザーが増えてきたことにより、一人が既存レコードを編集中に他のユーザーが一覧画面を開くと一括更新が行われてしまうことにより、編集中レコードが保存出来なくなるという問題が発生してきました。

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

(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さま

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

ご質問の件について、投稿タイトルとは異なる内容のため、新規投稿として再投稿していただけますでしょうか。

お手数ですが、よろしくお願いいたします。

 

加納様

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

ご指摘ありがとうございました。

新規投稿に上げなおしました。

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

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。