新規投稿
フォローする

残日数の自動更新について2

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

「残日数の自動更新について」で江田様のコードでやってみました

↓江田様のコード

(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 date1 = new Date();
var date2 = new Date(record.日付.value);
var Diff = date2.getTime() - date1.getTime();
var days = 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に表示

と複数ある場合、江田様のコードのどの部分にどう付け加えたらよいでしょうか?

どのように書いたらいいのかどなたかアドバイスいただきたいです。

 

まだ初心者なので、簡単なことかもしれませんがご容赦いただきたいです

よろしくお願いします

 
0

10件のコメント

Avatar
akika

Miyawaki 様

ご提示のサンプルソースコードは定期的に自動実行するプログラムではなく、レコード一覧画面が表示されたタイミングで実行します。

kintone.events.on('app.record.index.show', 

午前9:00実行されるというのは、その時間に誰かがレコード一覧を開いたからです。
kintoneでは定時実行の仕組みがありませんので、外部サービスを利用する必要があります。
次の記事はご参考になると思います。

* [定期実行でデータの同期を実現するスマートな方法 その1〜cli-kintone編〜
](https://developer.cybozu.io/hc/ja/articles/217964263)
* [定期実行でデータの同期を実現するスマートな方法 その2〜AWS Lambda編〜](https://developer.cybozu.io/hc/ja/articles/115001954206)
* [Lambdaの定期実行とNode.js SDKを使って別ドメインのアプリとデータを同期する
](https://developer.cybozu.io/hc/ja/articles/360016318251)
* [第8回 バックアップの処理を定期実行してみよう
](https://developer.cybozu.io/hc/ja/articles/115003155026)
* [kintoneとMicrosoft Azureを連携してみよう (Azure Functionsその2)
](https://developer.cybozu.io/hc/ja/articles/217937783)

 

>②

次のように単純に日付の計算処理を繰り返すだけです。

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により編集されました
1
Avatar
Miyawaki

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により編集されました
0
Avatar
akika

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;
}
});
0
Avatar
新屋 育男

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;

このような改善方法でよいのではないでしょうか。

1
Avatar
Miyawaki

akika様

再三にわたりコメントバックしていただき本当にありがとうございます

①の件で定期実行の提案の案内ありがとうございました。

なにぶん初心者な為勉強したらいずれわかると思いますが、私にはまだakikaさんが案内していただいたことが何をあらわしているのか理解できないでいます。せっかく案内していただいたのに知識不足で申し訳ありません。

できれば、この構文を利用して、この構文上にUTCで動いているのをJSTで動かす方法をご教授いただければとおもいます。

②の件では「差分があるかどうかを判断したいフィールド」を条件に動かしているということと理解できました。

日付が変われば必ず一つは変わるはずなので、アドバイスいただいたorでつなげることもやってみますが、ひとつの条件でも作動するかどうか試してみようと思います。

akikaさん本当にありがとうございます。

0
Avatar
Miyawaki

新屋様

コメントバックいただきましてありがとうございます。

私もその+9時間や-9時間といったやり方を模索していたところでした

ただ、もともとがUTCであるがために日付が変わったという認識が+9時間や-9時間といったことを入れても果たして反応するかどうか半信半疑でしたので、akikaさんの言うような定期実行構文を入れる必要があるのか・・・、でもわからないしなぁ・・・まいったなぁ・・・と少し諦めかけていました。

いただきました改善方法大変参考になりました。

とりあえずやってみて、明日どういう反応になっているか確認しようと思います。

本当にありがとうございます。

1
Avatar
新屋 育男

Miyawaki 様

私もおそらくでお答えしてるので試していただけると幸いでございます。

また、ちょっとソースを間違えていましたので訂正をさせて下さい。

const timezoneOffset = date().getTimezoneOffset() * 60 * 1000;

上記ではなく

const timezoneOffset = new Date().getTimezoneOffset() * 60 * 1000;

ですね。

間違えてしまい申し訳ございませんでした。

0
Avatar
Miyawaki

新屋様

お世話になっております

今日どうなっているかを確認しましたところ、動作すらしていなくてソースを確認しましたところ、ソースに脱字があり正確に動作を確認できなかったので、また翌日に動作確認いたします。申し訳ありませんが、明日また私からの返事のコメントバックいただきたいと思いますので、よろしくお願いいたします

1
Avatar
Miyawaki

新屋様

お世話になっております

今日どうなっているかを確認しましたところ、無事にこちらが思うような正確な動作を確認できました。

アドバイスいただきまして本当に助かりました。ありがとうございました。また機会がありましたらよろしくお願いいたします。

1
Avatar
新屋 育男

Miyawaki 様

おはようございます。

ご丁寧にご報告ありがとうございます。

私も検証をしておりませんので、無事に動作したとのことで安心しました。

また機会がありましたら、こちらこそ宜しくお願いいたします。

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