
こんにちは、Yujiです。
Googleカレンダーは便利だけど、タスク管理については正直ちょっと使いにくい。
僕自身、これが理由で長い間Googleカレンダーへ完全移行できませんでした。以前使っていたのは「FirstSeed Calendar」。
FirstSeed Calendar自体はかなり使いやすく、特に気に入っていたのがタスク管理です。
それでも最近、
- GeminiをはじめとしたAIや、
- Googleサービスとの連携を考えて、
Googleカレンダーへ本格的に移行しました。とはいえ、Googleカレンダーの使いにくい部分を我慢して乗り換えたわけではありません。
その不満を解消するために、
これが想像していた以上に便利。しかも僕自身、プログラミングができるわけではありません。むしろキホンの『キ』すら知らない。
けど、Geminiにコードを書いてもらえば、僕がやるのは基本的に完成したコードを貼り付けて設定するだけ。
僕が実際に行ったGoogleカレンダー+Google Tasksのカスタマイズ方法を、GASを使ったことがない人にも分かるように紹介します。
Contents
Googleカレンダーへ移行した理由

最初に言っておくと、Googleカレンダーがすべてにおいて一番使いやすいと思っているわけではありません。
むしろ、カレンダーアプリ単体の使い勝手ならFirstSeed Calendarはかなり優秀です。
僕も長く使っていましたし、特にタスク管理についてはGoogleカレンダーより気に入っている部分もあります。それでもGoogleカレンダーへ移行した大きな理由が、AIとの連携。
僕は以前、YouTubeでも「課金するAIならGeminiがおすすめ」という内容を紹介しました。
そしてGeminiを使えば使うほど、
- Gメール
- Googleカレンダー
- Google Tasks
- Googleドライブ
- Googleドキュメント
- Googleスプレッドシート
など、Googleサービスをまとめて使うメリットが大きくなってきたと感じています。
カレンダー単体で考えるのではなく、「今後AIを含めて仕事や生活を効率化するなら、どのサービスを中心にするか?」
ここまで考えた結果、僕はGoogleカレンダーを選びました。
Googleカレンダーに乗り換えられなかった2つの理由

以前から何度かGoogleカレンダーへの移行は考えていました。それでもFirstSeed Calendarを使い続けていたのには、大きく2つ理由があります。
① 定期タスクでカレンダーが見づらくなる
1つ目が定期的なタスクの管理です。
- 毎月行うタスク
- 3ヶ月ごとのタスク
- 半年ごとのタスク
- 1年ごとのタスク
一度タスクとして登録しておけば、自分で「そろそろやらないと」と覚えておく必要がありません。FirstSeed Calendarでは、この運用がかなりやりやすかったんですよね。
もちろんGoogle Tasksにも繰り返し設定があります。
ただ、繰り返しタスクをいくつも登録していくと、今後のタスクもGoogleカレンダー上に表示されるため、僕の場合はカレンダーがかなり見づらく感じました。
そこで今回、「タスクを完了したら次回分を自動的に作る」という仕組みに変更します。
3ヶ月ごとのタスクなら、今日のタスクを完了したあとに3ヶ月後のタスクを自動生成するイメージ。
これなら未来のタスクを必要以上に並べずに済みます。
② 未完了タスクを翌日に持ち越したい
もう1つ、僕にとってかなり重要なのが未完了タスクの自動繰り越しです。
僕はタスクを、「○月○日に絶対これをやる」という使い方だけではなく、「あ、これやらないと。とりあえず今日のタスクに入れておこう」という使い方をよくします。
その日のうちに終われば問題ありません。
ただ、
- 仕事が忙しかったり
- 別の予定が入ったりして、
できない日も当然あります。
FirstSeed Calendarを使っていたときは、こうした未完了タスクを翌日に持ち越す運用をしていました。
翌日になれば再び目に入るので、
「タスクを登録したこと自体を忘れる」
ということが減ります。
一方、Googleカレンダーでは期限を過ぎたタスクが元の日付に残るため、僕の使い方では見逃しやすいのが不満でした。
そこでGASを使って、
期限を過ぎた未完了タスクを今日の日付へ自動的に変更する
ようにしました。
Gemini+GASでGoogleカレンダーの不満を解決
今回実現したかったことをまとめると、こんな感じ。
| 項目 | カスタマイズ前 | カスタマイズ後 |
|---|---|---|
| 定期タスク | 標準の繰り返し機能を利用 | 完了したら次回分を自動生成 |
| 未来のタスク | 繰り返し分が表示される | 必要な次回分だけ作成 |
| 未完了タスク | 過去の日付に残る | 今日へ自動繰り越し |
| コード作成 | プログラミング知識が必要 | Geminiを使って準備 |
| タスク処理 | 手動 | GASで自動化 |
この仕組みを実現するために使うのが、Google Apps Script(GAS)です。
Google Apps Script(GAS)とは?

