この記事は2026年6月時点の情報です。 各サービスの料金・API仕様・機能は変更されることがあります。最新の内容は必ず各公式サイト・公式ドキュメントでご確認ください。
この記事の結論
- 完全無料で運用したい → GAS自動化一択(この記事のメイン)
- 設定の手軽さ最優先 → Zapier / Make(無料枠は月100タスクまで・2026年6月時点)
- カレンダーをNotion上で見たいだけ → Notion Calendarの公式統合が便利
- 片方向の反映(Notion→Google)なら、GASで無料構築できる
- 更新・重複を防ぐコツは、Notion側に「同期済み」チェック列を用意すること
迷ったら、まずは「GAS自動化」で無料運用してみるのがおすすめです。
3つの連携方法を比較
| 項目 | Notion Calendar(公式) | Zapier / Make | GAS自動化 |
|---|---|---|---|
| 料金 | 無料 | 無料枠あり/有料 約$19.99〜 | 完全無料 |
| 設定の手軽さ | ◎ | ◎ | △(コード必要) |
| Notion→Google反映 | ×(表示のみ) | ◯ | ◯(この記事の方法) |
| カスタマイズ性 | × | ◯ | ◎ |
| 対応件数 | — | 無料は月100タスク | 実質自由(クォータ内) |
| おすすめ度 | ◯ | ◯ | ◎(コスパ重視) |
方法1. Notion Calendar の公式統合
Notion Calendar(旧Cron)を使うと、GoogleカレンダーをNotion上に表示できます。設定は数クリックで手軽です。ただし、「Notionデータベースの予定 → Googleカレンダーへ反映」はこの方法ではできません(外部カレンダーをNotion内に表示する機能で、Notion DBからの真の双方向同期は提供されていません・2026年6月時点)。「Notionに書いた予定をGoogleカレンダーに出したい」場合は、方法2か方法3を使います。
方法2. Zapier / Make
「Notionの新規ページ追加」→「Googleカレンダーにイベント作成」のテンプレが豊富で、初心者には最も簡単です。Zapierの無料プランは月100タスク・2ステップ構成・ポーリング間隔は約15分(2026年6月時点)。それ以上の頻度・件数が必要ならProプラン(約$19.99/月〜・年払い)などの有料が必要です。最新の料金・無料枠はZapier公式で確認してください。
方法3. GAS自動化(この記事のメイン)
Googleアカウントだけあれば完全無料。トリガーで定期実行でき、件数も自由(後述のクォータ内)。今回はこのやり方を解説します。
GAS連携の全体像
[Notion DB] ──(Notion API)──> [GAS] ──(Calendar API)──> [Googleカレンダー]
- Notion側でデータベースを作る(予定を書く場所)
- Notion APIのインテグレーションキーを発行
- GASでNotion APIを叩いて予定を取得
- CalendarAppでGoogleカレンダーに追加
- トリガーで定期実行(例:5分おき)
⚠️ Notion APIのバージョンについて(必ずお読みください)
このあとのコードは動作例です。Notion APIはNotion-Versionヘッダでバージョンを指定しますが、本記事のサンプルは古いバージョン値を使っています。2025-09-03以降、データベース操作は「データソース(data sources)」を扱うAPIへの移行が進んでおり、最新仕様ではコードの修正が必要になる場合があります。実装前に必ずNotion APIの公式ドキュメントで最新のバージョン・エンドポイント仕様を確認してください。「このコードで必ず動く/将来も動く」ことを保証するものではありません。
Step 1. Notionデータベースを準備する
Notionで新しいページを開き、フルページのデータベースを作成します。列は以下を用意します。
| 列名 | タイプ | 用途 |
|---|---|---|
| Name | タイトル | 予定名 |
| Date | 日付 | 開始/終了日時 |
| Synced | チェックボックス | 同期済みフラグ |
| EventId | テキスト | Googleカレンダー側のID |
Syncedが未チェックのものだけをGASが拾って同期する設計にします(重複防止のコツ)。
Step 2. Notion API インテグレーションを作る
- https://www.notion.so/my-integrations にアクセス
- + New integration → 名前を「GAS Sync」などに
- 発行された
secret_xxxx(インテグレーショントークン)をコピー - Notion DBページ右上の … → 接続を追加 → 作ったインテグレーションを選択
認証は Authorization: Bearer <インテグレーショントークン> の形式で行います(2026年6月時点)。
DBのIDをメモ
DBページのURLの以下部分がIDです。
https://www.notion.so/your/abcd1234efgh5678ijkl9012mnop3456?v=...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
この32文字がDB ID
Step 3. GASに Notion連携コードを書く
新規GASプロジェクトを作り、以下を貼り付けます。APIキーはコードに直接書かず、スクリプトプロパティに保存します(安全のため)。
function setNotionKey() {
const props = PropertiesService.getScriptProperties();
props.setProperty('NOTION_TOKEN', 'secret_ここに貼る');
props.setProperty('NOTION_DB_ID', 'ここにDB IDを貼る');
props.setProperty('CALENDAR_ID', 'your-email@gmail.com'); // 同期先カレンダー
}
1度だけ setNotionKey を実行してから、キーを書いた行は削除しておくと安全です。
予定を取得する関数
function fetchNotionEvents() {
const props = PropertiesService.getScriptProperties();
const token = props.getProperty('NOTION_TOKEN');
const dbId = props.getProperty('NOTION_DB_ID');
// ※ Notion-Version は古い値の例。最新値は公式ドキュメントで確認してください。
const url = `https://api.notion.com/v1/databases/${dbId}/query`;
const payload = {
filter: { property: 'Synced', checkbox: { equals: false } }
};
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + token,
'Notion-Version': '2022-06-28' // ← 最新版・データソースAPIは公式で要確認
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
return JSON.parse(res.getContentText()).results;
}
Googleカレンダーに追加する関数
function syncToGoogleCalendar() {
const pages = fetchNotionEvents();
const calId = PropertiesService.getScriptProperties().getProperty('CALENDAR_ID');
const cal = CalendarApp.getCalendarById(calId);
pages.forEach(page => {
const name = page.properties.Name.title[0]?.plain_text || '無題';
const date = page.properties.Date.date;
if (!date) return;
const start = new Date(date.start);
const end = date.end ? new Date(date.end) : new Date(start.getTime() + 3600000);
const event = cal.createEvent(name, start, end);
markAsSynced(page.id, event.getId());
});
}
同期済みフラグを更新する関数
function markAsSynced(pageId, eventId) {
const token = PropertiesService.getScriptProperties().getProperty('NOTION_TOKEN');
const url = `https://api.notion.com/v1/pages/${pageId}`;
UrlFetchApp.fetch(url, {
method: 'patch',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + token,
'Notion-Version': '2022-06-28' // ← 同上。最新は公式で確認
},
payload: JSON.stringify({
properties: {
Synced: { checkbox: true },
EventId: { rich_text: [{ text: { content: eventId } }] }
}
}),
muteHttpExceptions: true
});
}
Step 4. トリガー設定
GASの 時計マーク → トリガーを追加 で、syncToGoogleCalendar を定期実行(例:5分ごと)に設定します。時間主導トリガーは最短「毎分」まで設定できます。これで Notionに予定を書くだけで自動的にGoogleカレンダーへ反映されます。
💡 クォータの注意
GASは1回の実行が6分まで(超過するとエラー)。また、無料のGoogleアカウントには1日あたりのトリガー総実行時間やAPI呼び出し回数などのクォータがあります。個人の予定管理の範囲なら通常は問題ありませんが、大量件数を扱う場合はGASのクォータを公式で確認してください。
よくあるハマりどころ
| 症状 | 原因 | 対処 |
|---|---|---|
| 401 Unauthorized | DBにインテグレーションが未接続/トークン誤り | DBページの「接続」設定とトークンを確認 |
| 予定が重複する | Syncedフラグを更新できていない | markAsSynced の動作とプロパティ名を確認 |
| 同じ予定が毎回作られる | フィルタが効いていない | DBのプロパティ名が Synced か確認 |
| 時刻がズレる | タイムゾーン設定ミス | GASプロジェクト設定で Asia/Tokyo に |
| APIエラー(仕様変更系) | Notion APIのバージョン/仕様変更 | 公式ドキュメントで最新のバージョン・エンドポイントを確認 |
よくある質問(FAQ)
Q. 双方向同期はできますか?
この記事のやり方は片方向(Notion→Google)です。双方向同期が必要な場合は、対応するサードパーティの同期サービスを使うか、表示用にNotion Calendarを併用する方法があります。各サービスの仕様・料金は公式で確認してください。
Q. Googleカレンダー側の変更をNotionに戻せますか?
今回の構成では戻せません(片方向のため)。必要なら、GAS側でGoogleカレンダーのイベント一覧を取得してNotionに書き戻す関数を追加実装する形になります。
Q. 複数のカレンダーで使い分けたいです。
Notionに「カレンダー種別」列を追加し、GAS側でカレンダーIDを振り分ける形にすれば対応できます。
Q. GASの実行時間制限は大丈夫ですか?
1回の実行は6分以内が上限です。個人の予定管理の範囲であれば通常は問題ありません。大量件数を扱う場合は、無料アカウントの日次クォータも公式で確認してください。
Q. スマホでも動きますか?
GASはサーバー側で動くため、スマホでNotionに書き込むだけで、設定したトリガーのタイミングで自動的にGoogleカレンダーへ反映されます。
まとめ
- 片方向同期(Notion→Google)なら GASで無料運用できる
- 手軽さ・分岐が欲しいなら Zapier / Make(無料は月100タスク・2026年6月時点)
- カレンダーをNotion上で表示したいだけなら Notion Calendar
- Notion APIは仕様変更が進んでいるため、実装前に公式ドキュメントで最新仕様を確認する
関連記事もどうぞ:
- Notion・Todoist・Asana 徹底比較(タスク管理ツール選び)
用途に合うAIツール選びは用途別AIツール診断もどうぞ。
子どものAI、迷ったらまず先生の記事から。
現役講師が運営する比較メディアが、あなたの目的に合ったAIツールを案内します。





