Google Apps Scriptを使い、Googleカレンダーの予定の中で、特定の文字列が含まれる“当日の終日イベント予定”のみをメール通知する方法

Googleカレンダー - よく忘れるてしまう朝の予定 Google Apps Scripts(GAS)

GAS系の記事はどうしてもタイトル長くなっちゃいますね・・・。

この記事では、Google Apps Script(GAS)を使って、特定の文字列(例えば「朝」とか「人の名前」とか「MTG」とか)を含む“当日の終日予定”だけを、なんらかの形で自分に通知する方法をご紹介します。今回の場合、通知にはメール送信を使っています。

他にもLINEに通知したり、Slackに通知したり、Chatworkに通知したりと応用すれば色々できると思いますが、今回はとりあえずサクッと作りたかったのでそこら辺の内容はご用意してません。
もし要望があれば時間ある時に記事書きたいと思います。

2017/08/14追記:予定がない場合にも空っぽの内容で通知メールが届いていたのでコードを若干修正しました。

長々として解説はいいからコードだけ見せて!って方は本ページ下部にコピペ用のコードがありますので、途中の内容はすっとばして見てください。

そもそもなぜこれをやろうと思ったか

そもそもなぜこんなことやろうと思ったかなんですが、その理由はズバリ僕が「朝やる予定だったタスクをど忘れするのをなくしたかった」からです。

これを説明するために、僕のGoogleカレンダー使用法を説明したいと思います。

タスク管理ツールとしてのGoogleカレンダー

僕は基本的にGoogleカレンダーを「タスク管理ツール」として使っています。実際に僕のGoogleカレンダーを見てみるとこんな感じ。

Googleカレンダー

※タスク管理表としてのGoogleカレンダー

ここに入れてある予定はこのブログ用に適当に用意したものですが、基本的に1タスク=1終日イベント、という形で予定(タスク)を作成し、その日にやるタスクをすべて書き出しておいて、完了したものには「✔」マークをつけていく、というように管理しています(ちなみに「ずみ」と入力すると「✔」という文字が出るように辞書登録しています)。なぜわざわざ終日予定にするか?ということについては、その方が一覧性があり見やすいからです。

ちなみに色分けは、

  • 紫=仕事・ビジネス
  • 黄色=プライベートな予定
  • オレンジ=自己成長につながることや中長期的なタスク

みたいな感じに分けていて、「★」マークがついているものは優先度が高いもの、という風に使い分けています。

あるタスクの中で細かいタスクがたくさん発生する場合は、一つのタスク(終日予定)を作成して、その中の「説明」欄に細かなタスクをすべて書き出して、同じように✔マークをつけながらやっつけていってます。

Googleカレンダー - 細かいタスクが多い予定の場合の書き方

※細かいタスクが多い予定の場合の書き方

こんな感じ。この管理方法自体は管理もラクで気に入っていて、もうかれこれ7、8年続けています。ちょっと話が横道にそれましたが、こんな感じでGoogleカレンダーを使っています。

問題点:朝のタスクが完了出来ない

この方法は予定とタスクの一元管理が出来て非常に便利なのですが、一つだけ問題点がありまして、それは「朝のタスクが完了出来ない」=「よく忘れてすっとばしてしまう」ということでした。まあこれはタスク管理法の問題というより私のズボラさに起因する問題点なのですが、これにはちょっと困っていました。

Googleカレンダー - よく忘れるてしまう朝の予定

※よく忘れるてしまう朝の予定

朝の予定というのは、さきほどの画像でいうと11/7(火)の「朝〜区役所行って住民票を発行」というような予定のことです。こいつをよく忘れて実行できずにいました。

なぜ「朝の予定」を忘れてしまうのか

なぜ朝の予定を忘れてしまうのかですが、それは僕がタスクチェックをするタイミングに原因があります。僕はなるべく家に帰ったらPCや携帯、仕事の予定からは離れていたいので、基本的にオフィス出てから次の日の朝またオフィスに行くまで、仕事の予定を確認したくないんですね。仕事の予定はすべてGoogleカレンダーにありますので、仕事の予定を確認したくない=家に帰ってからはGoogleカレンダーにアクセスしない、ということになります。

もちろんスマホでもGoogleカレンダーを同期しているので、予定を確認しようと思えばできるのですが、前述の通り一旦仕事からは離れたいので必要がない限りは基本見ません。

ここで一つ問題が発生します。

Googleカレンダーには、仕事だけでなく細々とした用事や片付けたいと思っていたプライベートな雑事なども入れています。ところが仕事後はGoogleカレンダー見たくないので、そいつらにもアクセスしなくなっちゃうんですね。そうなると、オフィスを出てから、次の日またオフィスに来るまでの間にこなさなければならないタスク(用事など)に対する意識が希薄になります。

特に「朝の予定」限って忘れやすい理由

それでも、夜のタスクやその日の帰宅後にやるタスクは、仕事場でMacbookを閉じる前に確認できるのであまり忘れることもないのですが、翌日の朝にやろうと思ってたことは一夜隔てていることもあり、結構な頻度で忘れ去られます。必須じゃない予定の場合は特に。

あと朝は家を出る前はバタバタしていることが多いですし、「起きたらとりあえず服着て家を出る」みたいな生活してる僕は、必須じゃない用事のことはすっかり忘れちゃってるわけですね。

通知で解決しよう!しかし・・・

じゃあ朝起きた後、用事があるときだけ家を出る前に通知が来るようにすればいいや!
ということで朝の予定を通知させることにしたのですが、そこでさらに2つの問題がありました。