「そもそもGASって何?」
という人もいると思います。僕も最初は難しそうなイメージしかありませんでした。
Google Apps Scriptとは簡単にいうと、『Googleのサービスを自動化できる仕組み』です。
- Googleカレンダー
- Gmail
- Google Tasks
- Googleドライブ
- Googleスプレッドシート
などを、決めたルールに沿って自動的に処理できる。
「プログラム」と聞いた瞬間に、「自分には無理……」と思うかもしれませんが安心してください。僕も同じです。そして今はそんな僕達のためにGeminiがあります。
自分でゼロからコードを書くのではなく、「こういうことを自x動化したい」とGeminiに伝えてコードを準備してもらい、それをGASへ貼り付ける。
僕自身も、プログラマーとしてGASを使っているわけではありません(むしろ使えません)。基本的には完成したコードをコピペして使っています。
そのくらいの感覚から始めて大丈夫です。
Googleカレンダーのタスクを自動化する方法

それでは、ここから実際の設定方法を紹介します。
- Google Tasksでタスクを作る
- Geminiでコードを準備する
- Google Apps Scriptにコードを貼り付けて自動実行する
一つずつ設定していきます。
STEP1:Google Tasksでタスクを作る
まずタスク自体は『Google Tasks(Google ToDo リスト)』で管理します。
日付を設定したGoogle Tasksのタスクは、Googleカレンダーにも表示されます。
定期タスクには「◆」を付ける
今回のコードでは、定期タスクとして処理したいタスクに一定のルールを設けています。
基本は、
タスク名の先頭に「◆」を付け、その後に繰り返したい周期を記載する
という方法です。


先頭の「◆」が、GAS側で定期タスクかどうかを判断する目印です。
タスクを完了すると次回分が作られる
例えば、『◆経費入力【毎月月末】』というタスクがあったとします。
このタスクを完了すると、GASが完了済みのタスクを検知。そこから毎月の月末に同じ内容のタスクを自動生成します。
つまり、
現在のタスクを完了 → 次回必要になるタイミングで新しいタスクを作成
という流れです。
これなら、最初から未来の繰り返しタスクを大量に表示する必要がありません。
STEP2:Geminiでコードを準備する
次にGeminiを使ってGASで使用するコードを準備します。
今回僕が実際に使用しているコードは、このあとそのまま掲載しています。ただし、
など、自分の使い方に合わせて変更したい場合はGeminiへ相談もできます。
「Google Tasksで完了したタスクを判定して、3ヶ月後に同じタスクを作成したい。GASで使えるコードを作って。」
これでGeminiがコードを書いてくれます。
さらに、「期限切れになった未完了タスクは今日の日付へ自動的に移動したい」と条件を追加していけば、自分の使い方に合わせたコードへ調整できます。
ここがAI時代の便利なところ。(マジでさまさまです)
ただし、AIが生成したコードが必ず正しいとは限らないので、いきなり大切なタスクで運用せず、まずはテスト用のタスクを作って正常に動作するか確認するのがおすすめです。
STEP3:GASにコードを貼り付ける
ここから実際にGoogle Apps Scriptを設定していきます。
初めて見ると難しそうですが、基本的には順番通り進めれば大丈夫です。
① Apps Scriptを開く
まずGoogle Apps Scriptを開きます。
② 新しいプロジェクトを作成する
「新しいプロジェクト」を選択します。

