お世話になっております。
「残日数の自動更新について」で江田様のコードでやってみました
↓江田様のコード
(function() {
"use strict";
kintone.events.on('app.record.index.show',function(event){
varchanged =false;
vargetBody = {
"app": kintone.app.getId(),
};
kintone.api(kintone.api.url('/k/v1/records',true),'GET', getBody,function(resp) {
varrecords = resp["records"];
varputBody = {
"app": kintone.app.getId(),
"records":[]
};
records.forEach(function(record){
vardate1 =newDate();
vardate2 =newDate(record.日付.value);
varDiff = date2.getTime() - date1.getTime();
vardays =Math.floor(Diff / (1000*60*60*24) +1);
putBody.records.push({
"id": record.$id.value,
"record": {
"残り日数": {
"value":days
}
}
});
if(days != record.残り日数.value){
changed =true;
}
});
if(changed){
kintone.api(kintone.api.url('/k/v1/records',true),'PUT', putBody,function(){
location.reload();
});
}
});
});
})();
うまく更新できるようになったものの、今日が更新されるタイミングがGMTで認識しているせいか、午前9:00に更新されています
とりあえず
var date1 = new Date();
の部分を
var date1 = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
に変えてやってみましたが、0:00にうまく更新されませんでした
①これを日本時間で今日になるタイミングで更新させたいのですが、どのように書いたらいいのかどなたかアドバイスいただきたいです。
②あと
日付フィールドAから今日の日付との差分を計算して残日数文字列フィールドAに表示
日付フィールドBから今日の日付との差分を計算して残日数文字列フィールドBに表示
日付フィールドCから今日の日付との差分を計算して残日数文字列フィールドCに表示
と複数ある場合、江田様のコードのどの部分にどう付け加えたらよいでしょうか?
どのように書いたらいいのかどなたかアドバイスいただきたいです。
まだ初心者なので、簡単なことかもしれませんがご容赦いただきたいです
よろしくお願いします
Miyawaki 様
ご提示のサンプルソースコードは定期的に自動実行するプログラムではなく、レコード一覧画面が表示されたタイミングで実行します。
kintone.events.on( **'app.record.index.show',**
午前9:00実行されるというのは、その時間に誰かがレコード一覧を開いたからです。
kintoneでは定時実行の仕組みがありませんので、外部サービスを利用する必要があります。
次の記事はご参考になると思います。
* 定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜
* 定期実行でデータの同期を実現するスマートな方法 その2〜AWS Lambda編〜
* Lambdaの定期実行とNode.js SDKを使って別ドメインのアプリとデータを同期する
* 第8回 バックアップの処理を定期実行してみよう
* kintoneとMicrosoft Azureを連携してみよう (Azure Functionsその2)
>②
次のように単純に日付の計算処理を繰り返すだけです。
var date1 = new Date(); ←現在日付
var dateA = new Date(record.日付A.value); **←日付Aの値**
var dateB = new Date(record.日付B.value);
var DiffA = dateA.getTime() - date1.getTime(); ←日付A ー 現在日付 = 差異
var DiffB = dateB.getTime() - date1.getTime();
var daysA = Math.floor(DiffA / (1000 * 60 * 60 *24) + 1); ←差異をDaysに変換
var daysB = Math.floor(DiffB / (1000 * 60 * 60 *24) + 1);
putBody.records.push({
"id": record.$id.value,
"record": {
"残り日数A": {
"value":daysA
},
"残り日数B": {
"value":daysB
}
akika様
コメントバックありがとうございます
まず①に関しては
私のご説明が足りませんでした。もう少し補足させていただきますと
午前9:00前にindex.showをすると更新されず
午前9:00後にindex.showをすると更新されたことが確認できたことから
更新の切り替えが午前9:00と気づきました。
なので定期実行すれば便利なのかもしれませんが、0:00に定期実行させたとしても、おそらく切り替わらないと思われます。あとそこだけ何とか直ればこちらの思うような動きになります。
日付Aはkintoneの日付形式でYYYY-MM-DDの表示形式になっているのがもしかしたら起因しているのかもしれません。
この補足を踏まえてもう一度お返事いただければありがたいです
②に関しては
もうすこし詳しく確認しますが、if以下はどのように書けばよいでしょうか?そこも書き方をご教示いただければ幸いです
if(days != record.残り日数.value){
changed = true;
}
});
以上よろしくお願いいたします。
Miyawaki 様
>更新の切り替えが午前9:00と気づきました
UTCの時間が使われているからだと思います。
UTC 0:00(日本時間9:00)を過ぎると、日付が変わり、指定した日付フィールドと現在日付の差分ができて、レコード一覧を表示したら更新が行われます。逆に、UTC 0:00(日本時間9:00)前は更新するものがないので、一覧画面を表示しても何も変わりません。
定期実行させるにはOSや外部サービスと連携して、実行時間を日本時間0時に指定することができます。
例えば、
次はNode.jsを使う場合の指定方法になります。
https://www.npmjs.com/package/node-cron
AWSの場合は次のようになります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
②について
IF分では、現在の日付と比べ差分が出たフィールドがあった場合、フラグを立てることをやっているので、
差分があるかどうかを判断したいフィールドを||(or)で繋げてあげばと思います。
if(daysA != record.残り日数.value || daysB != record.残り日数.value){
changed =true;
}
});
Miyawaki 様
こんにちは。
また、akika 様よこから失礼いたします。
原因は、9時間の差分が出ているので間違いはないです。
それをどのように対応しすれば良いかとのことですが、原因を特定してみましょう。
// 本日2022/07/12の午前8時の値と考えてください
// recode.日付.value の値は "2022-07-22"
var date1 = new Date(); // 2022-07-11T23:00:00.000Z
var date2 = new Date(record.日付.value); // 2022-07-22T00:00:00.000Z
上記のような結果になります。
日付が変わった時間から調整したいのであれば、.getTime をした値をどちらかに±9時間分の調整をすればよいですよ。
例えば、date1を調整する場合は+9時間します。又は、date2を調整する場合は-9時間します。
もしくは、計算した結果に調整するとかですかね。
今回は、計算結果の差分が9時間多いのが結果に影響を及ぼしているので、以下のような方法で対処してみましょう。
// 9h = 9 * 60 * 60 * 1000 = 32400000ms
const timezoneOffset = date().getTimezoneOffset() * 60 * 1000; // -32400000ms
var Diff = date2.getTime() - date1.getTime() + timezoneOffset;
このような改善方法でよいのではないでしょうか。
akika様
再三にわたりコメントバックしていただき本当にありがとうございます
①の件で定期実行の提案の案内ありがとうございました。
なにぶん初心者な為勉強したらいずれわかると思いますが、私にはまだakikaさんが案内していただいたことが何をあらわしているのか理解できないでいます。せっかく案内していただいたのに知識不足で申し訳ありません。
できれば、この構文を利用して、この構文上にUTCで動いているのをJSTで動かす方法をご教授いただければとおもいます。
②の件では「差分があるかどうかを判断したいフィールド」を条件に動かしているということと理解できました。
日付が変われば必ず一つは変わるはずなので、アドバイスいただいたorでつなげることもやってみますが、ひとつの条件でも作動するかどうか試してみようと思います。
akikaさん本当にありがとうございます。
新屋様
コメントバックいただきましてありがとうございます。
私もその+9時間や-9時間といったやり方を模索していたところでした
ただ、もともとがUTCであるがために日付が変わったという認識が+9時間や-9時間といったことを入れても果たして反応するかどうか半信半疑でしたので、akikaさんの言うような定期実行構文を入れる必要があるのか・・・、でもわからないしなぁ・・・まいったなぁ・・・と少し諦めかけていました。
いただきました改善方法大変参考になりました。
とりあえずやってみて、明日どういう反応になっているか確認しようと思います。
本当にありがとうございます。
Miyawaki 様
私もおそらくでお答えしてるので試していただけると幸いでございます。
また、ちょっとソースを間違えていましたので訂正をさせて下さい。
const timezoneOffset = date().getTimezoneOffset() *60*1000;
上記ではなく
const timezoneOffset = new Date().getTimezoneOffset() *60*1000;
ですね。
間違えてしまい申し訳ございませんでした。
新屋様
お世話になっております
今日どうなっているかを確認しましたところ、動作すらしていなくてソースを確認しましたところ、ソースに脱字があり正確に動作を確認できなかったので、また翌日に動作確認いたします。申し訳ありませんが、明日また私からの返事のコメントバックいただきたいと思いますので、よろしくお願いいたします
新屋様
お世話になっております
今日どうなっているかを確認しましたところ、無事にこちらが思うような正確な動作を確認できました。
アドバイスいただきまして本当に助かりました。ありがとうございました。また機会がありましたらよろしくお願いいたします。
Miyawaki 様
おはようございます。
ご丁寧にご報告ありがとうございます。
私も検証をしておりませんので、無事に動作したとのことで安心しました。
また機会がありましたら、こちらこそ宜しくお願いいたします。
system
(system)
クローズされました:
2025 年 6 月 2 日午前 1:20
12
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。