<問題点1> 毎回通知設定するのは面倒くさい。

終日予定をタスク管理代わりにしている僕は、終日予定を作る際に細かい設定はしたくありません。通常のタスク管理ツールと同様なるべく「サクッと作ってサクッと管理したい」んですよね。なので、予定を作る際タイトル欄&説明欄は使いますが、それ以外の欄はあまり触りたくないんです。通知欄も触りたくない。

そんなわけで必要な時に毎回通知を考えるのは面倒くさいのでできれば避けたい所。

また、そもそもGoogleカレンダーにはデフォルトで通知させる機能もありますが、普段は通知してもらわなくて別にいいんですよね。必要な時に必要な予定にだけ自動で通知機能をつけるようにしたい。

<問題点2> そもそも終日予定イベントに対しては、GASで当日通知をできない?

一番の問題点はこれ。Googleカレンダーの標準機能では、終日イベントについて当日時間指定で通知する機能は一応あるっちゃあるんですが、問題点1で指摘したように自分で通知設定したくなっていうのが一つ。あとはGoogle apps scriptsで用意されてるCalender Eventのリマインダースクリプトでは、基本的に終日イベントの場合は当日の指定時間に通知するということができないんですよね(多分…違ったら教えてください)。これちょっと技術不足のせいかもしれませんが。

というわけで、問題点1と2を解決すべく、Google apps scriptを使いながらも必要なときだけ自動的にリマインドメールくれる実装することにしました。

どういう動きにしたいか

今回解決したいのは「朝の予定を忘れないようにする」ということだけなのでそこにフォーカスします。

僕は朝やらなきゃいけない用事は「朝〜◯◯をする」「午前中〜◯◯をする」みたいな感じで書くことが多いので、「予定の文字列に“朝”という文言を含む“終日の予定”がある場合のみ午前7時頃にメール通知する」、という実装を考えました。

本当はポップアップリマインダーとかにしたかったのですが前述の通りGoogle apps scriptのカレンダーのリマインダー機能では「終日予定の当日通知ができない」様子だったので、GAS自体には該当の終日予定を取得してメール送付する機能のみを持たせて、実行時間の制御はGASのトリガー側に設定することで実装しました。

ソースコード

というわけでGAS用のソースコードはこちら。

function morningReminder() {
  //全てのカレンダーを配列として取得
  var calendars = CalendarApp.getAllCalendars();

  // 情報格納用の引数を定義
  var text = "【今日の朝やんなきゃいけないこと】" + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + "\n";
  var num = 1;

  // 取得したカレンダー群から単体のcalenderを取得(calendersに対するループ処理)
  for(i in calendars) {
    var calendar = calendars[i]; // カレンダー単体
    var events = calendar.getEventsForDay(new Date()); // 今日の予定全て

    // 取得したイベント群から単体のeventを取得(取得した本日のすべてのイベントをループ処理)
    for(j in events) {
      var event = events[j]; //イベント単体
      var ownEvent = event.isOwnedByMe(); // その中でも自分がオーナー作成者のイベント
      var title = event.getTitle(); // イベントのタイトル
      var start = toTime(event.getStartTime());
      var end = toTime(event.getEndTime());

      // 自分が作成したイベントにだけ処理を実施 & 終日予定だけを取得
      if(ownEvent && start == "00:00" | start == "09:00") {
        // 予定名の文字列に「朝」を含む場合
        if(title.indexOf("★★朝★★") != -1) {
          // 格納用の引数に予定のタイトル/カレンダー名を格納する
          text +=  num + ". " + title + " [" + calendar.getName() + "]" + "\n";
          num++;
        }
      }
    }
  }


  // 取得した内容をメールする
  if(num > 1) { // もしnumが1より大きかったら(=予定が一つ以上あったら)
    sendmail(text);
  }
}

// 時間を24時間表記に変換するプログラム
function toTime(str){
  return Utilities.formatDate(str, 'JST', 'HH:mm');
}

//メールを送付するプログラム
function sendmail(body) {  
  var body = body; // メール本文
  MailApp.sendEmail(
    {
      to: "★★メールアドレスを記入★★", //メールの送付先
      replyTo:"★★メールアドレスを記入★★", //メールの返信先
      subject:"Googleカレンダーからの通知",  //メールタイトル
      body: body, // メール本文
      name: "Googleカレンダーからの通知" // 送信者の名称
    });
}

Standaloneスクリプトです。上記をGmail&Googleカレンダーを使っているアカウントのGoogle Apps Scriptのコード.jsにコピペして、GASのトリガーを[時間主導型] > [日タイマー] > [午前6時〜7時]に設定して完了です。

Gmail - こんな感じでメールが届きます

※こんな感じでメールが届きます

そうするとこんな感じでメールが届きます。
[private]とか[self-improvement]とかって書いてあるのは予定が登録されてるカレンダー名が自動で表示されてるだけなので気にしないでください。

まとめ

まぁ素直に通知機能使えよって話なんですが、デフォルトの通知機能では通知先がGmailにしか指定できなかったりとか制限もあるので、このプログラムがある意味があるかなと思って作りました。とはいえ、かなりニッチかもしれないですね…。

応用としては最初にも書いたとおり通知先をLINEやチャットワークにするとか、通知のタイミングを夜にしたりとか、予定の文字を「重要」とかにして重要な予定がある場合だけ通知させるとか、まぁご自由に。

補足

特になし。


実装方法や動きで疑問がありましたらお気軽にコメントくださいませ。時間ある時に対応します。

コメント

タイトルとURLをコピーしました