プロジェクト名は、自分が分かる名前でOKです。『Googleカレンダーのタスク自動化』みたいなのタイトルでOKです。
後から見たときに「何のGASだったっけ?」とならない名前にしておくのがおすすめです。
③ GASコードを貼り付ける
プロジェクトを作成するとコードエディタが表示されます。
最初からサンプルコードが入力されている場合は削除し、以下のコードを貼り付けます。
/**
* 1. すべてのリストの完了タスク(◆付き)を検知して次回タスクを生成
* 2. 期限切れ未完了タスクを今日の日付へ自動持ち越し(タイムゾーン補正版)
*/
function handleCompletedRecurringTasks() {
const taskLists = Tasks.Tasklists.list();
if (!taskLists.items || taskLists.items.length === 0) return;
const now = new Date();
const todayYMD = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy-MM-dd');
const todayDueFormatted = `${todayYMD}T00:00:00.000Z`;
taskLists.items.forEach(list => {
const listId = list.id;
const tasks = Tasks.Tasks.list(listId, {
showCompleted: true,
showHidden: true
});
if (!tasks.items) return;
tasks.items.forEach(task => {
// 機能①:完了済み定期タスクの次回生成
if (task.status === 'completed' && task.title && task.title.startsWith('◆') && !task.title.startsWith('【処理済】')) {
let baseDate = task.due ? new Date(task.due) : new Date();
const baseYear = parseInt(Utilities.formatDate(baseDate, 'Asia/Tokyo', 'yyyy'), 10);
const baseMonth = parseInt(Utilities.formatDate(baseDate, 'Asia/Tokyo', 'MM'), 10) - 1;
const baseDay = parseInt(Utilities.formatDate(baseDate, 'Asia/Tokyo', 'dd'), 10);
let nextDate = new Date(baseYear, baseMonth, baseDay);
const title = task.title;
let matched = false;
if (title.includes('【毎月月末】') || title.includes('【月末】')) {
nextDate = new Date(nextDate.getFullYear(), nextDate.getMonth() + 2, 0);
matched = true;
} else if (/【毎月(\d+)日】/.test(title)) {
const day = parseInt(title.match(/【毎月(\d+)日】/)[1], 10);
nextDate.setMonth(nextDate.getMonth() + 1);
nextDate.setDate(day);
matched = true;
} else if (/【(\d+)(?:ヶ月|カ月|ケ月|ヶ月後|カ月後|ケ月後|ヶ後|か月後|ヶカ月後|ヵ月後)後?】/.test(title)) {
const months = parseInt(title.match(/【(\d+)(?:ヶ月|カ月|ケ月|ヶ月後|カ月後|ケ月後|ヶ後|か月後|ヶカ月後|ヵ月後)後?】/)[1], 10);
nextDate.setMonth(nextDate.getMonth() + months);
matched = true;
} else if (/【(\d+)年後】/.test(title)) {
const years = parseInt(title.match(/【(\d+)年後】/)[1], 10);
nextDate.setFullYear(nextDate.getFullYear() + years);
matched = true;
} else if (title.includes('【毎週】')) {
nextDate.setDate(nextDate.getDate() + 7);
matched = true;
} else if (/【(\d+)週間後】/.test(title)) {
const weeks = parseInt(title.match(/【(\d+)週間後】/)[1], 10);
nextDate.setDate(nextDate.getDate() + (weeks * 7));
matched = true;
} else if (/【(\d+)日後】/.test(title)) {
const days = parseInt(title.match(/【(\d+)日後】/)[1], 10);
nextDate.setDate(nextDate.getDate() + days);
matched = true;
} else {
nextDate.setMonth(nextDate.getMonth() + 1);
matched = true;
}
if (matched) {
const nextYMD = Utilities.formatDate(nextDate, 'Asia/Tokyo', 'yyyy-MM-dd');
const nextDueFormatted = `${nextYMD}T00:00:00.000Z`;
const newTask = {
title: task.title,
notes: task.notes || '',
due: nextDueFormatted
};
Tasks.Tasks.insert(newTask, listId);
task.title = '【処理済】' + task.title;
Tasks.Tasks.update(task, listId, task.id);
}
}
// 機能②:未完了タスクの今日への自動持ち越し
if (task.status === 'needsAction' && task.due) {
const taskDueYMD = Utilities.formatDate(new Date(task.due), 'Asia/Tokyo', 'yyyy-MM-dd');
if (taskDueYMD < todayYMD) {
task.due = todayDueFormatted;
Tasks.Tasks.update(task, listId, task.id);
}
}
});
});
}

