{"id":45736216,"url":"https://github.com/terakoya76/google-calendar-duplicator","last_synced_at":"2026-02-25T11:10:42.996Z","repository":{"id":337960857,"uuid":"1156088052","full_name":"terakoya76/google-calendar-duplicator","owner":"terakoya76","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-12T14:31:39.000Z","size":29,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-12T15:23:54.171Z","etag":null,"topics":["google-apps-script","google-calendar"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/terakoya76.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-12T08:47:15.000Z","updated_at":"2026-02-12T14:34:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/terakoya76/google-calendar-duplicator","commit_stats":null,"previous_names":["terakoya76/google-calendar-duplicator"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/terakoya76/google-calendar-duplicator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terakoya76%2Fgoogle-calendar-duplicator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terakoya76%2Fgoogle-calendar-duplicator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terakoya76%2Fgoogle-calendar-duplicator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terakoya76%2Fgoogle-calendar-duplicator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/terakoya76","download_url":"https://codeload.github.com/terakoya76/google-calendar-duplicator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terakoya76%2Fgoogle-calendar-duplicator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29819266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T05:36:42.804Z","status":"ssl_error","status_checked_at":"2026-02-25T05:36:31.934Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["google-apps-script","google-calendar"],"created_at":"2026-02-25T11:10:42.134Z","updated_at":"2026-02-25T11:10:42.974Z","avatar_url":"https://github.com/terakoya76.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# google-calendar-duplicator\n\nGoogle Calendar Duplicator is a Google Apps Script (GAS) application that synchronizes calendar availability between multiple Google Calendars while preserving privacy.\n\nInstead of copying actual event details, it creates placeholder events (e.g., \"Absence\") that only show time slots, allowing users to indicate busy times without revealing meeting specifics.\n\nUse Cases\n1. Cross-account synchronization: Sync busy times between personal and work Google accounts\n2. Calendar aggregation: Combine multiple source calendars into a single \"availability\" calendar\n\n## Usage\n\n### Install deps\n\n```sh\nmise install\npnpm install\n```\n\n### Deploy\n\n```sh\nclasp login\n\n# The credential is saved into ~/.clasprc.json\nmv ~/.clasprc{,-hoge}.json\n\n# Create GAS manually on the google account.\n# Then, update scriptId and repository location\ncp .clasp-template.json ./config/.clasp-hoge.json\nvim ./config/.clasp-hoge.json\n\n# deploy\nclasp push -P ./config/.clasp-hoge.json -A ~/.clasprc-hoge.json -I ./.claspignore\n```\n\n### Script Properties\n\nYou need to configure the following Script Properties in GAS.\n1. Open your project in [Google Apps Script](https://script.google.com/)\n2. Click `Project Settings` in the left menu\n3. In the `Script Properties` section, click `Add script property`\n\nRequired Properties\n\n| Property | Description |\n|----------|-------------|\n| `SYNC_CONFIG` | JSON configuration for calendar sync |\n\n```sh\njq . -c \u003c\u003cEOF\n{\n  \"toCalendarId\": \"target-calendar-id@example.com\",\n  \"fromCalendarIds\": [\n    \"source-calendar-1@example.com\",\n    \"source-calendar-2@gmail.com\",\n    \"source-calendar-2@group.calendar.google.com\"\n  ],\n  \"eventTitle\": \"Absence\"\n}\nEOF\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `toCalendarId` | string | Target calendar ID to sync events to |\n| `fromCalendarIds` | string[] | Array of source calendar IDs to sync events from |\n| `eventTitle` | string | Title for the placeholder events created in target calendar |\n\n### Setting Up Triggers\n\nThis application uses time-based triggers to automatically synchronize calendar events. You need to configure triggers through the GAS UI.\n1. Open your project in [Google Apps Script](https://script.google.com/)\n2. Click `Triggers` (clock icon) in the left menu\n3. Click `+ Add Trigger` button in the bottom right\n4. Configure the trigger:\n   - `Choose which function to run`: Select one of the sync functions\n   - `Choose which deployment should run`: Head\n   - `Select event source`: Time-driven\n   - `Select type of time based trigger`: Choose appropriate interval\n\nRecommendation\n\n| Function | Frequency | Rationale |\n|----------|-----------|-----------|\n| `syncEventsForToday` | Every 10 minutes | Catch last-minute changes for today |\n| `syncEventsForTommorow` | Every 10 minutes | Keep tomorrow's schedule updated |\n| `syncEventsAfter2To14Days` | Hourly | Near-future events change less frequently |\n| `syncEventsAfter15To90Days` | Daily | Far-future events rarely change |\n\n### Task Runner\n\nCreate your own mise.local.toml to register deploy commands.\n\n```sh\ncat \u003c\u003cEOF \u003e mise.local.toml\n[tasks.deploy]\ndescription = \"Deploy to all Google Apps Script projects\"\ndepends = [\"deploy-account-1\", \"deploy-account-2\"]\n\n[tasks.deploy-account-1]\ndescription = \"Deploy to account-1 Google Apps Script project\"\nrun = \"clasp push -P ./config/.clasp-account-1.json -A ~/.clasprc-account-1.json -I ./.claspignore\"\n\n[tasks.deploy-account-2]\ndescription = \"Deploy to account-2 Google Apps Script project\"\nrun = \"clasp push -P ./config/.clasp-account-2.json -A ~/.clasprc-account-2.json -I ./.claspignore\"\nEOF\n\nmise run deploy\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fterakoya76%2Fgoogle-calendar-duplicator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fterakoya76%2Fgoogle-calendar-duplicator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fterakoya76%2Fgoogle-calendar-duplicator/lists"}