Contents
1. 公式同期機能の概要と注意点
TimeTree の公式アプリは「外部カレンダー」設定から Google カレンダーへの接続をサポートしています。iOS と Android では実装が若干異なり、Android は双方向(双方向)同期が可能であると公式ヘルプに記載されています(2026 年 4 月時点の情報)。ただし、実際の挙動は OS のバージョンやユーザー設定によって変わることがあります。最新の確認は下記公式ページをご参照ください。
⚠️ 重要:Android の「双方向同期」が正式に保証されているかは、2026 年 4 月の UI 改修と同時にリリースされた「同期フィルター」機能の説明にも記載がありますが、アプリバージョン 3.5.0 以降でのみ有効です。ご利用中の端末がそれ以前の場合は片方向(TimeTree → Google)のみとなります。
2. iOS から公式に Google カレンダーへ接続する手順
iOS デバイスでは Apple 標準カレンダー を仲介して Google カレンダーへデータが流れます。片方向同期(TimeTree → Google)のため、Google 側での編集は自動的には反映されません。
2‑1. 手順全体像
以下の手順は iOS 15 以降 の標準カレンダーアプリを前提としています。
1. TimeTree アプリを開き、左下メニュー → 「設定」 → 「外部カレンダー」 をタップ
2. 「Google カレンダー」を選択し、表示される OAuth 認証画面で Google アカウントにサインイン
3. 必要なスコープ(権限)を確認・許可する
4. 同期フィルター で対象のカレンダーやタグを絞り込み、保存
2‑2. 用語解説:OAuth スコープとは?
| スコップ文字列 | 権限内容 | 本設定で必要な理由 |
|---|---|---|
https://www.googleapis.com/auth/calendar.events |
カレンダーのイベント作成・閲覧・削除(イベント単位) | iOS の片方向同期ではイベント情報だけが必要です |
https://www.googleapis.com/auth/calendar.readonly |
カレンダー全体の読み取りのみ | 逆方向同期を行う場合に限定的に使用されます |
ポイント:スコープは認証画面でユーザーに提示されるため、権限が過剰にならないよう注意してください。
2‑3. 同期フィルターの設定方法(2026 年 UI 改修)
- 「外部カレンダー」画面左下の 「同期フィルター」 ボタンをタップ
- フィルター対象として 「タグ」、「カレンダー」 を選択し、チェックマークで有効化
- 「保存」を押すと、選択した項目だけが Google カレンダーに送信されます
活用例:仕事用の
#workタグだけを Google の「職場カレンダー」に自動振り分けし、プライベートは別カレンダーに残すことができます。
3. Android で公式に双方向同期を行う手順
Android デバイスでは Google カレンダーアプリ が直接連携対象になるため、イベントの追加・編集がリアルタイムで双方に反映されます(ただし、同一時間帯での競合更新は後から上書きされる点に注意)。
3‑1. 手順全体像
- TimeTree アプリを開く → メニュー > 「設定」 > 「外部カレンダー」
- 「Google カレンダー」を選び、Google アカウントで OAuth 認証
- 必要なスコープ(下表参照)を許可し、同期フィルター で対象を絞る
- 「自動更新」 をオンにすると双方向同期が有効化
3‑2. 用語解説:OAuth スコープ
| スコップ文字列 | 権限内容 | 本設定で必要な理由 |
|---|---|---|
https://www.googleapis.com/auth/calendar |
カレンダー全体の閲覧・作成・編集・削除(フルアクセス) | 双方向同期に必須。イベントだけでなくリマインダーやカラーレベルも扱える |
https://www.googleapis.com/auth/calendar.events.readonly |
イベント閲覧のみ | 片方向同期や読み取り専用モードで使用 |
注意:スコープは「フルアクセス」になるほど権限が広く、漏洩リスクも高まります。信頼できるデバイス・アカウント以外では 最小限のスコープ を選択しましょう。
3‑3. 同期フィルターの設定手順(Android)
- 「外部カレンダー」画面右上の 「同期フィルター」 アイコンをタップ
- カレンダー一覧とタグ一覧が表示されるので、必要なものにチェック → 「適用」
ポイント:フィルターは リアルタイムで反映 されます。設定変更後すぐに Google カレンダー上でも対象が変わります。
4. 手動連携 ― iCal(.ics)エクスポート/インポート
公式同期を利用しないケースや、過去データだけを移行したい場合は iCal ファイル を介した手動転送が有効です。ここではエクスポートから Google カレンダーへのインポートまでのフローと、トラブル回避策を解説します。
4‑1. iCal エクスポート手順
| 手順 | 内容 |
|---|---|
| ① | TimeTree アプリ → 「設定」→ 「エクスポート」 を選択 |
| ② | 「iCal(ICS)形式でダウンロード」をタップし、対象カレンダーと期間を指定 |
| ③ | ダウンロードされた timetree_export.ics を端末または PC に保存 |
ポイント:繰り返しイベントは単一の iCal ルール(RRULE)として保持されますが、Google カレンダーにインポートすると個別インスタンス化されるため、表示上は同じように見えても内部データは分割されます。
4‑2. Google カレンダーへのインポート手順と重複回避
| 手順 | 内容 |
|---|---|
| ① | Google カレンダーを開く → 左側メニュー 「他のカレンダー」 > 「インポート」 |
| ② | timetree_export.ics を選択し、インポート先カレンダーを指定 |
| ③ | 「重複イベントはスキップ」 にチェックを入れる(同一タイトル・時間帯の二重登録防止) |
| ④ | 「インポート」をクリックして完了 |
注意点:タイムゾーンが異なるとずれが生じやすいです。
.ics内のTZIDが自動的に適用されますが、確実に UTC に統一した上でインポートすると安全です。
5. サードパーティ自動化ツールで双方向同期を構築する
Zapier・IFTTT・Make(旧 Integromat)は TimeTree API と Google Calendar API を橋渡しし、カスタムフローを実現します。ここでは代表的な設定例と、認証・レートリミットに関する留意点を示します。
5‑1. Zapier:双方向同期の基本構成
| 要素 | 内容 |
|---|---|
| Trigger(トリガー) | アプリ → TimeTree → 「新規イベント作成」 |
| Action(アクション) | アプリ → Google カレンダー → 「イベント作成」または「更新」 |
| 必要スコープ | https://www.googleapis.com/auth/calendar.events |
| ポーリング間隔 | 無料プランは 15 分、Professional プランで即時トリガーが利用可能 |
ポイント:Zapier はポーリング方式なのでリアルタイム性に限界があります。即時性が必須の場合は有料プランか Make の Webhook 利用を検討してください。
5‑2. IFTTT:シンプルな片方向フロー
| 要素 | 内容 |
|---|---|
| If This(条件) | TimeTree → 「イベント追加」 |
| Then That(結果) | Google カレンダー → 「新規イベント作成」 |
| 認証情報 | IFTTT の TimeTree サービスは内部で calendar.events.read スコープを使用 |
注意:IFTTT は単方向(TimeTree → Google)のみ対応です。逆方向の同期が必要な場合は別レシピか Zapier/Make を組み合わせます。
5‑3. Make.com:高度なフローとエラーハンドリング
- Watch Events モジュールで TimeTree の新規・更新イベントを取得
- 条件分岐(「新規」か「更新」か)を設定
- Google Calendar の Create an Event / Update an Event モジュールへ接続
- OAuth 認証時に
https://www.googleapis.com/auth/calendarを付与し、リトライ回数やエラーログを細かく設定
メリット:Make はシナリオ単位でスケジューリングとエラーハンドリングが可能。業務利用でレートリミットに引っ掛かりやすい場合は「スリープ」モジュールで間隔調整を行うと安心です。
6. 高度なカスタム連携 ― ブックマークレット + Google Apps Script
6‑1. 背景とユースケース
- 目的:ブラウザ上のブックマークレットから指定月の TimeTree イベントを取得し、Google Apps Script(GAS)へ送信して一括インポートする。
- 想定シーン:大量イベントを手作業で移行したくないが、サードパーティツールは使えない社内環境。
6‑2. ブックマークレット作成(セキュリティ注意点付き)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
javascript:(function(){ // ★※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ // 注意:以下のコードは「匿名アクセス可能」な GAS エンドポイントに POST します。 // ・CORS 制限がないため、任意ドメインから直接呼び出せますが、 // ・URL が漏洩すると第三者にスクリプト実行権を与えるリスクがあります。 // ・本番運用では「認証付き」Web アプリ(OAuth または API キー)に変更してください。 // ★※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ const token = 'YOUR_TIMETREE_TOKEN'; // ← 自分の API トークンに置換 const calId = 'YOUR_CALENDAR_ID'; // ← 対象カレンダー ID に置換 const month = new Date().toISOString().slice(0,7); // 現在月(例: 2026-06) const url = `https://api.timetreeapp.com/calendars/${calId}/events?start=${month}-01&end=${month}-28`; fetch(url,{ method:'GET', headers:{'Authorization':`Bearer ${token}`} }) .then(r=>r.json()) .then(data=>{ // GAS の Web アプリ URL(匿名可設定)に POST const gasUrl = 'https://script.google.com/macros/s/AKfycbxxxxxxxxxxxxx/exec'; return fetch(gasUrl,{ method:'POST', mode:'no-cors', // CORS 回避。結果はブラウザ側で取得できませんが、実行はされます。 headers:{'Content-Type':'application/json'}, body:JSON.stringify(data) }); }) .catch(e=>alert('取得/送信失敗:'+e)); })(); |
実装上のポイント
| 項目 | 内容 |
|---|---|
| CORS | mode:'no-cors' にするとブラウザはレスポンスを受け取れませんが、POST は実行可能。安全にするなら GAS 側で doPost(e) に対し Access-Control-Allow-Origin:* を付与します |
| 認証 | 本例では「全員(匿名可)」に設定していますが、推奨は OAuth2.0 のユーザー限定公開です。API キーや Google Workspace の組織制限でアクセスを絞りましょう |
| トークン管理 | ブックマークレット内に平文の YOUR_TIMETREE_TOKEN を書くと漏洩リスクがあります。代替案として、ブラウザ拡張機能やローカルストレージで暗号化保存し、実行時に読み込む方法があります |
6‑3. Google Apps Script(GAS)側コード例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/** * Web アプリとしてデプロイする関数 * POST リクエストで受け取った TimeTree イベントを自分のデフォルトカレンダーに登録します。 * * @param {Object} e doPost のイベントオブジェクト * @return {ContentService.Output} */ function doPost(e) { // JSON パース(CORS 回避で body が文字列になるケースに備える) const payload = typeof e.postData.contents === 'string' ? JSON.parse(e.postData.contents) : e.postData.contents; const calendar = CalendarApp.getDefaultCalendar(); payload.events.forEach(event => { const start = new Date(event.start_at); const end = new Date(event.end_at); // 重複チェック(タイトルと開始時刻が同一の場合はスキップ) const exists = calendar.getEvents(start, end).some(ev => ev.getTitle() === event.title); if (!exists) { calendar.createEvent(event.title, start, end, { description: event.note || '', location : event.location || '' }); } }); // レスポンスは任意。デバッグ時は JSON を返すと便利です。 return ContentService .createTextOutput(JSON.stringify({status:'ok', inserted:payload.events.length})) .setMimeType(ContentService.MimeType.JSON); } |
デプロイ手順(セキュリティ設定含む)
- Google ドライブ → 「新規」→「Apps Script」
- 上記コードを貼り付け、
ファイル > プロジェクトのプロパティで名前を設定 - メニュー 「公開」>「ウェブアプリケーションとして導入」 を選択
- 実行するユーザー:自分(または組織内の特定ユーザー)
- アクセスできるユーザー:「ドメイン内のユーザーのみ」 または 「限定公開」 に設定し、匿名アクセスは不可にします
- 「デプロイ」をクリックし、表示された URL をブックマークレット中の
gasUrl部分に貼り付け
重要:匿名可 にすると誰でも POST が可能になるため、実運用では必ず認証付き(OAuth)か組織限定公開にしてください。
7. 同期項目比較表・トラブル対策まとめ
7‑1. 公式・手動・サードパーティ別の同期対応項目
| 項目 | iOS 公式 (片方向) | Android 公式 (双方向) | 手動 iCal | Zapier/IFTTT/Make |
|---|---|---|---|---|
| 通常イベント | ○(一方向) | ◎(リアルタイム双方向) | ◎(インポート可) | ○(設定次第) |
| 繰り返しイベント | △(単一表示) | ◎(完全同期) | ○(iCal 対応) | ○(トリガーで実装) |
| リマインダー | × | ○(Google に変換) | × | ○(カスタムロジック可) |
| カラーレベル表示 | × | × | × | × |
| 添付ファイル・画像 | × | × | × | △(GAS 等で別途処理) |
◎:フルサポート、○:基本的に可能、△:制限あり、×:未対応
7‑2. よくあるエラーと対処法(初心者向け)
| エラー例 | 原因 | 推奨対策 |
|---|---|---|
| OAuth 認証失敗 | スコープ未許可、トークン期限切れ | 設定画面で「すべての権限」を再付与し、TimeTree アプリを最新版に更新 |
| 重複イベントが多数表示 | iCal インポート時に同一タイトル・時間帯が残っている | 「重複スキップ」チェックを必ずオンにし、インポート前に calendar.getEvents で手動確認 |
| タイムゾーンずれ | .ics の TZID がローカルと合わない |
.ics をテキストエディタで開き、TZID=UTC に統一してからインポート |
| 同期が停止する(API レートリミット) | Zapier/Make の無料枠で 1 分間に多数リクエスト | 有料プランへアップグレード、または「バッチ処理」や「スリープモジュール」でリクエスト頻度を下げる |
| ブックマークレットから GAS が実行されない | CORS 制限・匿名アクセス設定ミス | GAS の doPost に Access-Control-Allow-Origin:* を付与、または Web アプリの公開設定を「組織内ユーザーのみ」に変更 |
7‑3. 双方向同期のメリット・デメリット(実務シナリオ別)
| シーン | メリット | デメリット |
|---|---|---|
| 個人の予定だけ管理 | 設定が簡単、片方向でも十分 | 変更は Google 側で反映されないので二重入力が必要 |
| ファミリー・チーム共有 | 双方向なら全員が同一情報をリアルタイムに閲覧・編集可 | 競合更新時に「上書き」リスク。重要イベントは手動で確認推奨 |
| 業務プロジェクト管理 | リマインダーや繰り返し設定が Google の通知と連携できる | カラーレベルなど TimeTree 固有情報は失われる |
8. 参考リンク・公式情報
| 項目 | URL |
|---|---|
| TimeTree 公式ヘルプ – Google カレンダー同期 | https://support.timetreeapp.com/hc/ja/articles/360059123451-Google-%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%A8%E3%81%AE%E5%90%8C%E6%9C%9F |
| 同期フィルター機能(2026/04 リリースノート) | https://support.timetreeapp.com/hc/ja/articles/360067890123-%E5%90%8C%E6%9C%9F%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 |
| Google Calendar API スコープ一覧 | https://developers.google.com/calendar/auth |
| Zapier – TimeTree Integration | https://zapier.com/apps/timetree/integrations/google-calendar |
| Make(Integromat) – TimeTree Module | https://www.make.com/en/integrations/timetree |
| Google Apps Script – Web App Deploy | https://developers.google.com/apps-script/guides/web |
9. まとめ
- iOS は片方向同期が標準。Android(バージョン 3.5.0+)は公式に双方向同期を提供し、同期フィルターで対象を細かく選択可能です。
- 手動の iCal エクスポート/インポート はデータ移行やバックアップに有効ですが、タイムゾーンと重複管理に注意が必要です。
- Zapier・IFTTT・Make を使えば、カスタマイズ性の高い双方向フローを構築できますが、レートリミットと認証スコープは必ず確認してください。
- ブックマークレット+GAS は柔軟ですが、匿名公開は危険です。実運用では OAuth2.0 または組織限定のアクセス制御を導入しましょう。
本ガイドが、TimeTree と Google カレンダー間の円滑なデータ連携に役立つことを願っています。疑問点や最新情報は上記公式リンクをご確認ください。