④ Google Tasks APIを追加する
今回のコードではGoogle Tasksを操作するため、Tasks APIをサービスとして追加します。
Apps Scriptの画面にある「サービス」から追加を選択して、一覧からTasks APIを探して追加します。



ここを設定していないと、今回のコードは正常に動きません。忘れずに設定してください。
⑤ プロジェクトを保存する
コードを貼り付けてTasks APIを追加したら、プロジェクトを保存します。
- Windowsの場合:Ctrl+S(上書き保存)
- Macの場合:⌘+S(上書き保存)

⑥ 初回実行して権限を許可する
次に一度コードを実行します。初回実行時には、Googleアカウントへのアクセス許可を求められます。
画面の案内に従って、
- 使用するGoogleアカウントを選択
- 内容を確認
- 必要な権限を許可
と進めます。



初めてGASを使うと、この画面は少し不安になると思います。
今回のコードでは『Google Tasksの情報を取得したり、タスクを作成・更新したりする必要』があるため、そのための権限です。
ただし、ネット上で見つけたコードを内容も確認せずに実行するのはおすすめしません。どんな処理をするコードなのか確認したうえで権限を許可してください。
⑦ トリガーを設定して自動化する
最後に設定するのがトリガーです。
トリガーは簡単に言うと、『このコードをいつ自動実行するのか?』を決める機能。
【画像:GASのトリガー設定画面】




これで、
Google Tasksを使う → GASが定期的にチェック → 条件に合ったタスクを自動処理
という仕組みが完成です。
カスタマイズすると何が変わる?Before / After

実際に設定したことで、僕がGoogleカレンダーで不満だった2つの問題がかなり改善されました。
| Before | After |
| 標準の繰り返しタスクを利用 | 完了したら次回分を生成 |
| 未来のタスクも表示される | 必要な次回分だけ作られる |
| 定期タスクが増えると見づらい | カレンダーをスッキリさせやすい |
例えば、『◆【3ヶ月後】○○をする』というタスクを完了すると、GASがそれを検知。3ヶ月後の日付に同じタスクを作成します。
つまり、
今やるべきタスクを完了 → 次に必要なタスクを自動生成
という流れです。
【画像:定期タスクのBefore / After】
例えば昨日、
- メールを返信する
- 書類を確認する
- 動画の構成を考える
という3つのタスクを登録したとします。その日のうちに終わらなかった場合、通常は期限を設定した元の日付に残ります。
今回のGASでは、期限切れになった未完了タスクを検知すると、期限を今日の日付へ変更します。
つまり、
今日できなかった → 翌日にもう一度表示される
という運用ができます。


僕がFirstSeed Calendarで気に入っていた使い方を、Googleカレンダー+Google Tasksでもかなり再現できるようになりました。
実際に使って感じたメリット

今回のGoogleカレンダー自動化で、特に便利だと感じているのは以下です。
- Googleカレンダーが定期タスクだらけになりにくい
- 未完了タスクを忘れにくい
- 定期作業を自分で覚えておく必要がない
- Google Tasksをそのまま使える
- Geminiを使えばGASを自分好みに変更しやすい
- Gmailなど他のGoogleサービスとの連携も考えられる
特に大きいのは、『Googleカレンダーの使い方を、自分に合わせて変えられるようになった』こと。
以前はアプリに自分の使い方を合わせる感覚でした。
今はAIとGASを組み合わせることで、逆に自分の使い方へGoogleカレンダーを近づけることができます。
デメリット・注意点もある

