1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

筋トレ習慣化のためのリマインドメールをGASで実現する

Last updated at Posted at 2021-06-16

筋トレ。習慣化できてますか?

筋トレ。やろうと思い立ってなかなか習慣化できないですよね。私も大抵3日坊主でなかなか続きませんでした。。

そんな私が鈴木達也さんの「PRIDE BODY」というプログラムに出会って、
**1カ月間毎日筋トレが続いてます。**すごくないですか?

詳しくは、鈴木達也さんの「PRIDE BODY」でググってみてもらえば分かるのですが、
「筋トレメニューをメールで毎日リマインドする」
という仕組みがあって、私にはそのやり方が非常にマッチしていたようです1

今回はこのメールでリマインドする仕組みを、GoogleAppScript(GAS)で実現してみたので、備忘録として残します。

やりたいこと

事前にスプレッドシートに準備しておいたコンテンツをメールで配信するだけです。
簡単な構成図はこちら。
構成図.png

実装

早速実装の中身の話です。

スプレッドシート例

配信するコンテンツの情報を事前にスプレッドシート上に作っておきます。
SS例.png

  • B列:リマインドしたい日付を入力します。
  • C列:リマインドメールの送信者の名前を定義します。2
  • D列:リマインドメールの宛先を定義します。
  • E列:リマインドメールの件名を定義します。
  • F列:リマインドメールの本文を定義します。動画のリンクなどはここに乗せるイメージ。

スクリプト

スクリプト上にコメントは残しているので詳細な説明は省きますが、
強いて言えば、getContentsByDate()の中でAPIアクセスを極力減らすことを目的として、スプレッドシートの中身を2次元配列に取得しているのはポイントです。
※実際に試すとき用にコンソールログはコメントアウトして残してます。

コード.gs
function reminder() {
  // スプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  // シートを取得
  const sheet = ss.getSheetByName('リマインド内容');

  // 今日の文字列(yyyymmdd形式)を取得
  const today = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyyMMdd');
  // 今日のコンテンツを探す。
  const content = getContentsByDate(sheet, today, 2);
  // console.log(content);

  // コンテンツが取得できなかったら処理を終了する。
  if ( content === null ) {
    throw new Error('コンテンツが設定されていないようです。スプレッドシートに追加してください。');
  }

  // メール送信
  sendMail(
    content[2],  // sender
    content[3],  // email
    content[4],  // subject
    content[5]   // body
  );
}

function sendMail(sender, email, subject, body) {
  // console.log(`sender: ${sender}`);console.log(`email: ${email}`);console.log(`subject: ${subject}`);console.log(`body: ${body}`);
  // メール送信
  GmailApp.sendEmail(email, subject, body, { name : sender } );
}

function getContentsByDate(sheet, date, col) {
  // 極力APIアクセスを減らすため、スプレッドシートの中身を2次元配列に取得。
  const contents = sheet.getDataRange().getValues();

  // 1行ずつループして、今日日付のコンテンツが見つかったら配列ごと返却
  for (let i=1 ; i<contents.length ; i++) {  // 0はヘッダになるので、iの初期値は1としている。
    const searchDate = Utilities.formatDate( contents[i][col-1], 'Asia/Tokyo', 'yyyyMMdd');
    // console.log(searchDate);console.log(date);
    if(searchDate === date) {
      return contents[i];
    }
  }

  return null;
}

トリガー

最後にスクリプトを毎日実行するためのトリガーを定義すれば完成です。

  1. スクリプトエディタの左側のメニュー「トリガー」を押下します。
  2. 右下の「トリガーを追加」ボタンを押下します。
  3. トリガーの設定を添付画像を参考に設定します。
    ポイントは、イベントのソースを選択を「時間主導型」にすることです。こうするとで指定した時刻(今回の場合は午前7時~8時)にリマインドメールを送ってくれるようになります。
  4. 保存ボタンを押下します。

trigger.png

おわりに

「最近昔みたいにガンガン働けなくなってきたな…」とか「お腹周りに貫禄が出てきたな…」とか思ってるアラサーのあなた。
これを機に筋トレを習慣化して、健康的な身体を手に入れてみませんか?

  1. 継続できた理由として、メールでのリマインドだけじゃなく、もちろん「PRIDE BODY」のコンテンツ力も大きいと思ってます。

  2. 毎回変わるものでもないので、GAS上に直接定義してもよいですね。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?