{"id":37197180,"url":"https://github.com/cristoper/gsheet","last_synced_at":"2026-01-14T22:55:38.764Z","repository":{"id":40521902,"uuid":"384512418","full_name":"cristoper/gsheet","owner":"cristoper","description":"gsheet is a CLI tool (and Golang package) for piping csv data to and from Google Sheets","archived":false,"fork":false,"pushed_at":"2024-06-09T16:10:50.000Z","size":179,"stargazers_count":75,"open_issues_count":2,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-19T02:09:10.606Z","etag":null,"topics":["cli","csv","gdrive","golang","google-drive","google-sheets","gsheets"],"latest_commit_sha":null,"homepage":"","language":"Go","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/cristoper.png","metadata":{"files":{"readme":"readme.adoc","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"ko_fi":"cristoper","custom":["https://www.buymeacoffee.com/cristoper"]}},"created_at":"2021-07-09T17:48:20.000Z","updated_at":"2024-06-09T16:10:54.000Z","dependencies_parsed_at":"2024-05-14T04:25:30.500Z","dependency_job_id":"b96ee8ba-1913-42a0-a599-c5c0a3890802","html_url":"https://github.com/cristoper/gsheet","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/cristoper/gsheet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristoper%2Fgsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristoper%2Fgsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristoper%2Fgsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristoper%2Fgsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cristoper","download_url":"https://codeload.github.com/cristoper/gsheet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cristoper%2Fgsheet/sbom","scorecard":{"id":308993,"data":{"date":"2025-08-11","repo":{"name":"github.com/cristoper/gsheet","commit":"ade3ae5e99fb6ce5c58ffe90e7c90b86579043aa"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"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/go.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":"Code-Review","score":0,"reason":"Found 2/29 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":"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/go.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/cristoper/gsheet/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/cristoper/gsheet/go.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction 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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.4 not signed: https://api.github.com/repos/cristoper/gsheet/releases/159561532","Warn: release artifact v0.1.3 not signed: https://api.github.com/repos/cristoper/gsheet/releases/155609577","Warn: release artifact v0.1.2 not signed: https://api.github.com/repos/cristoper/gsheet/releases/152608006","Warn: release artifact v0.1.1 not signed: https://api.github.com/repos/cristoper/gsheet/releases/126041965","Warn: release artifact v0.1.0 not signed: https://api.github.com/repos/cristoper/gsheet/releases/46095942","Warn: release artifact v0.1.4 does not have provenance: https://api.github.com/repos/cristoper/gsheet/releases/159561532","Warn: release artifact v0.1.3 does not have provenance: https://api.github.com/repos/cristoper/gsheet/releases/155609577","Warn: release artifact v0.1.2 does not have provenance: https://api.github.com/repos/cristoper/gsheet/releases/152608006","Warn: release artifact v0.1.1 does not have provenance: https://api.github.com/repos/cristoper/gsheet/releases/126041965","Warn: release artifact v0.1.0 does not have provenance: https://api.github.com/repos/cristoper/gsheet/releases/46095942"],"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 'master'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 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"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9","Warn: Project is vulnerable to: GO-2024-2978 / GHSA-xr7q-jx4m-x55m"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T22:47:47.130Z","repository_id":40521902,"created_at":"2025-08-17T22:47:47.130Z","updated_at":"2025-08-17T22:47:47.130Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28437337,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"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":["cli","csv","gdrive","golang","google-drive","google-sheets","gsheets"],"created_at":"2026-01-14T22:55:38.046Z","updated_at":"2026-01-14T22:55:38.704Z","avatar_url":"https://github.com/cristoper.png","language":"Go","funding_links":["https://ko-fi.com/cristoper","https://www.buymeacoffee.com/cristoper"],"categories":[],"sub_categories":[],"readme":":toc:\n:toc-placement!:\n\n= gsheet\n\ntoc::[]\n\n== Introduction\n\n`gsheet` is a cli tool for sending and receiving csv data to and from Google Sheets.\n\nWith `gsheet` you can:\n\n- Pipe csv data from stdin to a Google Sheet range +\n`cat data.csv | gsheet csv --id 1o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ --range 'Sheet1'`\n- Pipe csv data from a Google Sheet range to stdout +\n`gsheet csv --id 1o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ --range 'Sheet!A1:D20' \u003e data.csv`\n- Clear a Google Sheet range +\n`gsheet clear --id 1o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ --range Sheet2`\n- Create and delete sheets of a Spreadsheet document +\n`gsheet newSheet --id 1o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ --name NewSheet`\n- Sort a sheet by a column +\n`gsheet sort --id 1o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ --name Sheet1 -c 2`\n\nGoogle Drive operations (with special handling for .csv):\n\n- Upload .csv files to Google Drive as Sheet documents +\n`gsheet upload --parent PARENT_ID ./path/to/data.csv`\n- Download Google Sheet documents from Google Drive as .csv files +\n`gsheet download 2o88FhvAXg8Q_ZMFudQLuZ1ShsigbAgJ \u003e data.csv`\n- Create a new empty folder +\n`gsheet createFolder --parent PARENT_ID 'New Folder Name'`\n\nYou can also upload/delete and get info about arbitrary files on Google Drive, but `gsheet` isn't trying to be a general purpose gdrive interface. If you need a full Google Drive command-line client, check out https://github.com/odeke-em/drive[odeke-em/drive], or something that provides a filesystem interface like https://github.com/rclone/rclone[rclone].\n\nFor more on how to use `gsheet` see \u003c\u003cusage\u003e\u003e below.\n\n`gsheet` supports authenticating with Google using https://cloud.google.com/iam/docs/understanding-service-accounts[service accounts], which is a simple way to allow scripts to access Google Sheets (see \u003c\u003cauth\u003e\u003e below).\n\n=== Why?\n\nI often write scripts and cron jobs for clients that create tabular reports, and I've found that Google Sheets is a convenient way to expose them on the web (easy to use, built-in access control). In addition, I've found that setting up a Sheet with a few fields that my script can read is a convenient way to allow clients to configure apps without needing to build a web interface just to get a few runtime config values.\n\nMy typical workflow is to create a Sheet using Google's web interface, set up the formatting and any formulas, and then use `gsheet` to update the data from scripts.\n\n== Installation\n\n`gsheet` is not yet packaged for any package manager yet (let me know if you can help with that!), but you can download binaries for major platforms from https://github.com/cristoper/gsheet/releases[the Releases page].\n\nOtherwise, if you have Go installed you can:\n\n[source, bash]\n----\n# Install with go\ngo install github.com/cristoper/gsheet/cmd/gsheet@latest\n\n# or build/install from git repo\ngit clone https://github.com/cristoper/gsheet.git\ncd gsheet\ngo install ./cmd/gsheet\n----\n\nHowever, building from source will pull in the build dependencies (Google's API SDKs) which are big (200MB+) so can be slow to download.\n\n[#auth]\n== Authentication and Authorization\n\nThe hardest part about getting started with `gsheet` is creating the API credentials so that the program can access Google Drive, but it's not so bad and you only have to do it once. In order for `gsheet` to read and update Sheets documents, it must 1) be provided credentials to authenticate with Google and 2) be granted access to whichever Google Drive folders/documents it should be able to read/write:\n\n. Create a service account and download the credentials .json file to the computer you will use `gsheet` on. Set the `GOOGLE_APPLICATION_CREDENTIALS` envvar to the absolute path to that file before running `gsheet`.\n** From the https://console.cloud.google.com/home/dashboard[Google Cloud API Dashboard] create a new project and enable both the `Google Drive API` and the `Google Sheets API` on it. See https://cloud.google.com/apis/docs/getting-started[Google's Getting Started Guide] for creating a project and enabling APIs.\n** From your project's dashboard Click on \"IAM \u0026 Admin\" \u003e \"Service Accounts\". Then click \"Create Service Account\". For the service account's role I recommend \"Basic\u003eEditor\".\n** Once the service account is created, click on it to manage its details. From the \"Keys\" tab click \"Add Key\" to create credentials in a .json file for the service account that `gsheet` will use to authenticate as the user.\n*** The .json file containing the credentials should download automatically. KEEP THIS FILE SECRET (do not check it into source control). Anyone with the credentials can edit any files you grant the service account access to.\n*** Google's documentation is available as https://cloud.google.com/iam/docs/creating-managing-service-accounts[Creating and Managing Service Accounts] and https://cloud.google.com/iam/docs/creating-managing-service-account-keys[Creating and Managing Service Account Keys]\n** Set the `GOOGLE_APPLICATION_CREDENTIALS` environment variable to the path to the .json file. This is how `gsheet` finds the credentials when it runs. NOTE: `GOOGLE_APPLICATION_CREDENTIALS` must contain the *absolute* path to the .json file. (See https://cloud.google.com/docs/authentication[Google's Authentication Overview].)\n. In Google Drive grant share files and folders with the service account (the email address generated when you created the service account above) as if it were any other user. Note that if you only want to store files in the service account's own drive (not viewable from the Google Drive web interface), then you don't actually have to grant it access to any of your folders or documents.\n\n=== What about OAuth authentication?\n\nCurrently `gsheet` only supports service accounts which, despite the convoluted instructions above, are simple to generate and use once you figure it out (you just need a single .json file with credentials to grant a script access to Google services).\n\nHowever, if an OAuth workflow (where you can authenticate `gsheet` using your own Google account) would be useful to someone, I'm open to implementing it. Feel free to create an issue. In the mean time check out https://github.com/simon3z/gsheetcsv[simon3z/gsheetcsv] which is another simple cli tool in Go which allows interacting with Google Sheets and uses OAuth for authentication.\n\n[#usage]\n== CLI Usage\n\nTo get an overview of all the commands provided by `gsheet` run:\n\n[source,sh]\ngsheet help\n\n```\nNAME:\n   gsheet - upload and download Google Sheet data from the cli\n\nUSAGE:\n   gsheet [global options] command [command options] [arguments...]\n\nCOMMANDS:\n   help, h  Shows a list of commands or help for one command\n   Files:\n     createFolder  Creates a new folder\n     delete        Delete file(s) from drive (careful, does not trash them!)\n     list          List file names and ids\n     upload        Upload a file to Google Drive.\n     download      Download a file from google drive and send it to stdout\n     info          Dump all file's metadata as json to stdout\n   Sheets:\n     csv          Pipe csv data to range or read it from range\n     title        Get the title of a sheet by its id\n     sheetInfo    Dump info about the spreadsheet as json\n     clear        Clear all values from given range\n     newSheet     Create a new sheet\n     deleteSheet  Delete the named sheet\n     sort         Sort a sheet by column(s)\n\nGLOBAL OPTIONS:\n   --help, -h  show help\n```\n\nYou can also run `gsheet help CMD` to get help for each command.\nBelow are some further usage hints.\n\nRemember that for any of the commands to work you must have the GOOGLE_APPLICATION_CREDENTIALS environment variable set to a path containing the service account credentials in a .json file.\n\n=== Sheet commands\n==== csv and clear\n\nThe `csv` command is the heart of `gsheet`. If you pipe csv data to it on std input, it sends the data to the specified range of the Sheets document identified by the `--id` flag. If you pass the `--append` flag, data will be appended to the last row of data found in range.\n\nIf you don't connect stdin to a pipe, then it will read the specified range and output it to stdout in csv format.\nTo force `gsheet` to read a range even if stdin is not connected to a tty, you can pass the `--read` flag.\n\nNOTE: `csv` does not clear the range before updating data in a Sheets document. If the piped data is smaller (fewer rows or columns) than the specified range, then any pre-existing data in the spreadsheet will remain after the update. Use `gsheet clear` to clear a range.\n\n[source,sh]\n----\n# Replace an entire sheet of a Spreadsheet doc with the contents of data.csv\ngsheet --id SHEETS_DOC_ID clear --range Sheet1\ncat data.csv | gsheet --id SHEETS_DOC_ID --range Sheet1\n\n# Append the contents of data.csv after the lat line of existing data in Sheet1\ncat data.csv | gsheet --id SHEETS_DOC_ID --range Sheet1 --append\n\n# Read a specific range of a sheet to output.csv\n# (You can always single quote sheet names and include the exclamation point in\n# the single quotes so that the shell doesn't try to interpret it.)\ngsheet --id SHEETS_DOC_ID --range 'Sheet1!'A2:C5 \u003e output.csv\n----\n\n==== sort\n\nAn existing sheet can be sorted by any (single) column in either descending (default) or ascending order:\n\n[source,sh]\n----\n# Sort sheet by B column in ascending order\nsort --id SHEET_NAME -name Sheet1 --column=1 --asc\n----\n\n==== newSheet and deleteSheet\n\nThese commands simply create and delete sheets from a spreadsheet document. The new sheets appear after all other visible sheets.\n\nNOTE: sheets are deleted by name (the title of the sheet) and not by id; this is a bit fragile because if a user changes the title of a sheet in Google Docs then a script depending on `gsheet deleteSheet` may break. For a convenient way to look up a sheet's title by its id, see the `gsheet title` command.\n\n[source,sh]\n----\n# After running this you should see a new sheet called \"SHEET_NAME\" in the\n# spreadsheet with id \"SHEETS_DOC_ID\"\ngsheet newSheet --id SHEETS_DOC_ID --name SHEET_NAME\n\n# After running this it should be gone again\ngsheet deleteSheet --id SHEETS_DOC_ID --name SHEET_NAME\n----\n\n=== Drive commands\n\n==== upload and download\n\nThe `upload` and `download` commands can be used to upload and download arbitrary files to Google Drive. They provide special handling for .csv files: uploading a .csv file will import it to Google Drive as a Sheets document, and downloading a Sheets document will export the first visible sheet as a .csv file.\n\nDownloading any other Google Workspace document types will attempt to export them as plain text files.\n\nNot that using `upload` without giving it a parent id with `--parent` (or setting the `GSHEET_PARENT` envar) will cause it to upload the file to the service account's root folder where it is not accessible to humans via Google Drive.\n\n[source,sh]\n----\n# Upload data.csv as a Sheets document in the service account's root directory\ngsheet upload --parent root data.csv\n\n# Download an image from drive\n# Note that download takes a single positional argument: the id of the google\n# drive file to download, and it sends its output to stdout.\ngsheet download DRIVE_DOC_ID \u003e image.png\n----\n\n==== delete\n\nThe `delete` command can be used to delete one or more files by id (list each id as a positional argument). Outputs a confirmation as each file is deleted.\n\nNOTE: delete immediately deletes a file and does not move it to the trash.\n\n==== list\n\n[source,sh]\n----\n# List all files and their ids that are in the service account's root folder\ngsheet list --parent root\n----\n\n==== createFolder\n\nSometimes it is nice if a script can create a new folder to keep all of its own files in. The output of the `createFolder` command includes the id of the created folder.\n\n[source,sh]\n----\n# Create a foler in service account's root (specify --parent to use a different\n# folder)\n$ gsheet createFolder FOLDER_NAME\nCreated directory named FOLDER_NAME with id 1ApMOHtZtTVM_UU7HyUCvMIIa3R5fDf6N\n----\n\n=== Ranges\n\nThe `csv` and other commands make use of ranges in A1 notation. Examples of A1 notation can be found in the Google documentation here:\n\nhttps://developers.google.com/sheets/api/guides/concepts\n\n=== Finding document and parent IDs\n\nMany of the commands operate on the Google Drive ID of a document or a \"parent\" folder. A convenient way to get these IDs is to just use a web browser and open a file or folder on https://drive.google.com/ to see the ID in the URL. But you can also use `gsheet list` to list all of the files and folders the service account knows about along with their IDs.\n\n=== Environment Variables\n\nGOOGLE_APPLICATION_CREDENTIALS:: Must be set to the absolute path of a .json file containing credentials for a service account\n\nGSHEET_ID:: Can be set instead of setting the `--id` flag on any command that accepts that flag to identify a spreadsheet document to operate on\n\nGSHEET_PARENT:: Can be set instead of setting the `--parent` flag on any command that accepts that flag to identify a drive folder to operate on\n\n== Use as Golang Package\n\nIn addition to the cli tool, `gsheet` can be used as a Golang package to simplify access to Google Sheets and Google Drive from Go.\n\nAll of the Sheets related functions are in the `gsheets` package (`gsheets/sheets.go`), and all of the Drive related functions are in the `gdrive` pacakge (`gdrive/files.go`).\n\nOnline godoc documentation for the packages can be found here:\n\n- https://pkg.go.dev/github.com/cristoper/gsheet/gdrive\n- https://pkg.go.dev/github.com/cristoper/gsheet/gsheets\n\nFor a quick-and-dirty example of how to use the packages look at the `integration_test.go` file included in each package.\n\n== Hack\n\nTo run tests:\n\n----\nmake test\n----\n\nTo build:\n\n----\nmake build\n----\n\nTo build binaries for various platforms in `build/`:\n\n----\nmake xbuild\n----\n\nTo release:\n\ntbd\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristoper%2Fgsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcristoper%2Fgsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristoper%2Fgsheet/lists"}