もちろん、メリットばかりではありません。
最初のGAS設定は少し難しい
初めて使う人にとって、
- Google Apps Script
- Tasks API
- 権限
- トリガー
などは聞き慣れない言葉だと思います。僕も最初は「難しそうだな」と感じました。
ただ、一度設定してしまえば毎日GASを操作するわけではありません。完成したコードを貼り付けて設定するだけなら、思っていたほどハードルは高くありませんでした。
Google側の仕様変更で動かなくなる可能性がある
今回の方法はGoogle Tasksの標準機能ではなく、GASを使った自動化です。
そのため、将来的にGoogle側の仕様が変わった場合などには、コードの修正が必要になる可能性があります。
仮にそうなったらまたGeminiにお願いはしますが、その間慌ててしまいそうではある・・・
AIが作ったコードをそのまま信用しない
Geminiを使えばコード作成のハードルはかなり下がります。
ただし、
AIが生成したコード=必ず正しい
ではありません。特にGASではGoogleアカウントのデータを操作することになります。
コードの内容や要求される権限を確認し、まずはテスト用のタスクで動作確認することをおすすめします。
FirstSeed CalendarとGoogleカレンダー、結局どっちがいい?

今回Googleカレンダーへ移行しましたが、FirstSeed Calendarが使いにくかったから乗り換えたわけではありません。
むしろ、カレンダー単体の使いやすさならFirstSeed Calendarはかなり良かったと思っています。
僕の感覚を整理すると、こんな感じです。
| 重視すること | おすすめ |
|---|---|
| カレンダー単体の使いやすさ | FirstSeed Calendarなども有力 |
| シンプルなタスク管理 | 好みで選んでOK |
| Geminiとの連携 | Googleカレンダー |
| GmailなどGoogleサービスとの連携 | Googleカレンダー |
| GASを使った自動化 | Googleカレンダー+Google Tasks |
| 今後AIを活用して効率化したい | Googleカレンダーがおすすめ |
つまり、「Googleカレンダーだから無条件に最強」というわけではありません。僕がGoogleカレンダーを選んだ理由は、
カレンダー単体ではなく、Googleサービス+Gemini+自動化まで含めて考えたから
です。
AI時代は「アプリを選ぶ」だけではなく「自分でカスタマイズする」ことも簡単にできます。今回GASを使ってみて、一番考え方が変わったのはここかもしれません。
以前なら、
「Googleカレンダーはここが使いにくい」
と思ったら、
「じゃあ別のカレンダーアプリを探そう」
となっていました。
でも今はGeminiがあります。やりたいことをGeminiに相談して、GASを使って自動化できる可能性があります。
もちろん何でもできるわけではありません。それでも、
アプリに自分を合わせるだけではなく、自分の使い方にアプリを合わせる
という選択肢がかなり身近になりました。
これはGoogleカレンダーだけではなく、GmailやGoogleスプレッドシートなどでも同じです。
AIとGoogleサービスを組み合わせれば、今まで手作業でやっていたことを自動化できる可能性があります。
まとめ|Gemini+GASならGoogleカレンダーはもっと便利になる

今回は、Gemini+Google Apps Scriptを使って、Googleカレンダーのタスク管理をカスタマイズする方法を紹介しました。
僕が今回改善したかったのは大きく2つです。
- 定期タスクを「完了したら次回分を作る」方式にする
- 期限切れの未完了タスクを今日へ自動的に繰り越す
これによって、FirstSeed CalendarからGoogleカレンダーへ移行するときに感じていた不満がかなり解消されました。
「Googleカレンダーを使いたいけど、タスク管理が微妙なんだよな……」
と感じている人は、一度GASを使ったカスタマイズを試してみてください。
Googleカレンダーに自分を合わせるのではなく、自分の使い方にGoogleカレンダーを合わせる。
Geminiがある今なら、それが以前よりずっと簡単にできるようになっています。



































Gemini+Google Apps Script(GAS)を使って、自分が不満だった部分をカスタマイズしました。