作成日から1日以上経過したレコードをレコード一覧から自動で削除する処理を書きたいです。
(function() {
'use strict';
//現在の日付をUNIXタイムスタンプで取得
const now = Date.now() / 1000;
//作成日時から1日経過
const createTime = Date.now((record['測定日時']['value'] / 1000) + 86400);
kintone.events.on('app.record.index.show', function(event) {
// 投稿が1日以上経過しているか判定
if (now >= createTime) {
// 1日以上経過している場合は、投稿を削除する処理を行う
recodelist.remove(recodes);
}
});
})();
上記のようにコードを書きましたが、
const createTime = Date.now((record['測定日時']['value'] / 1000) + 86400);
の行でエラーが出ています。
以下のような書き方も試しましたが、同様のエラーでした。
const createTime = Date.now(((record['測定日時']['value']) / 1000) + 86400);
const createTime = new Date(record['測定日時']['value']);
const createTimeSeconds = Date.now(createTime) / 1000;
よろしくお願いいたします。
sayupaitan さん
こんにちは、気になったので回答させていただきますね。
何点か気になったので以下に箇条書きで書かせて頂きます。
〇気になった点
●now()は恐らく引数指定不可だったはずです。
●レコード一覧画面でレコード情報を取得するためには「 ‘app.record.index.show’(レコード一覧表示後イベント)」の引数の変数eventの情報を使う必要があります。
→ kintone.app.record.get()関数は一覧画面では使用不可です。
参考URL:レコード ID を取得する - cybozu developer network
→sayupaitan さんのコードでは、イベントのスコープ外に書かれていることに加えて、record[‘測定日時’][‘value’]のrecordについて変数で定義できていないため本件のエラーになっております。
参考URL:レコード一覧画面を表示した後のイベント - cybozu developer network
●レコードを削除するためにはkintoneではREST APIを使う必要があります。
参考URL:複数のレコードを削除する - cybozu developer network
色々書かせて頂いて恐らくsayupaitan さんがされたい事がこちらでは確認できているのですが、一度ご自身で答えを導かれた方が今後Kintoneカスタマイズしていくにあたってためになるんじゃないかなと恐縮ですが考えております。
なので、書かせて頂いた内容に対して不明な点があればご返信いただければ都度回答させて頂きますのでよければまたご返事くださいね!
「いいね!」 2
Yuki_Minamitaniさん、ご回答くださりありがとうございます!
また、学習のためにご配慮いただきありがとうございます。
書き直しましたので、見ていただきたいです。また、何点か質問もさせていただきます。
①おっしゃる通り、now()は引数指定負荷でした。測定日取得の方法を変更しました。
②app.record.index.showの引数を指定する必要があると解釈いたしました。
一覧画面を開いたときに現在の日付と測定日時を取得し、1日以上経過している場合は投稿を削除するという意図で書き直しました。
③教えていただき、ありがとうございます。
ほかの箇所のエラーは消えたのですが、ここに関して以下のようなエラーが発生しました。
download.do:30 Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
(download.do:30 Uncaught SyntaxError: awaitは非同期関数とモジュールのトップレベル本体でのみ有効です。)
下記修正後のコードです。
(function() {
'use strict';
kintone.events.on('app.record.index.show', function(event) {
//現在の日付をUNIXタイムスタンプで取得
const now = Date.now() / 1000;
//作成日時から1日経過
const createTime = kintone.app.getFieldElements('測定日時');
// 投稿が1日以上経過しているか判定
if (now >= createTime) {
// 1日以上経過している場合は、投稿を削除する処理を行う
recodelist.remove(recodes);
}
});
})();
const body = {
app: 23,
ids: [],
};
await kintone.api(kintone.api.url('/k/v1/records.json', true), 'DELETE', body);
よろしくお願いいたします。
sayupaitan さん
ご返信ありがとうございます。
ソースコードも書いてくださりありがとうございます!
恐縮ですが、順に回答させていただきますね!
②について
一応こちらが確認した方法だと以下のようにしております。
const records = event.records;
const minus_oneday = new Date();
minus_oneday.setDate(minus_oneday.getDate() -1);
console.log(minus_oneday)
for (let i = 0; i < records.length; i++){
const d1 = new Date(records[i].測定日時.value);
if (d1 > minus_oneday){
//こちらは一日経過していないレコードの処理なので、本当だと何も書かないですが処理がわかりやすいためconsole.log()だけ追加してます。
console.log('まだ一日立っていないレコード')
} else {
//こちらに一日以上経過しているレコードに対しての処理を
console.log('一日以上経過しているレコード')
}
}
軽く解説させて頂きますと、minus_onedayという変数に日付型で現在日時から一日前を取得しております。
一覧画面でevent変数など確認すると配列でレコード情報が入ってるのが確認できるかと思われます。
そのためfor()などで繰り返して「測定日時」を判断する必要があるので、上記のように繰り返して測定日時と一日前に取得した日時を見比べております。
③について
エラー内容ですが、await使うならasync指定しなさいってことですね…
RESTAPIをawait(下記に参考リンク)でされる際に必ず実行される関数ではasyncを指定してあげる必要があります。
今回の場合だとこんな感じです!
//funcitonの前にasyncを追記
kintone.events.on('app.record.index.show', async function(event) {
const body = {
app: 23,
ids: [],
};
await kintone.api(kintone.api.url('/k/v1/records.json', true), 'DELETE', body);
});
参考リンク:https://cybozudev.zendesk.com/hc/ja/articles/900001244323-目指せ-JavaScriptカスタマイズ中級者-2-Promiseのかわりにasync-await編-?_ga=2.2978103.649166314.1692574618-923425052.1689224001
ちなみに変数bodyの配列の中身にids: とあると思いますが、そちらに削除したいレコード番号を入れてあげればRESTAPIで実行してレコード削除 という流れですね。
配列に入れる方法は外部のリンクですが下記のリンクを参考(恐らくここが一番わかりやすいかと…)にしてみてくださいね!
参考リンク:JavaScriptでpushを使って配列に要素を追加する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
以上駆け足的な解説になってしまいましたが、またご不明点があればおっしゃってくださいね!
「いいね!」 1
Yuki_Minamitaniさん、いつも丁寧なご回答とご説明ありがとうございます!
少し時間はかかりましたが、なんとか実装することができました!
助かりました、ありがとうございます!!!
@sayupaitan さん
無事できたようでよかったです!
もし可能であれば、お答えいただければなのですが、以下のコードってどうなりましたか??
// 投稿が1日以上経過しているか判定
if (now >= createTime) {
// 1日以上経過している場合は、投稿を削除する処理を行う
recodelist.remove(recodes);
}
動きとして読めないのでどうなったのかなと…
「いいね!」 1
ありがとうございます!
その箇所なのですが、当初想定していたものと書き方を変更して対応しました。
元:もしレコードの作成日から1日以上経過していたら、レコードを削除
新:1日以上経過したレコードを取得→もし1日以上経過したレコードがあればそれを削除
うまく説明できず申し訳ございません、、
このように、if文のところは考え方を変えて対応しました!
「いいね!」 1
system
(system)
クローズされました:
2023 年 8 月 28 日午前 8:14
8
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。