{"id":18689698,"url":"https://github.com/mrseanryan/gcal-move-it","last_synced_at":"2025-11-08T07:30:30.314Z","repository":{"id":55102183,"uuid":"291761170","full_name":"mrseanryan/gcal-move-it","owner":"mrseanryan","description":":calendar: Bulk process events in a Google Calendar - clean out duplicate URLs and email addresses, move events from one month to the next","archived":false,"fork":false,"pushed_at":"2023-03-31T18:48:17.000Z","size":61,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-28T01:49:39.258Z","etag":null,"topics":["calendar","google-calendar","google-calendar-api","google-calendar-cli"],"latest_commit_sha":null,"homepage":"","language":"Python","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/mrseanryan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2020-08-31T16:02:12.000Z","updated_at":"2021-12-10T14:05:27.000Z","dependencies_parsed_at":"2024-11-07T10:45:19.682Z","dependency_job_id":"6d76a92f-d142-46bf-9635-75701792ece5","html_url":"https://github.com/mrseanryan/gcal-move-it","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrseanryan%2Fgcal-move-it","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrseanryan%2Fgcal-move-it/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrseanryan%2Fgcal-move-it/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrseanryan%2Fgcal-move-it/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrseanryan","download_url":"https://codeload.github.com/mrseanryan/gcal-move-it/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239550286,"owners_count":19657541,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["calendar","google-calendar","google-calendar-api","google-calendar-cli"],"created_at":"2024-11-07T10:44:47.351Z","updated_at":"2025-11-08T07:30:30.276Z","avatar_url":"https://github.com/mrseanryan.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# :calendar: gcal_move_it README\n\nA command line tool to bulk process events in a Google Calendar:\n\n- clean the description of events, to remove duplicate URLs and email addresses, if the event was edited in the mobile version of Google Calendar\n- move events from one month to another\n\n# use\n\nSee the built-in help:\n\n```\npython gcal_move_it.py\n```\n\n```\n# clean:\n- clean descriptions that have doubled-up URLs or email addresses\n\nUsage: gcal_move_it.py clean \u003cmonth 1..12\u003e [options]\n\n# move:\n- Move non-recurring events from one month to the next month. (exception: a recurring event that was manually moved IS included)\n- Only events that occurred before today are moved.\n\nUsage: gcal_move_it.py move \u003csource month 1..12\u003e [options]\n\nThe options are:\n[-b --blacklist - Specify a blacklist to exclude some events]\n[-d --dryrun - Perform a dry run, without actually modifying the calendar]\n[-h --help]\n[-s --skipMovedRecurring] - Skip events that are recurring but were manually moved\n[-t --targetdate - Specify an exact target date (instead of the default which is 'one month later')]\n[-w --whitelist - Specify a whitelist to include only some events]\n\nExamples:\ngcal_move_it.py clean 1\ngcal_move_it.py move 1\ngcal_move_it.py move 1 -w urgent;important\ngcal_move_it.py move 1 -b \"cancelled;^done\" -d -w urgent;important\ngcal_move_it.py move 1 -w subject_1;subject_2 -t 2021-01-13\n```\n\nTry a dry run, that does not modify your calendar:\n\n```\npython gcal_move_it.py move 1 -d\n```\n\nMove events from March to the next month (April):\n\n```\npython gcal_move_it.py move 3\n```\n\nClean events in February:\n\n```\npython gcal_move_it.py clean 2\n```\n\n# notes on filtering\n\nEvents are filtered, before deciding which events to process.\n\nThe following built-in rulies for filtering are _always_ applied.\n\nEvents must be:\n\n- all-day, for 1 day\n- not a timed event (is all-day)\n- not recurring (except if was manually moved)\n\nExceptions:\n\n- For the 'move' command, the event must be before today.\n\nBesides that, the optional black and white lists are applied, as specified via options on the command line.\n\n# notes on prefixes\n\nA Google Calendar event can have a prefix added to its summary, to help filter via gcal-move-it.\n\n## standard prefixes\n\n| Prefix | Description         | Detail                                                                                                                                                                                                                                                     |\n| ------ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `[p]`  | `p`inned to weekday | If an event has the prefix `[p]` then it is considered as `p`inned to that day of the week. When the event is moved to the next month, the date will be adjusted to have the same day of the week. Note: the option `-targetdate` overrides this behavior. |\n\n## custom prefixes\n\nTogether with the `blacklist` or `whitelist` options, you can use whatever custom prefixes or tags you like in your events. Below are some examples.\n\n| Prefix | Description            | Detail                                                                   |\n| ------ | ---------------------- | ------------------------------------------------------------------------ |\n| `k`    | O`K` meaning is 'done' | The event is done, so it will NOT be moved to next month                 |\n| `done` | Done                   | The event is done, so it will NOT be moved to next month                 |\n| `n/a`  | `N`ot `A`pplicable     | The event is no longer applicable, so it will NOT be moved to next month |\n\n# setup\n\n1. Get the credentials file\n\n   Use the [Google Console](https://console.cloud.google.com/) to create a new project, and add the **Google Calendar API** to that project.\n\n   Option A\n\n   - Go to APIs \u0026 Services\n   - Create Credentials\n   - Select `OAuth 2.0 Client IDs`\n   - Select `Application Type` = `Desktop app`\n   - Type a suitable name (include the machine name)\n   - Download the credentials file\n\n   Option B\n\n   To create the credentials file, add a service account. Download the key in JSON format (the UI can be tricky to use!).\n\n   See the [Google documentation](https://cloud.google.com/docs/authentication/getting-started) for more details.\n\n2. Save the credentials file in this folder\n\nSo the file should be located at: `./credentials.json`\n\n3. Install Python 3.7.x and pip\n\n- Python 3.7.9 or later\n- pip 20.2.2 or later\n\n4. Install dependencies\n\n```\npip install -r pip.config\n```\n\n# libraries used\n\ngcal-move-it uses a few nice libraries:\n\n| Library       | URL                                             | Description                                              |\n| ------------- | ----------------------------------------------- | -------------------------------------------------------- |\n| calendar      | https://docs.python.org/3/library/calendar.html | For calendar operations like ‘get weekday for this date’ |\n| parameterized | https://pypi.org/project/parameterized/         | Easily parameterize your unit tests                      |\n\n# tools used\n\n| Tool | URL                           | Description                                                                                                               |\n| ---- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| pip  | https://pypi.org/project/pip/ | pip used with a config file, makes it easy to restore a Python project on another machine (even between Windows and Mac!) |\n\n# references\n\n[Google Calendar API](https://developers.google.com/calendar/v3/reference/events/list)\n\n[Google Calendar API - Concepts](https://developers.google.com/calendar/concepts)\n\n[Google Calendar API - Python client API](http://googleapis.github.io/google-api-python-client/docs/dyn/calendar_v3.events.html)\n\n[Quickstart example](https://developers.google.com/calendar/quickstart/python)\n\n[Python Babel library (used for dates)](http://babel.pocoo.org/en/latest/)\n\n# license\n\nLicense is [MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrseanryan%2Fgcal-move-it","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrseanryan%2Fgcal-move-it","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrseanryan%2Fgcal-move-it/lists"}