{"id":34107337,"url":"https://github.com/chrislarabee/autodrive","last_synced_at":"2026-05-30T00:01:17.771Z","repository":{"id":46632699,"uuid":"344890982","full_name":"chrislarabee/autodrive","owner":"chrislarabee","description":"Simple but robust tool for interacting with the Google Drive and Sheets apis via python. ","archived":false,"fork":false,"pushed_at":"2026-05-29T22:05:29.000Z","size":617,"stargazers_count":2,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-29T23:16:19.590Z","etag":null,"topics":["google","google-drive","google-sheets","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrislarabee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-05T17:53:36.000Z","updated_at":"2026-05-29T22:05:28.000Z","dependencies_parsed_at":"2023-01-31T05:31:25.885Z","dependency_job_id":null,"html_url":"https://github.com/chrislarabee/autodrive","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/chrislarabee/autodrive","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrislarabee%2Fautodrive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrislarabee%2Fautodrive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrislarabee%2Fautodrive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrislarabee%2Fautodrive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrislarabee","download_url":"https://codeload.github.com/chrislarabee/autodrive/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrislarabee%2Fautodrive/sbom","scorecard":{"id":280238,"data":{"date":"2025-08-11","repo":{"name":"github.com/chrislarabee/autodrive","commit":"7cd01078f4da00344ac113ab6865b5aaa4922ddd"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.2,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/autodrive-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/autodrive-test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/autodrive-publish.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/chrislarabee/autodrive/autodrive-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/autodrive-publish.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/chrislarabee/autodrive/autodrive-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/autodrive-test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/chrislarabee/autodrive/autodrive-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/autodrive-test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/chrislarabee/autodrive/autodrive-test.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/autodrive-publish.yml:19","Warn: pipCommand not pinned by hash: .github/workflows/autodrive-publish.yml:20","Warn: pipCommand not pinned by hash: .github/workflows/autodrive-test.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/autodrive-test.yml:28","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2022-269 / GHSA-3pgj-pg6c-r5p7","Warn: Project is vulnerable to: GHSA-8gq9-2x98-w8hf","Warn: Project is vulnerable to: GHSA-8qvm-5x2c-j2w7","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T15:35:39.186Z","repository_id":46632699,"created_at":"2025-08-17T15:35:39.186Z","updated_at":"2025-08-17T15:35:39.186Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33675019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","google-drive","google-sheets","python"],"created_at":"2025-12-14T18:05:38.912Z","updated_at":"2026-05-30T00:01:17.594Z","avatar_url":"https://github.com/chrislarabee.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Autodrive\r\n\r\nAutodrive is designed to make it as easy as possible to interact with the Google\r\nDrive and Sheets APIs via Python. It is especially designed to provide as much\r\nassistance as possible when writing code through hints and autocompletion, as well\r\nas via thorough type checking and hinting. These features are currently optimized\r\nfor VSCode, which you can download \u003ca href=\"https://code.visualstudio.com/\"\u003ehere\u003c/a\u003e\r\nif you wish. They should also work in other Python IDEs.\r\n\r\n---\r\n\r\n**Documentation:** https://autodrive-py.readthedocs.io/en/latest/\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n---\r\n\r\nPython 3.8+\r\n\r\n## Installation\r\n\r\n---\r\n\r\n### Google API Credentials\r\n\r\nFollow the steps outlined in the Prerequisites section\r\n\u003ca href=\"https://developers.google.com/drive/api/v3/quickstart/python\"\u003ehere\u003c/a\u003e.\r\nDownload and save the `credentials.json` file to the working directory you want to\r\nuse Autodrive in.\r\n\r\n### First Connection\r\n\r\nTo test that your credentials provide the expected connection to your Google Drive\r\naccount, simply instantiate an Autodrive `Drive` instance:\r\n\r\n```\r\nfrom autodrive import Drive\r\n\r\ndrive = Drive()\r\n```\r\n\r\nIf your credentials file was saved as `credentials.json`, your browser should\r\nautomatically open and prompt you to authorize the GCP project you created to\r\naccess your Google Drive. Click the various Allow prompts it will show you to\r\ncomplete your first connection. After you see the browser switch to a page\r\nindicating you can close the process, you should see a `gdrive_token.json` file\r\nadded to the working directory you saved your `credentials.json` file in. Next time\r\nyou use an Autodrive element that needs to connect to your Drive, this token will\r\nbe used and you will not be prompted to authorize access again until it expires.\r\n\r\n## Quickstart\r\n\r\n---\r\n\r\nThe `Drive` class provides methods for finding and creating objects in your Google\r\nDrive, such as Folders or Sheets.\r\n\r\n```\r\ngsheet = drive.create_gsheet(\"my-autodrive-gsheet\")\r\n```\r\n\r\n### Finding IDs\r\n\r\nIf you use `Drive` to search for your Sheets and Folders, you don't need to supply the\r\nGSheet or Folder IDs yourself, but if you know exactly what Sheet you want, then you\r\ncan directly instantiate a GSheet or folder by pulling the necessary info from the\r\nobject's url.\r\n\r\nFor example, if your Sheet's url looks like this:\r\n\r\n\u003cp\u003e\r\ndocs.google.com/spreadsheets/d/19k5cT9Klw1CA8Sum-olP7C0JUo6_kMiOAKDEeHPiSr8/edit#gid=0\r\n\u003c/p\u003e\r\n\r\nSimply copy/paste the id between `/d/` and `/edit#` as the `gsheet_id`:\r\n\r\n```\r\nfrom autodrive import GSheet\r\n\r\ngsheet = GSheet(gsheet_id=\"19k5cT9Klw1CA8Sum-olP7C0JUo6_kMiOAKDEeHPiSr8\")\r\n```\r\n\r\n\u003e **Tabs:** Because Google calls spreadsheets \"Sheets\", and their api also refers\r\n\u003e to the individual sub-sheets in a spreadsheet as \"Sheets\", Autodrive instead\r\n\u003e refers to them as \"Tabs\" for clarity.\r\n\r\nFor a tab, you can get the `tab_id` from:\r\n\r\n\u003cp\u003e\r\ndocs.google.com/spreadsheets/d/19k5cT9Klw1CA8Sum-olP7C0JUo6_kMiOAKDEeHPiSr8/edit#gid=234276686\r\n\u003c/p\u003e\r\n\r\n```\r\nfrom autodrive import Tab\r\n\r\ntab = Tab(\r\n    gsheet_id=\"19k5cT9Klw1CA8Sum-olP7C0JUo6_kMiOAKDEeHPiSr8\",\r\n    tab_title=\"Sheet2\",\r\n    tab_idx=0,\r\n    tab_id=234276686\r\n)\r\n```\r\n\r\nFor a folder:\r\n\r\n\u003cp\u003e\r\ndrive.google.com/drive/u/1/folders/1wLx-KMG2jO498xa5ZumB-SEpL-TwczZI\r\n\u003c/p\u003e\r\n\r\n```\r\nfrom autodrive import Folder\r\n\r\nfolder = Folder(folder_id=\"1wLx-KMG2jO498xa5ZumB-SEpL-TwczZI\", name=\"Test Folder\")\r\n```\r\n\r\n### Reading and Writing\r\n\r\nYou can easily download and write data from a Google Sheet using the `GSheet`,\r\n`Tab`, or `Range` views.\r\n\r\n```\r\n# Fetches all the data in all cells of the tab:\r\ntab.get_data()\r\n\r\n# Writes 8 cells (2 rows of 4 columns, starting in cell A1) to the tab:\r\ntab.write_values(\r\n    [\r\n        [1, 2, 3, 4],\r\n        [5, 6, 7, 8],\r\n    ]\r\n)\r\n```\r\n\r\n`GSheet` and `Range` have very similar methods, and all of them allow you to read\r\nand write data to only a specific range in the Google Sheet. See the\r\n\u003ca href=\"https://autodrive-py.readthedocs.io/en/latest/\"\u003eDocumentation\u003c/a\u003e\r\nfor more.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrislarabee%2Fautodrive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrislarabee%2Fautodrive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrislarabee%2Fautodrive/lists"}