Git Product home page Git Product logo

elixir_google_spreadsheets's Introduction

Elixir Google Spreadsheets

Elixir library to read and write data of Google Spreadsheets.

This library is based on Google Cloud API v4 and uses Google Service Accounts to manage it's content.

Integration with Ecto

Check ecto_gss if you need to integrate your Google Spreadsheet with Ecto changesets for validation and other features.

Setup

  1. Use this wizard to create or select a project in the Google Developers Console and automatically turn on the API. Click Continue, then Go to credentials.
  2. On the Add credentials to your project page, create Service account key.
  3. Select your project name as service account and JSON as key format, download the created key and rename it to service_account.json.
  4. Press Manage service accounts on a credential page, copy your Service Account Identifier: [projectname]@[domain].iam.gserviceaccount.com
  5. Create or open existing Google Spreadsheet document on your Google Drive and add Service Account Identifier as user invited in spreadsheet's Collaboration Settings.
  6. Add {:elixir_google_spreadsheets, "~> 0.3"} to mix.exs under deps function, add :elixir_google_spreadsheets in your application list.
  7. Add service_account.json in your config.exs or other config file, like dev.exs or prod.secret.exs. config :elixir_google_spreadsheets, json: "./config/service_account.json" |> File.read!
  8. Run mix deps.get && mix deps.compile.

API limits

All Google API limits, suggested params are the following:

config :elixir_google_spreadsheets, :client,
  request_workers: 50,
  max_demand: 100,
  max_interval: :timer.minutes(1),
  interval: 100,
  result_timeout: :timer.minutes(10)

Since elixir 1.14 the following request params are used by default, you can modify them as :request_opts:

  [
    timeout: :timer.seconds(8),
    recv_timeout: :timer.seconds(5),
    ssl: [
      versions: [:"tlsv1.2"],
      verify: :verify_peer,
      depth: 99,
      cacerts: :certifi.cacerts(),
      customize_hostname_check: [
        match_fun: :public_key.pkix_verify_hostname_match_fun(:https)
      ],
      reuse_sessions: false,
      crl_check: true,
      crl_cache: {:ssl_crl_cache, {:internal, [http: 30000]}}
    ]
  ]

Usage

Initialise spreadsheet thread with it's id which you can fetch from URL:

    {:ok, pid} = GSS.Spreadsheet.Supervisor.spreadsheet("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX")

Or if you wish to edit only a specific list:

    {:ok, pid} = GSS.Spreadsheet.Supervisor.spreadsheet(
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX",
        list_name: "my_list3"
    )

Sample operations:

  • GSS.Spreadsheet.id(pid)
  • GSS.Spreadsheet.properties(pid)
  • GSS.Spreadsheet.sheets(pid)
  • GSS.Spreadsheet.rows(pid)
  • GSS.Spreadsheet.read_row(pid, 1, column_to: 5)
  • GSS.Spreadsheet.read_rows(pid, 1, 10, column_to: 5, pad_empty: true)
  • GSS.Spreadsheet.read_rows(pid, [1, 3, 5], column_to: 5, pad_empty: true)
  • GSS.Spreadsheet.read_rows(pid, ["A1:E1", "A2:E2"])
  • GSS.Spreadsheet.write_row(pid, 1, ["1", "2", "3", "4", "5"])
  • GSS.Spreadsheet.write_rows(pid, ["A2:E2", "A3:F3"], [["1", "2", "3", "4", "5"], ["1", "2", "3", "4", "5", "6"]])
  • GSS.Spreadsheet.append_row(pid, 1, ["1", "2", "3", "4", "5"])
  • GSS.Spreadsheet.append_rows(pid, 1, [["1", "2", "3", "4", "5"], ["1", "2", "3", "4", "5", "6"]])
  • GSS.Spreadsheet.clear_row(pid, 1)
  • GSS.Spreadsheet.clear_rows(pid, 1, 10)
  • GSS.Spreadsheet.clear_rows(pid, ["A1:E1", "A2:E2"])

Last function param of GSS.Spreadsheet function calls support the same Keyword options (in snake_case instead of camelCase), as defined in Google API Docs.

We also define column_from and column_to Keyword options which control range of cell which will be queried.

Default values:

  • column_from = 1 - default is configurable as :default_column_from
  • column_to = 26 - default is configurable as :default_column_to
  • major_dimension = "ROWS"
  • value_render_option = "FORMATTED_VALUE"
  • datetime_render_option = "FORMATTED_STRING"
  • value_render_option = "USER_ENTERED"
  • insert_data_option = "INSERT_ROWS"

Suggestions

  • Recommended columns 26 (more on your own risk), max rows in a batch 100-300 depending on your data size per row, configurable as :max_rows_per_request;
  • Pull requests / reports / feedback are welcome.

elixir_google_spreadsheets's People

Contributors

voronchuk avatar brunoparga avatar monsieurv avatar alex88 avatar dparnell avatar johnhamelink avatar adzz avatar peburrows avatar dianaolympos avatar tomtaylor avatar trusty avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.