【GAS】賞味期限切れリマインドメール・LINEbotを作って夫婦生活を楽にしてみた


# はじめに

我が家では3,4ヶ月ごとに以下のやりとりが発生することがあります。

![スクリーンショット 2023-04-13 8.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/e9b13f9c-336e-28b5-f97f-cf825c98f194.png)


このやりとりが発生する度に家の中の調味料を洗い出し、夫と2人で賞味期限チェックをしています。
最近チェック時間が非常に面倒に感じてしまい、なんとか改善したいなぁと思っていたのですが、夫婦で共有できるシステムが中々なく、専用のアプリを落とすのも嫌なので
**合うのがないなら作ろう** 精神で今回作成しました。


#### こちらの記事の対象者

* 特定のグループLINEに定時リマインドを送りたい人
* 賞味期限を切らしがちな人
* 賞味期限の確認という面倒な行為が嫌いな人

# 何を作るか

月初に賞味期限切れのものをチェックし、特定のアドレス・グループLINEに通知を送る

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/151ed61f-5780-4b56-d194-065fa72507fb.jpeg">


<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/5ca8615c-d3e8-c9a7-b03a-6bfee547b410.jpeg">



# LINE Developerアカウント・LINE Bot・スプレッドシート・ID取得の準備

以前投稿していた記事に事前準備を記載していたため今回は割愛させていただきます。

* [【GAS】推しのためにWeb人気投票リマインドLINEbotを作ってみた](https://qiita.com/Motchy_1204/items/788f5a61f2cdaada0da3)


スプレッドシートは以下のように準備をしました。


<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/755dbe28-24b0-04ae-0602-38da8e513479.png">



今回はメール送信とLINEメッセージ箇所のコードのみを記載いたします。


```javascript
// 賞味期限切れのチェックとメール送信文の作成
function check_seasoning_expiration_date() {

  // 調味料データが書き込まれているスプレッドシート
  const spreadsheet_url = '自身のスプレッドシートのURL'

  // 調味料データが書き込まれているシート名
  const sheet_name = '賞味期限リスト';

  // 通知先のメールアドレスをセット
  const mail_to = '自身のメールアドレス';

  // スプレッドシートを取得
  const ss = SpreadsheetApp.openByUrl(spreadsheet_url);

  // シートを取得
  const sheet = ss.getSheetByName(sheet_name);

  // 書き込まれているデータを取得する
  const values = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();

  // 本日の日付を取得する
  const date_today = new Date();
  // 本日の日付から2ヶ月後を設定
  date_today.setMonth(date_today.getMonth() + 2);

  // 2ヶ月以内で期限が切れる調味料を格納する配列を宣言
  const items = [];

  // シートのデータを1行ずつ処理する。
  for (let i = 1; i < values.length; i++) {

    // 賞味期限を判定する。2ヶ月以内に切れる調味料があればメール送信用の文章を組み立てる
    if (values[i][2] < date_today) {

      let item = values[i][0];
      // 保管場所が分からなくなる場合は保管場所も送信する
      // let location = values[i][1];
      let expire_date = Utilities.formatDate(values[i][2], 'JST', 'yyyy/MM/dd');
      items.push('[' + item + '] ' + ' 期限:' + expire_date);
    }
  }

  // メール本文を作成する
  let mail_body = '以下の賞味期限が切れそうです！\n\n';
  mail_body += items.join('\n');

  // メール送信を実行する
  GmailApp.sendEmail(mail_to, '賞味期限アラート', mail_body);
  // LINE送信のために格納
  line_body = mail_body
}

// LINEのメッセージを送信する
function postMessage() {
  const url = 'https://api.line.me/v2/bot/message/push';
  const token = access_token; //チャネルアクセストークン
  check_seasoning_expiration_date()

  const payload = {
    to: line_to,　 //ユーザーID
    messages: [
      { type: 'text', text: line_body }
    ]
  };

  const params = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + token
    },
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(url, params);

}
```

コードの記載が完了しましたら**実行**を押下し、正しくメソッドが動いているかテストを行います。
![スクリーンショット 2023-04-08 9.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/6205e07c-69b8-5b90-3353-a9775f1efcae.png)

LINEbotからグループLINEへpush通知・メールが届けば成功です！

次に定期実行のためのトリガー設定を行います。

* [【GAS】推しのためにWeb人気投票リマインドLINEbotを作ってみた_トリガーの設定](https://qiita.com/Motchy_1204/items/788f5a61f2cdaada0da3#%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E8%A8%AD%E5%AE%9A)

実行する関数を選択： pushMessage
実行するデプロイを選択: 最新バージョン
イベントのソースを選択: 時間主導型
時間ベースのトリガータイプを選択: 月ベースのタイマー
日付を選択:　1日


「保存」ボタンを押下
これでトリガーが設定されました。

設定した日付にメール・LINEbotからグループLINEへpush通知がくれば成功です！

# おわり

前回似たような開発を行っていたため、今回は1時間程度で作成できました。
POCなのでエラーハンドリング不足なところもありますが、運用にはのせられそうです。
実家にいた際は家事を全くしてこなかったため、どんどん効率化できるものはしていきたいですね。


# 余談

今回は時間がとれず作りきれなかったですが、 [Flex Message](https://developers.line.biz/ja/docs/messaging-api/using-flex-messages/#page-title)を使用し、調味料の状況管理もしていきたいと考えています。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308698/f3346e6d-c851-daea-c243-ebeeacd40fff.jpeg">

システム化のご相談がございましたら、お声がけくださいませ。

https://www.i-enter.co.jp/


# 参考
* [【GASで防災】備蓄品の賞味期限切れを通知する](https://myfunc.jp/items/00069/index.html)
* [Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/)


# 画像・イラスト元
* [ヒューマンヒストグラム2.0](https://pictogram2.com/)
* [いらすとや](https://www.irasutoya.com/)