📌

【GAS】Google カレンダーの予定を Google Todo に自動的に追加する

2021/06/05に公開

仕組み

定期的なタスクを Google カレンダーに登録しておく
↓
GAS(Google Apps Script)でカレンダーを1日1回確認する
↓
カレンダーに予定があればその内容を Google ToDo に登録する

事前準備

カレンダー ID の取得

タスクを登録していくカレンダーを作成し、カレンダーの ID を取得しておきましょう。

Tasks API の有効化

GAS のエディタを開いてサイドバーの「サービス」から Tasks API を使えるようにしておきます。

タスクリスト ID の取得

こちら にアクセスして、右の「試してみる」をクリックするとログインしているアカウントに対して API の tasklists.list メソッドを実行できます。

「EXECUTE」をクリックするとレスポンス文面が表示されるので「id」の値を控えておきましょう。パラメータの指定欄がありますが特に埋める必要はありません。

コード

TASKLIST_IDCALENDAR_ID には上で取得した値を指定します。


/*
  カレンダーの当日の予定を取得して Todo に追加する。
*/

const TASKLIST_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const CALENDAR_ID = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyy@group.calendar.google.com";
const ROUTINES = CalendarApp.getCalendarById(CALENDAR_ID);

// 実行当日の予定を取得する関数
function getDailyEvents() {
  const today = new Date();
  return ROUTINES.getEventsForDay(today).map(evt => evt.getTitle());
}

// 実行当日のタイムスタンプを ISO 8601 形式で取得する関数
function getDueStr(){
  const today = new Date();
  const dueStr = Utilities.formatDate(today, "Asia/Tokyo", "yyyy-MM-dd");
  return dueStr + "T00:00:00.000Z";
}

// 実行当日のタスクとしてリストに登録する関数
function addTask(title) {
  const dueStr = getDueStr();
  const task = {
    title: title,
    due: dueStr
  };
  Tasks.Tasks.insert(task, TASKLIST_ID);
  Utilities.sleep(500);
}

// メイン処理
function main() {
  const events = getDailyEvents();
  if (events.length < 1) {
    return;
  }
  events.forEach(ev => {
    addTask(ev);
  });

}

上記内容をエディタに登録し、日付ベースのトリガーで main() を毎晩2~3時に定期実行するように登録しておきます(真夜中のうちに終わらせなくてはいけないタスクはないという前提)。


よく考えるとリマインド機能をうまく組み合わせれば Google カレンダーだけで完結する話ではありますね…。ただ、Google ToDo だと達成したタスクの数が可視化されるのでモチベーション的に良い気がしています。

もう一つ良い点として、かなり先の日付のタスクがあるとき、この方式だと当日になって初めてタスクリストに表示されます(ToDo に直接登録するとその日からずっとタスクリストに表示されることになり精神衛生上良くない気がしています)。

参考:【GAS】Google Tasksを追加する

Discussion