ライフは素晴らしいスーパーマーケットで、私も日常的に利用しています。ライフに行くまではスーパーの総菜や弁当などは美味しくないというイメージがあったのですが、ライフの総菜はバリエーションも豊富ですし、特に刺身などの魚系は下手な居酒屋に行くより全然良いので重宝しています。

動機


さて、タイトルについてですが、なぜこんなプログラムを書こうと思ったのでしょうか??

今日はライフ某店に行ったんですが、店に入った瞬間に「あっ…」という気持ちになりました。人が多いんですね。そうか、今日はポイントデーです。私はこのブログでポイントが好きくないことは何回も書いているんですが、そうです。ポイントがあると店が混む。店が混むというということはレジが混むということで、これが本当に好きくないというのもあってポイントが好きくない[1]んですね。

それで、レジに並んでいた時に閃いてしまったんですね。「ポイントデーに訪店しなければよい」という事実に…。天才かよ。んで、さらに閃いたんですね「どうせ一定の規則でポイントデーが設けてあるはずだから、プログラム書いたらわかるのでは?」ということに…。天才かよ。さらに「Googleカレンダーに放り込めばよくない??」と思った。もう天才だよ!!!

というわけで雑にコードを書いた。ただ、GoogleカレンダーのAPIは使ったことないので実装するにはもう少し時間が必要。なので、とりあえず指定した店舗のポイントデーをコンソールに表示するようなコードを書いた。

コード


まず、ライフは店舗ごとに異なるポイントデーが設定してあるようで、店舗に応じたポイントデーを設定してやる必要があるのがわかった。ので、ファイルを用意して下記のようなJSONを用意した。

このファイルに自分が知りたい店舗のポイントデーを設定すればよい。もちろん複数店舗可能だ。どの店舗がいつポイントデーなのかは店舗情報で対象店舗を探せばわかる。LCカード60歳以上優待はおそらく全店舗共通だ。たぶん。

1
[
2
  {
3
    "storeName": "全店舗",
4
    "campaignName": "LCカード",
5
    "days": [7,17,27],
6
    "weekDays": []
7
  },
8
  {
9
    "storeName": "全店舗",
10
    "campaignName": "60歳以上優待",
11
    "days": [1,15],
12
    "weekDays": []
13
  },
14
  {
15
    "storeName": "x店",
16
    "campaignName": "ポイント2倍",
17
    "days": [],
18
    "weekDays": ["水曜日","日曜日"]
19
  }
20
]

後はコードは雑にこんな感じにした。とりあえず一年先まで表示することにした。

1
'use strict';
2
3
const fs = require('fs');
4
const pointDays = JSON.parse(fs.readFileSync('./pointDays.json'));
5
6
let currentDate = new Date();
7
let toDate = new Date();
8
9
toDate.setFullYear(currentDate.getFullYear() + 1);
10
11
while(toDate > currentDate) {
12
  const a = pointDays.filter((x) => x.days.includes(currentDate.getDate()));
13
  const b = pointDays.filter((x) => x.weekDays.includes(new Intl.DateTimeFormat('ja-JP', { weekday: 'long'}).format(currentDate)));
14
15
  a.forEach((x) => {
16
    console.log(`${currentDate.toLocaleString()} は [${x.storeName}] で [${x.campaignName}] デーです。` )
17
  })
18
  b.forEach((x) => {
19
    console.log(`${currentDate.toLocaleString()} は [${x.storeName}] で [${x.campaignName}] デーです。` )
20
  })
21
  currentDate.setDate(currentDate.getDate() + 1);
22
}

実物はここに置いてある

実行する


これを実行すると、下記のようにどの店舗でいつポイントデーがあるのかが一年先まで表示される。

1
[2019/11/13 20:12:22] は [x店] で [ポイント2倍] デーです。
2
[2019/11/15 20:12:22] は [全店舗] で [60歳以上優待] デーです。
3
[2019/11/17 20:12:22] は [全店舗] で [LCカード] デーです。
4
[2019/11/17 20:12:22] は [x店] で [ポイント2倍] デーです。
5
[2019/11/20 20:12:22] は [x店] で [ポイント2倍] デーです。
6
[2019/11/24 20:12:22] は [x店] で [ポイント2倍] デーです。
7
[2019/11/27 20:12:22] は [全店舗] で [LCカード] デーです。
8
...
9
[2020/11/1 20:12:22] は [x店] で [ポイント2倍] デーです。
10
[2020/11/4 20:12:22] は [x店] で [ポイント2倍] デーです。
11
[2020/11/7 20:12:22] は [全店舗] で [LCカード] デーです。
12
[2020/11/8 20:12:22] は [x店] で [ポイント2倍] デーです。
13
[2020/11/11 20:12:22] は [x店] で [ポイント2倍] デーです。

今後やりたいこと


GoogleカレンダーにAPIで放り込みたい。

console.logのところでAPIを叩けばよいだけなので、大したことはないけどGoogleカレンダーAPIを使ったことがないので少し時間がいる。後はポイントデーが変更になったときのために、削除用のコードも用意したい。

GitHubに上げてるので誰かPR出してくれ頼む。


  1. もちろんこれ以外の理由もあって好きくない ↩︎