まだ中学生のブログ

スマホ関連、Google関連のことを書いてます。IT系勤務、既婚、精神年齢:中学生。

カレンダーだけでタスク管理する【Google Apps Script】

f:id:madachugakusei:20160103141827p:plain

タスク管理は色々とアプリがあります。 ただ個人的に次の要件を満たすものがなかなかありませんでした。

  • カレンダーベースで管理したい
  • わざわざ専用アプリを立ち上げたくない
    • 立ち上げて数ステップ手間を取るのが嫌
  • もちろんタスクの実行漏れを防ぎたい

そこで普段予定を管理しているGoogleカレンダーでタスク管理をし、 タスク漏れを防ぐためにGoogle Apps Scriptを使うことにしました。

今回紹介する実現機能は

  • Googleカレンダーを使用
    • iPhoneでもAndroidでも、特に新しいアプリは使わずに、お気に入りのカレンダーアプリがそのまま使える
  • カレンダーベースなので必然と期限が管理できる
  • Google Apps Scriptで期限切れのタスクを自動管理する
    • 期限になったら次の日へ予定を移動する
    • 次の日に移動した予定をメール通知する

実現方法

  • タスク管理用のGoogleカレンダーを作成
    • 別途アカウントを作成するわけではなく、"カレンダー"を追加します
  • Google Apps Scriptの導入
    • カラのspreadsheetを作成
    • Google Apps Scriptで今日が期限の予定を次の日に移すコードを書く
  • 使い倒す

タスク管理用のGoogleカレンダーを作成

Googleカレンダーにアクセスします。

f:id:madachugakusei:20150913161351p:plain

f:id:madachugakusei:20150913161408p:plain

カレンダーIDを取得しておきます。

f:id:madachugakusei:20160103133855p:plain

Google Apps Scriptの導入

Google Apps ScriptはGoogle Spreadsheetから作成できます。 Spreadsheet自体は使いませんが、カラのシートを作成しましょう。

Google Driveから作成します。

f:id:madachugakusei:20150913161144p:plain

f:id:madachugakusei:20150913161201p:plain

f:id:madachugakusei:20150913161217p:plain

スプレッドシートを作成したら「ツール」→「スクリプトエディタ」と進みます。

f:id:madachugakusei:20150913161305p:plain

コードは下記のものをコピペします。 (修正箇所が2点あります。)

/**
 * 次の日を返す
 *
 * @param baseDate Date型の基準日 この次の日を返す
                   時刻もそのまま引き継ぐ
 */
function getNextDate(baseDate) {
  var y = baseDate.getFullYear();
  var m = baseDate.getMonth();
  var d = baseDate.getDate();
  var h = baseDate.getHours();
  var mi = baseDate.getMinutes();
  var s = baseDate.getSeconds();
  return new Date(y, m, d + 1, h, mi, s);
}

/**
 * 指定されたカレンダーの指定された日の予定を次の日に移動する
 */
function moveTaskToNextDay(taskCalendarId, baseDate) {
  var taskCalendar = CalendarApp.getCalendarById(taskCalendarId);
  var events = taskCalendar.getEventsForDay(baseDate);
  
  var taskList = '';
  
  for(var i = 0; i < events.length; i++){
    var title = events[i].getTitle();
    var s = events[i].getStartTime();
    var e = events[i].getEndTime();
    
    if (taskList.length > 0) {
      taskList += '\n';
    }
    
    taskList += title;
    
    if (events[i].isAllDayEvent()) {
      taskCalendar.createAllDayEvent(title, getNextDate(s));
      Logger.log('--------------');
      Logger.log(getNextDate(s));
    } else {
      taskCalendar.createEvent(title, getNextDate(s), getNextDate(e));
      Logger.log('--------------');
      Logger.log(getNextDate(s));
      Logger.log(getNextDate(e));
    }
    
    events[i].deleteEvent();
  }
  
  return taskList;
}

/**
 * "ToDo"カレンダーの"今日"の予定を明日へ移動する
 * 時間型トリガー設定済み
 */
function moveTaskToTomorrow() {
  // タスクのカレンダー 
  var taskCalendarId = 'XXXXXXXXXXXXX@group.calendar.google.com';
  var baseDate = new Date();
  
  var taskList = moveTaskToNextDay(taskCalendarId, baseDate);
    
  if (taskList.length > 0) {
    var to = 'YYYYYYYYYYYYYY@gmail.com';
    var subject = '未完了タスクの更新通知';
    var body = taskList + '\n\n上記タスクを明日へ繰り越しました。'
    MailApp.sendEmail(to, subject, body);
  }
}

修正箇所1点目

var taskCalendarId = 'XXXXXXXXXXXXX@group.calendar.google.com';

の部分を先ほどメモしたカレンダーIDへ置き換えます。

修正箇所2点目

var to = 'YYYYYYYYYYYYYY@gmail.com';

の部分はタスクを繰り越したことを通知するメールアドレスを設定します。

f:id:madachugakusei:20150913161328p:plain

メニューの「実行」→「moveTaskToTomorrow」と選択すると、タスクが繰り越され、その旨がメール通知されます。

f:id:madachugakusei:20150913161445p:plain

使い倒す

自動実行

スクリプトエディタで、毎日自動的にプログラムが動くように設定しましょう。

f:id:madachugakusei:20150913161721p:plain

自動実行の条件が設定できます。

f:id:madachugakusei:20150913161729p:plain

「実行」はmoveTaskToTomorrow、「イベント」は時間主導型、日タイマーの午後の遅い時間を選択しましょう。

これで、タスクが自動繰り越しされます。


以上