Contents
TimeTree と Google カレンダーの同期でできること・できないこと
TimeTree の iCal 共有 URL を利用すれば、Google カレンダーに 読み取り専用 のカレンダーとして登録できます。本セクションでは、実務で想定される「可能な操作」と「制約」を整理し、導入前の期待値を合わせるポイントを解説します。
できること
- TimeTree に登録された全メンバーのイベントが Google カレンダーに自動的に表示されます。
- PC・スマートフォンなど複数デバイスで同一ビューを共有でき、Google のリマインド機能も併用可能です。
できないこと
- Google 側からイベントを編集しても TimeTree には反映されません(読み取り専用)。
- 招待メールや出欠管理は Google カレンダー側では行えず、必ず TimeTree の UI を使用する必要があります。
- 同期はリアルタイムではなく、Google が iCal URL を定期的に取得するため 数分程度の遅延 が発生します。公式ドキュメントで具体的な間隔が公開されていない点に留意してください。
二重登録防止の仕組み
iCal 形式では各エントリに UID(一意識別子)が付与され、Google カレンダーは同一 UID のイベントを上書きします。そのため TimeTree がエクスポートする iCal をポーリングした場合、既に取得済みの予定が再度取り込まれても重複しません。
しかし CSV から手動インポート すると UID がカレンダー側で認識されず、同一イベントでも別イベントとして扱われるケースがあります。また、同じ UID を持つイベントが開始時刻や終了時刻だけ異なる場合は「更新」ではなく「新規」と見なされることもあります。これらの例外を踏まえて、重複チェックは必ずスクリプト側で実装するようにしてください。
実務上の活用例:プロジェクトリーダーが週次ミーティングや締め切りを TimeTree に入力すれば、全員が Google カレンダー上で確認できる。タスク管理は別ツール(Asana など)に任せ、カレンダーはスケジュール共有のみと限定すると運用がシンプルになります。
公式 iCal 購読方式による同期手順
このセクションでは、TimeTree の iCal URL を取得し Google カレンダーへ登録するまでの流れを段階的に説明します。各ステップの目的と注意点を併記しているので、設定ミスを防げます。
TimeTree アプリで共有 URL を取得する方法
- TimeTree アプリを起動し、対象カレンダーを開く。
- 右上の「設定」アイコン(歯車)→「カレンダー情報」へ進む。
- 「外部カレンダー連携」セクションで iCal URL をコピー ボタンをタップする。
取得した URL は「誰でも閲覧可能」な公開リンクです。権限が不要な社内だけの利用にとどめ、不要になったら速やかに削除してください。
Google カレンダーに iCal URL を登録し同期させる手順
- Google カレンダーを開き、左側メニューの「他のカレンダー」→「URLで追加」をクリック。
- 先ほどコピーした iCal URL を貼り付けて「カレンダーを追加」ボタンを押す。
- 新しいカレンダーがリストに表示され、数分後にイベントが自動的に読み込まれます。
Google がポーリングする間隔は固定で変更できません。そのため 即時反映 は期待しないようにしましょう。
同期頻度と更新タイミングの考慮点
| 項目 | 内容 |
|---|---|
| ポーリング間隔 | Google が公式に数値を公開していないが、実務上は 数分程度 の遅延が報告されている |
| 変更が反映されるまでの最大遅延 | 約10分程度(環境やサーバ負荷により変動) |
| キャッシュの影響 | URL を更新した場合、Google 側でキャッシュが残ることがある。削除→再追加でリフレッシュ可能 |
| タイムゾーン設定 | 両サービスのタイムゾーンが一致しているか事前に確認する(iOS/Android 設定と同一) |
ブックマークレット+Google Apps Script で一括エクスポート&インポート
大量データや二重登録防止が必要なケースでは、ブックマークレットで CSV を取得し、Google Apps Script(GAS)で自動的に Google カレンダーへインポートするフローが有効です。以下では実装手順と注意点を詳細に解説します。
対象月を CSV 化するブックマークレットの設置手順
ブックマークレットはブラウザ上だけで完結し、外部サーバーへデータが送信されません。トークンが URL に埋め込まれる点だけ注意してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
javascript:(function(){ const month = prompt('エクスポートしたい年月 (YYYY-MM) を入力してください'); if (!month) return; fetch(`https://api.timetreeapp.com/calendars/YOUR_CALENDAR_ID/events?start_at=${month}-01&until_at=${month}-31`,{ headers:{'Authorization':'Bearer YOUR_ACCESS_TOKEN'} }) .then(r=>r.json()) .then(data=>{ const rows = data.data.map(e=>[ e.attributes.title, e.attributes.start_at, e.attributes.end_at, e.id ]); const csv = ['タイトル,開始日時,終了日時,TimeTreeID',...rows.map(r=>r.join(','))].join('\n'); const blob = new Blob([csv],{type:'text/csv'}); const url = URL.createObjectURL(blob); const a=document.createElement('a');a.href=url;a.download=`timetree_${month}.csv`;a.click(); }) .catch(err=>alert('取得エラー: '+err)); })(); |
YOUR_CALENDAR_IDとYOUR_ACCESS_TOKENは、TimeTree の開発者向けページで取得したものに置き換えてください。- 実行後は指定月の CSV が自動ダウンロードされます。
Google Apps Script(2025 年版)で CSV を取り込み重複チェックする方法
以下のスクリプトは Google カレンダー API のカスタムメタデータ 機能(setTag/getTag)を利用した例です。なお、現時点(2026‑05)では setTag/getTag は ベータ機能 として提供されており、利用にはスクリプトエディタの「高度なサービス」から Calendar API を有効化する必要があります。古い環境やベータが無効の場合は、代替として event.setDescription() に UID を埋め込む方法も併記します。
|
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 36 37 38 39 40 41 42 |
/** * CSV (Google Drive) → Google カレンダー インポート * 2025 年版:UID 重複チェックは CalendarEvent のカスタムタグで実施 * ベータ機能が利用できない場合は description に UID を保存して検索してください。 */ const CALENDAR_ID = 'your_google_calendar_id@group.calendar.google.com'; const FOLDER_ID = 'YOUR_DRIVE_FOLDER_ID'; // CSV 保存フォルダ function importTimetreeCsv() { const folder = DriveApp.getFolderById(FOLDER_ID); const files = folder.getFilesByType(MimeType.CSV); while (files.hasNext()){ const file = files.next(); const csv = Utilities.parseCsv(file.getBlob().getDataAsString()); // ヘッダー行はスキップ for(let i=1; i<csv.length; i++){ const [title, startStr, endStr, timetreeId] = csv[i]; if (!title) continue; const uid = `timetree-${timetreeId}`; // カレンダーAPI を使用してカスタムタグで検索 const existing = Calendar.Events.list(CALENDAR_ID, { timeMin: startStr, timeMax: endStr, privateExtendedProperty: `uid=${uid}` }).items; if (existing.length > 0) continue; // 重複はスキップ // 新規作成(タグが使えない環境では description に UID を埋め込む) const event = Calendar.Events.insert({ summary: title, start: {dateTime: startStr}, end: {dateTime: endStr}, privateExtendedProperties: {uid: uid} }, CALENDAR_ID); } // インポート完了後はファイルをアーカイブ file.setTrashed(true); } } |
ポイントまとめ
| 項目 | 内容 |
|---|---|
| カスタムタグの有無 | setTag/getTag はベータ。利用できない場合は privateExtendedProperties(Calendar API)または description に UID を埋め込む |
| 重複判定ロジック | 同一 UID が同時間枠に存在するかを API の list メソッドで検索 |
| エラーハンドリング | 実運用では try/catch でネットワーク例外やフォーマットエラーを捕捉し、ログシートへ記録すると便利 |
同期解除・再設定の手順と注意点
Google カレンダーから iCal URL を削除する方法
- 左側メニューの「他のカレンダー」一覧で対象カレンダー名にカーソルを合わせる。
- 表示される ×(削除) アイコンをクリックし、確認ダイアログで「はい」を選択する。
削除後も過去にインポートされたイベントは残りますが、以降の更新は行われません。
キャッシュクリアと権限見直しのポイント
- キャッシュ:URL を変更した場合、Google が古い URL のキャッシュを保持することがあります。削除 → 再追加でリフレッシュしてください。
- 権限:TimeTree 側で「外部カレンダーへのアクセス」をオフにするとすべての iCal 共有が無効化されます。再設定時は必ず「閲覧のみ」が選択されていることを確認し、書き込み権限は存在しない点を認識しておきましょう。
- タイムゾーン:Google カレンダーとデバイスのタイムゾーンが不一致だとインポート後に時間がずれるケースがあります。両サービスで同一タイムゾーンを設定してください。
実務でよくあるエラーと対処法
イベントが反映されないケース
| 原因 | 確認手順 | 対策 |
|---|---|---|
| iCal URL が無効化された | TimeTree アプリの「外部カレンダー」設定を確認 | 新しい URL を取得し、Google に再登録 |
| Google のポーリング遅延 | 10 分以上経過後も反映がないかチェック | カレンダーを削除 → 再追加でリフレッシュ |
| CSV インポート時のフォーマットエラー | スプレッドシート上で Utilities.parseCsv の結果を確認 |
ISO 8601 (YYYY-MM-DDTHH:MM:SSZ) 形式に統一 |
タイムゾーンずれの原因と修正方法
- 原因:TimeTree はデバイスローカルタイム、Google カレンダーはカレンダー設定のタイムゾーンを使用するため差異が生じます。
- 修正手順
- TimeTree の「設定」→「タイムゾーン」を拠点に合わせる。
- Google カレンダーの「設定」→「一般」→「タイムゾーン」で同一に統一する。
招待メール未送信・通知漏れへの対応
iCal 購読方式は 招待メールを生成しません。参加者へ通知したい場合は、TimeTree 側でリマインダー機能を有効化するか、Google カレンダー上で手動でゲストを追加してください。
セキュリティ・プライバシー考慮点
公開 iCal URL の取り扱い
- URL は「誰でも閲覧可能」なリンクです。社外に漏れないよう、チャットやメールでの共有は最小限に抑えます。不要になったら必ず TimeTree 側で削除し、Google カレンダーからも解除してください。
GAS の権限設定
- 本スクリプトは 「カレンダーへのフルアクセス」+「ドライブファイルの読み取り/書き込み」 が必要です。不要なスコープ(例:Gmail 送信)を付与しないよう、
appsscript.jsonのoauthScopesを明示的に限定します。
|
1 2 3 4 5 6 7 8 9 |
{ "timeZone": "Asia/Tokyo", "exceptionLogging": "STACKDRIVER", "oauthScopes": [ "https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/drive.file" ] } |
データ漏洩防止ベストプラクティス
- CSV は必ず 限定共有フォルダ に保存し、アクセス権は管理者だけに付与。
- スクリプト実行後はインポート済みファイルを自動でゴミ箱へ移す(サンプル参照)。
- 社内では「iCal URL の再発行は管理者承認」や「GAS コードレビュー」を必須プロセスに組み込みます。
まとめ
- iCal 購読方式は 読み取り専用・数分遅延 が前提ですが、ほとんどのスケジュール共有シーンで十分に機能します。
- 手順通りに URL を取得し Google カレンダーへ登録すれば、即日同期が開始できます。
- 大量データや二重登録防止が必要な場合は ブックマークレット+Google Apps Script の組み合わせが有効です。ベータ機能の
setTag/getTagが利用できない環境でも、privateExtendedPropertiesまたはdescriptionに UID を埋め込む代替策があります。 - 同期解除・再設定時はキャッシュと権限に注意し、エラー対処法を把握しておけば障害対応も迅速です。
- 公開 URL の管理や GAS 権限の最小化など、セキュリティ面でも適切な運用を心掛けることが重要です。
このガイドに沿って設定すれば、TimeTree と Google カレンダー間のスムーズな情報共有が実現でき、プロジェクト管理やチームコミュニケーションの効率化につながります。