diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+# gogol-sheets
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`0.1.0`
+
+
+## Description
+
+A client library for the Google Sheets.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/gogol/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `gogol-gen` for more information.
+
+
+## Licence
+
+`gogol-sheets` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import           Distribution.Simple
+main = defaultMain
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/BatchUpdate.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/BatchUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/BatchUpdate.hs
@@ -0,0 +1,211 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.BatchUpdate
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Applies one or more updates to the spreadsheet. Each request is
+-- validated before being applied. If any request is not valid then the
+-- entire request will fail and nothing will be applied. Some requests have
+-- replies to give you some information about how they are applied. The
+-- replies will mirror the requests. For example, if you applied 4 updates
+-- and the 3rd one had a reply, then the response will have 2 empty
+-- replies, the actual reply, and another empty reply, in that order. Due
+-- to the collaborative nature of spreadsheets, it is not guaranteed that
+-- the spreadsheet will reflect exactly your changes after this completes,
+-- however it is guaranteed that the updates in the request will be applied
+-- together atomically. Your changes may be altered with respect to
+-- collaborator changes. If there are no collaborators, the spreadsheet
+-- should reflect your changes.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.batchUpdate@.
+module Network.Google.Resource.Sheets.Spreadsheets.BatchUpdate
+    (
+    -- * REST Resource
+      SpreadsheetsBatchUpdateResource
+
+    -- * Creating a Request
+    , spreadsheetsBatchUpdate
+    , SpreadsheetsBatchUpdate
+
+    -- * Request Lenses
+    , sbuXgafv
+    , sbuUploadProtocol
+    , sbuPp
+    , sbuAccessToken
+    , sbuSpreadsheetId
+    , sbuUploadType
+    , sbuPayload
+    , sbuBearerToken
+    , sbuCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.batchUpdate@ method which the
+-- 'SpreadsheetsBatchUpdate' request conforms to.
+type SpreadsheetsBatchUpdateResource =
+     "v4" :>
+       "spreadsheets" :>
+         CaptureMode "spreadsheetId" "batchUpdate" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParam "bearer_token" Text :>
+                       QueryParam "callback" Text :>
+                         QueryParam "alt" AltJSON :>
+                           ReqBody '[JSON] BatchUpdateSpreadsheetRequest :>
+                             Post '[JSON] BatchUpdateSpreadsheetResponse
+
+-- | Applies one or more updates to the spreadsheet. Each request is
+-- validated before being applied. If any request is not valid then the
+-- entire request will fail and nothing will be applied. Some requests have
+-- replies to give you some information about how they are applied. The
+-- replies will mirror the requests. For example, if you applied 4 updates
+-- and the 3rd one had a reply, then the response will have 2 empty
+-- replies, the actual reply, and another empty reply, in that order. Due
+-- to the collaborative nature of spreadsheets, it is not guaranteed that
+-- the spreadsheet will reflect exactly your changes after this completes,
+-- however it is guaranteed that the updates in the request will be applied
+-- together atomically. Your changes may be altered with respect to
+-- collaborator changes. If there are no collaborators, the spreadsheet
+-- should reflect your changes.
+--
+-- /See:/ 'spreadsheetsBatchUpdate' smart constructor.
+data SpreadsheetsBatchUpdate = SpreadsheetsBatchUpdate'
+    { _sbuXgafv          :: !(Maybe Xgafv)
+    , _sbuUploadProtocol :: !(Maybe Text)
+    , _sbuPp             :: !Bool
+    , _sbuAccessToken    :: !(Maybe Text)
+    , _sbuSpreadsheetId  :: !Text
+    , _sbuUploadType     :: !(Maybe Text)
+    , _sbuPayload        :: !BatchUpdateSpreadsheetRequest
+    , _sbuBearerToken    :: !(Maybe Text)
+    , _sbuCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsBatchUpdate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sbuXgafv'
+--
+-- * 'sbuUploadProtocol'
+--
+-- * 'sbuPp'
+--
+-- * 'sbuAccessToken'
+--
+-- * 'sbuSpreadsheetId'
+--
+-- * 'sbuUploadType'
+--
+-- * 'sbuPayload'
+--
+-- * 'sbuBearerToken'
+--
+-- * 'sbuCallback'
+spreadsheetsBatchUpdate
+    :: Text -- ^ 'sbuSpreadsheetId'
+    -> BatchUpdateSpreadsheetRequest -- ^ 'sbuPayload'
+    -> SpreadsheetsBatchUpdate
+spreadsheetsBatchUpdate pSbuSpreadsheetId_ pSbuPayload_ =
+    SpreadsheetsBatchUpdate'
+    { _sbuXgafv = Nothing
+    , _sbuUploadProtocol = Nothing
+    , _sbuPp = True
+    , _sbuAccessToken = Nothing
+    , _sbuSpreadsheetId = pSbuSpreadsheetId_
+    , _sbuUploadType = Nothing
+    , _sbuPayload = pSbuPayload_
+    , _sbuBearerToken = Nothing
+    , _sbuCallback = Nothing
+    }
+
+-- | V1 error format.
+sbuXgafv :: Lens' SpreadsheetsBatchUpdate (Maybe Xgafv)
+sbuXgafv = lens _sbuXgafv (\ s a -> s{_sbuXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+sbuUploadProtocol :: Lens' SpreadsheetsBatchUpdate (Maybe Text)
+sbuUploadProtocol
+  = lens _sbuUploadProtocol
+      (\ s a -> s{_sbuUploadProtocol = a})
+
+-- | Pretty-print response.
+sbuPp :: Lens' SpreadsheetsBatchUpdate Bool
+sbuPp = lens _sbuPp (\ s a -> s{_sbuPp = a})
+
+-- | OAuth access token.
+sbuAccessToken :: Lens' SpreadsheetsBatchUpdate (Maybe Text)
+sbuAccessToken
+  = lens _sbuAccessToken
+      (\ s a -> s{_sbuAccessToken = a})
+
+-- | The spreadsheet to apply the updates to.
+sbuSpreadsheetId :: Lens' SpreadsheetsBatchUpdate Text
+sbuSpreadsheetId
+  = lens _sbuSpreadsheetId
+      (\ s a -> s{_sbuSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+sbuUploadType :: Lens' SpreadsheetsBatchUpdate (Maybe Text)
+sbuUploadType
+  = lens _sbuUploadType
+      (\ s a -> s{_sbuUploadType = a})
+
+-- | Multipart request metadata.
+sbuPayload :: Lens' SpreadsheetsBatchUpdate BatchUpdateSpreadsheetRequest
+sbuPayload
+  = lens _sbuPayload (\ s a -> s{_sbuPayload = a})
+
+-- | OAuth bearer token.
+sbuBearerToken :: Lens' SpreadsheetsBatchUpdate (Maybe Text)
+sbuBearerToken
+  = lens _sbuBearerToken
+      (\ s a -> s{_sbuBearerToken = a})
+
+-- | JSONP
+sbuCallback :: Lens' SpreadsheetsBatchUpdate (Maybe Text)
+sbuCallback
+  = lens _sbuCallback (\ s a -> s{_sbuCallback = a})
+
+instance GoogleRequest SpreadsheetsBatchUpdate where
+        type Rs SpreadsheetsBatchUpdate =
+             BatchUpdateSpreadsheetResponse
+        type Scopes SpreadsheetsBatchUpdate =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/spreadsheets"]
+        requestClient SpreadsheetsBatchUpdate'{..}
+          = go _sbuSpreadsheetId _sbuXgafv _sbuUploadProtocol
+              (Just _sbuPp)
+              _sbuAccessToken
+              _sbuUploadType
+              _sbuBearerToken
+              _sbuCallback
+              (Just AltJSON)
+              _sbuPayload
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsBatchUpdateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Create.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Create.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Create.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Create
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a spreadsheet, returning the newly created spreadsheet.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.create@.
+module Network.Google.Resource.Sheets.Spreadsheets.Create
+    (
+    -- * REST Resource
+      SpreadsheetsCreateResource
+
+    -- * Creating a Request
+    , spreadsheetsCreate
+    , SpreadsheetsCreate
+
+    -- * Request Lenses
+    , scXgafv
+    , scUploadProtocol
+    , scPp
+    , scAccessToken
+    , scUploadType
+    , scPayload
+    , scBearerToken
+    , scCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.create@ method which the
+-- 'SpreadsheetsCreate' request conforms to.
+type SpreadsheetsCreateResource =
+     "v4" :>
+       "spreadsheets" :>
+         QueryParam "$.xgafv" Xgafv :>
+           QueryParam "upload_protocol" Text :>
+             QueryParam "pp" Bool :>
+               QueryParam "access_token" Text :>
+                 QueryParam "uploadType" Text :>
+                   QueryParam "bearer_token" Text :>
+                     QueryParam "callback" Text :>
+                       QueryParam "alt" AltJSON :>
+                         ReqBody '[JSON] Spreadsheet :>
+                           Post '[JSON] Spreadsheet
+
+-- | Creates a spreadsheet, returning the newly created spreadsheet.
+--
+-- /See:/ 'spreadsheetsCreate' smart constructor.
+data SpreadsheetsCreate = SpreadsheetsCreate'
+    { _scXgafv          :: !(Maybe Xgafv)
+    , _scUploadProtocol :: !(Maybe Text)
+    , _scPp             :: !Bool
+    , _scAccessToken    :: !(Maybe Text)
+    , _scUploadType     :: !(Maybe Text)
+    , _scPayload        :: !Spreadsheet
+    , _scBearerToken    :: !(Maybe Text)
+    , _scCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsCreate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scXgafv'
+--
+-- * 'scUploadProtocol'
+--
+-- * 'scPp'
+--
+-- * 'scAccessToken'
+--
+-- * 'scUploadType'
+--
+-- * 'scPayload'
+--
+-- * 'scBearerToken'
+--
+-- * 'scCallback'
+spreadsheetsCreate
+    :: Spreadsheet -- ^ 'scPayload'
+    -> SpreadsheetsCreate
+spreadsheetsCreate pScPayload_ =
+    SpreadsheetsCreate'
+    { _scXgafv = Nothing
+    , _scUploadProtocol = Nothing
+    , _scPp = True
+    , _scAccessToken = Nothing
+    , _scUploadType = Nothing
+    , _scPayload = pScPayload_
+    , _scBearerToken = Nothing
+    , _scCallback = Nothing
+    }
+
+-- | V1 error format.
+scXgafv :: Lens' SpreadsheetsCreate (Maybe Xgafv)
+scXgafv = lens _scXgafv (\ s a -> s{_scXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+scUploadProtocol :: Lens' SpreadsheetsCreate (Maybe Text)
+scUploadProtocol
+  = lens _scUploadProtocol
+      (\ s a -> s{_scUploadProtocol = a})
+
+-- | Pretty-print response.
+scPp :: Lens' SpreadsheetsCreate Bool
+scPp = lens _scPp (\ s a -> s{_scPp = a})
+
+-- | OAuth access token.
+scAccessToken :: Lens' SpreadsheetsCreate (Maybe Text)
+scAccessToken
+  = lens _scAccessToken
+      (\ s a -> s{_scAccessToken = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+scUploadType :: Lens' SpreadsheetsCreate (Maybe Text)
+scUploadType
+  = lens _scUploadType (\ s a -> s{_scUploadType = a})
+
+-- | Multipart request metadata.
+scPayload :: Lens' SpreadsheetsCreate Spreadsheet
+scPayload
+  = lens _scPayload (\ s a -> s{_scPayload = a})
+
+-- | OAuth bearer token.
+scBearerToken :: Lens' SpreadsheetsCreate (Maybe Text)
+scBearerToken
+  = lens _scBearerToken
+      (\ s a -> s{_scBearerToken = a})
+
+-- | JSONP
+scCallback :: Lens' SpreadsheetsCreate (Maybe Text)
+scCallback
+  = lens _scCallback (\ s a -> s{_scCallback = a})
+
+instance GoogleRequest SpreadsheetsCreate where
+        type Rs SpreadsheetsCreate = Spreadsheet
+        type Scopes SpreadsheetsCreate =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/spreadsheets"]
+        requestClient SpreadsheetsCreate'{..}
+          = go _scXgafv _scUploadProtocol (Just _scPp)
+              _scAccessToken
+              _scUploadType
+              _scBearerToken
+              _scCallback
+              (Just AltJSON)
+              _scPayload
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsCreateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Get.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Get.hs
@@ -0,0 +1,221 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the spreadsheet at the given ID. The caller must specify the
+-- spreadsheet ID. By default, data within grids will not be returned. You
+-- can include grid data one of two ways: * Specify a field mask listing
+-- your desired fields using the \`fields\` URL parameter in HTTP * Set the
+-- includeGridData URL parameter to true. If a field mask is set, the
+-- \`includeGridData\` parameter is ignored For large spreadsheets, it is
+-- recommended to retrieve only the specific fields of the spreadsheet that
+-- you want. To retrieve only subsets of the spreadsheet, use the ranges
+-- URL parameter. Multiple ranges can be specified. Limiting the range will
+-- return only the portions of the spreadsheet that intersect the requested
+-- ranges. Ranges are specified using A1 notation.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.get@.
+module Network.Google.Resource.Sheets.Spreadsheets.Get
+    (
+    -- * REST Resource
+      SpreadsheetsGetResource
+
+    -- * Creating a Request
+    , spreadsheetsGet
+    , SpreadsheetsGet
+
+    -- * Request Lenses
+    , sgXgafv
+    , sgUploadProtocol
+    , sgPp
+    , sgAccessToken
+    , sgSpreadsheetId
+    , sgUploadType
+    , sgRanges
+    , sgIncludeGridData
+    , sgBearerToken
+    , sgCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.get@ method which the
+-- 'SpreadsheetsGet' request conforms to.
+type SpreadsheetsGetResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           QueryParam "$.xgafv" Xgafv :>
+             QueryParam "upload_protocol" Text :>
+               QueryParam "pp" Bool :>
+                 QueryParam "access_token" Text :>
+                   QueryParam "uploadType" Text :>
+                     QueryParams "ranges" Text :>
+                       QueryParam "includeGridData" Bool :>
+                         QueryParam "bearer_token" Text :>
+                           QueryParam "callback" Text :>
+                             QueryParam "alt" AltJSON :> Get '[JSON] Spreadsheet
+
+-- | Returns the spreadsheet at the given ID. The caller must specify the
+-- spreadsheet ID. By default, data within grids will not be returned. You
+-- can include grid data one of two ways: * Specify a field mask listing
+-- your desired fields using the \`fields\` URL parameter in HTTP * Set the
+-- includeGridData URL parameter to true. If a field mask is set, the
+-- \`includeGridData\` parameter is ignored For large spreadsheets, it is
+-- recommended to retrieve only the specific fields of the spreadsheet that
+-- you want. To retrieve only subsets of the spreadsheet, use the ranges
+-- URL parameter. Multiple ranges can be specified. Limiting the range will
+-- return only the portions of the spreadsheet that intersect the requested
+-- ranges. Ranges are specified using A1 notation.
+--
+-- /See:/ 'spreadsheetsGet' smart constructor.
+data SpreadsheetsGet = SpreadsheetsGet'
+    { _sgXgafv           :: !(Maybe Xgafv)
+    , _sgUploadProtocol  :: !(Maybe Text)
+    , _sgPp              :: !Bool
+    , _sgAccessToken     :: !(Maybe Text)
+    , _sgSpreadsheetId   :: !Text
+    , _sgUploadType      :: !(Maybe Text)
+    , _sgRanges          :: !(Maybe [Text])
+    , _sgIncludeGridData :: !(Maybe Bool)
+    , _sgBearerToken     :: !(Maybe Text)
+    , _sgCallback        :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sgXgafv'
+--
+-- * 'sgUploadProtocol'
+--
+-- * 'sgPp'
+--
+-- * 'sgAccessToken'
+--
+-- * 'sgSpreadsheetId'
+--
+-- * 'sgUploadType'
+--
+-- * 'sgRanges'
+--
+-- * 'sgIncludeGridData'
+--
+-- * 'sgBearerToken'
+--
+-- * 'sgCallback'
+spreadsheetsGet
+    :: Text -- ^ 'sgSpreadsheetId'
+    -> SpreadsheetsGet
+spreadsheetsGet pSgSpreadsheetId_ =
+    SpreadsheetsGet'
+    { _sgXgafv = Nothing
+    , _sgUploadProtocol = Nothing
+    , _sgPp = True
+    , _sgAccessToken = Nothing
+    , _sgSpreadsheetId = pSgSpreadsheetId_
+    , _sgUploadType = Nothing
+    , _sgRanges = Nothing
+    , _sgIncludeGridData = Nothing
+    , _sgBearerToken = Nothing
+    , _sgCallback = Nothing
+    }
+
+-- | V1 error format.
+sgXgafv :: Lens' SpreadsheetsGet (Maybe Xgafv)
+sgXgafv = lens _sgXgafv (\ s a -> s{_sgXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+sgUploadProtocol :: Lens' SpreadsheetsGet (Maybe Text)
+sgUploadProtocol
+  = lens _sgUploadProtocol
+      (\ s a -> s{_sgUploadProtocol = a})
+
+-- | Pretty-print response.
+sgPp :: Lens' SpreadsheetsGet Bool
+sgPp = lens _sgPp (\ s a -> s{_sgPp = a})
+
+-- | OAuth access token.
+sgAccessToken :: Lens' SpreadsheetsGet (Maybe Text)
+sgAccessToken
+  = lens _sgAccessToken
+      (\ s a -> s{_sgAccessToken = a})
+
+-- | The spreadsheet to request.
+sgSpreadsheetId :: Lens' SpreadsheetsGet Text
+sgSpreadsheetId
+  = lens _sgSpreadsheetId
+      (\ s a -> s{_sgSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+sgUploadType :: Lens' SpreadsheetsGet (Maybe Text)
+sgUploadType
+  = lens _sgUploadType (\ s a -> s{_sgUploadType = a})
+
+-- | The ranges to retrieve from the spreadsheet.
+sgRanges :: Lens' SpreadsheetsGet [Text]
+sgRanges
+  = lens _sgRanges (\ s a -> s{_sgRanges = a}) .
+      _Default
+      . _Coerce
+
+-- | True if grid data should be returned. This parameter is ignored if a
+-- field mask was set in the request.
+sgIncludeGridData :: Lens' SpreadsheetsGet (Maybe Bool)
+sgIncludeGridData
+  = lens _sgIncludeGridData
+      (\ s a -> s{_sgIncludeGridData = a})
+
+-- | OAuth bearer token.
+sgBearerToken :: Lens' SpreadsheetsGet (Maybe Text)
+sgBearerToken
+  = lens _sgBearerToken
+      (\ s a -> s{_sgBearerToken = a})
+
+-- | JSONP
+sgCallback :: Lens' SpreadsheetsGet (Maybe Text)
+sgCallback
+  = lens _sgCallback (\ s a -> s{_sgCallback = a})
+
+instance GoogleRequest SpreadsheetsGet where
+        type Rs SpreadsheetsGet = Spreadsheet
+        type Scopes SpreadsheetsGet =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/drive.readonly",
+               "https://www.googleapis.com/auth/spreadsheets",
+               "https://www.googleapis.com/auth/spreadsheets.readonly"]
+        requestClient SpreadsheetsGet'{..}
+          = go _sgSpreadsheetId _sgXgafv _sgUploadProtocol
+              (Just _sgPp)
+              _sgAccessToken
+              _sgUploadType
+              (_sgRanges ^. _Default)
+              _sgIncludeGridData
+              _sgBearerToken
+              _sgCallback
+              (Just AltJSON)
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Sheets/CopyTo.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Sheets/CopyTo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Sheets/CopyTo.hs
@@ -0,0 +1,205 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Sheets.CopyTo
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Copies a single sheet from a spreadsheet to another spreadsheet. Returns
+-- the properties of the newly created sheet.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.sheets.copyTo@.
+module Network.Google.Resource.Sheets.Spreadsheets.Sheets.CopyTo
+    (
+    -- * REST Resource
+      SpreadsheetsSheetsCopyToResource
+
+    -- * Creating a Request
+    , spreadsheetsSheetsCopyTo
+    , SpreadsheetsSheetsCopyTo
+
+    -- * Request Lenses
+    , ssctXgafv
+    , ssctUploadProtocol
+    , ssctPp
+    , ssctAccessToken
+    , ssctSpreadsheetId
+    , ssctUploadType
+    , ssctPayload
+    , ssctBearerToken
+    , ssctSheetId
+    , ssctCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.sheets.copyTo@ method which the
+-- 'SpreadsheetsSheetsCopyTo' request conforms to.
+type SpreadsheetsSheetsCopyToResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           "sheets" :>
+             CaptureMode "sheetId" "copyTo" (Textual Int32) :>
+               QueryParam "$.xgafv" Xgafv :>
+                 QueryParam "upload_protocol" Text :>
+                   QueryParam "pp" Bool :>
+                     QueryParam "access_token" Text :>
+                       QueryParam "uploadType" Text :>
+                         QueryParam "bearer_token" Text :>
+                           QueryParam "callback" Text :>
+                             QueryParam "alt" AltJSON :>
+                               ReqBody '[JSON]
+                                 CopySheetToAnotherSpreadsheetRequest
+                                 :> Post '[JSON] SheetProperties
+
+-- | Copies a single sheet from a spreadsheet to another spreadsheet. Returns
+-- the properties of the newly created sheet.
+--
+-- /See:/ 'spreadsheetsSheetsCopyTo' smart constructor.
+data SpreadsheetsSheetsCopyTo = SpreadsheetsSheetsCopyTo'
+    { _ssctXgafv          :: !(Maybe Xgafv)
+    , _ssctUploadProtocol :: !(Maybe Text)
+    , _ssctPp             :: !Bool
+    , _ssctAccessToken    :: !(Maybe Text)
+    , _ssctSpreadsheetId  :: !Text
+    , _ssctUploadType     :: !(Maybe Text)
+    , _ssctPayload        :: !CopySheetToAnotherSpreadsheetRequest
+    , _ssctBearerToken    :: !(Maybe Text)
+    , _ssctSheetId        :: !(Textual Int32)
+    , _ssctCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsSheetsCopyTo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssctXgafv'
+--
+-- * 'ssctUploadProtocol'
+--
+-- * 'ssctPp'
+--
+-- * 'ssctAccessToken'
+--
+-- * 'ssctSpreadsheetId'
+--
+-- * 'ssctUploadType'
+--
+-- * 'ssctPayload'
+--
+-- * 'ssctBearerToken'
+--
+-- * 'ssctSheetId'
+--
+-- * 'ssctCallback'
+spreadsheetsSheetsCopyTo
+    :: Text -- ^ 'ssctSpreadsheetId'
+    -> CopySheetToAnotherSpreadsheetRequest -- ^ 'ssctPayload'
+    -> Int32 -- ^ 'ssctSheetId'
+    -> SpreadsheetsSheetsCopyTo
+spreadsheetsSheetsCopyTo pSsctSpreadsheetId_ pSsctPayload_ pSsctSheetId_ =
+    SpreadsheetsSheetsCopyTo'
+    { _ssctXgafv = Nothing
+    , _ssctUploadProtocol = Nothing
+    , _ssctPp = True
+    , _ssctAccessToken = Nothing
+    , _ssctSpreadsheetId = pSsctSpreadsheetId_
+    , _ssctUploadType = Nothing
+    , _ssctPayload = pSsctPayload_
+    , _ssctBearerToken = Nothing
+    , _ssctSheetId = _Coerce # pSsctSheetId_
+    , _ssctCallback = Nothing
+    }
+
+-- | V1 error format.
+ssctXgafv :: Lens' SpreadsheetsSheetsCopyTo (Maybe Xgafv)
+ssctXgafv
+  = lens _ssctXgafv (\ s a -> s{_ssctXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+ssctUploadProtocol :: Lens' SpreadsheetsSheetsCopyTo (Maybe Text)
+ssctUploadProtocol
+  = lens _ssctUploadProtocol
+      (\ s a -> s{_ssctUploadProtocol = a})
+
+-- | Pretty-print response.
+ssctPp :: Lens' SpreadsheetsSheetsCopyTo Bool
+ssctPp = lens _ssctPp (\ s a -> s{_ssctPp = a})
+
+-- | OAuth access token.
+ssctAccessToken :: Lens' SpreadsheetsSheetsCopyTo (Maybe Text)
+ssctAccessToken
+  = lens _ssctAccessToken
+      (\ s a -> s{_ssctAccessToken = a})
+
+-- | The ID of the spreadsheet containing the sheet to copy.
+ssctSpreadsheetId :: Lens' SpreadsheetsSheetsCopyTo Text
+ssctSpreadsheetId
+  = lens _ssctSpreadsheetId
+      (\ s a -> s{_ssctSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+ssctUploadType :: Lens' SpreadsheetsSheetsCopyTo (Maybe Text)
+ssctUploadType
+  = lens _ssctUploadType
+      (\ s a -> s{_ssctUploadType = a})
+
+-- | Multipart request metadata.
+ssctPayload :: Lens' SpreadsheetsSheetsCopyTo CopySheetToAnotherSpreadsheetRequest
+ssctPayload
+  = lens _ssctPayload (\ s a -> s{_ssctPayload = a})
+
+-- | OAuth bearer token.
+ssctBearerToken :: Lens' SpreadsheetsSheetsCopyTo (Maybe Text)
+ssctBearerToken
+  = lens _ssctBearerToken
+      (\ s a -> s{_ssctBearerToken = a})
+
+-- | The ID of the sheet to copy.
+ssctSheetId :: Lens' SpreadsheetsSheetsCopyTo Int32
+ssctSheetId
+  = lens _ssctSheetId (\ s a -> s{_ssctSheetId = a}) .
+      _Coerce
+
+-- | JSONP
+ssctCallback :: Lens' SpreadsheetsSheetsCopyTo (Maybe Text)
+ssctCallback
+  = lens _ssctCallback (\ s a -> s{_ssctCallback = a})
+
+instance GoogleRequest SpreadsheetsSheetsCopyTo where
+        type Rs SpreadsheetsSheetsCopyTo = SheetProperties
+        type Scopes SpreadsheetsSheetsCopyTo =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/spreadsheets"]
+        requestClient SpreadsheetsSheetsCopyTo'{..}
+          = go _ssctSpreadsheetId _ssctSheetId _ssctXgafv
+              _ssctUploadProtocol
+              (Just _ssctPp)
+              _ssctAccessToken
+              _ssctUploadType
+              _ssctBearerToken
+              _ssctCallback
+              (Just AltJSON)
+              _ssctPayload
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsSheetsCopyToResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchGet.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchGet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchGet.hs
@@ -0,0 +1,240 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Values.BatchGet
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns one or more ranges of values from a spreadsheet. The caller must
+-- specify the spreadsheet ID and one or more ranges.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.values.batchGet@.
+module Network.Google.Resource.Sheets.Spreadsheets.Values.BatchGet
+    (
+    -- * REST Resource
+      SpreadsheetsValuesBatchGetResource
+
+    -- * Creating a Request
+    , spreadsheetsValuesBatchGet
+    , SpreadsheetsValuesBatchGet
+
+    -- * Request Lenses
+    , svbgXgafv
+    , svbgValueRenderOption
+    , svbgUploadProtocol
+    , svbgPp
+    , svbgAccessToken
+    , svbgSpreadsheetId
+    , svbgUploadType
+    , svbgRanges
+    , svbgBearerToken
+    , svbgDateTimeRenderOption
+    , svbgMajorDimension
+    , svbgCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.values.batchGet@ method which the
+-- 'SpreadsheetsValuesBatchGet' request conforms to.
+type SpreadsheetsValuesBatchGetResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           "values:batchGet" :>
+             QueryParam "$.xgafv" Xgafv :>
+               QueryParam "valueRenderOption" Text :>
+                 QueryParam "upload_protocol" Text :>
+                   QueryParam "pp" Bool :>
+                     QueryParam "access_token" Text :>
+                       QueryParam "uploadType" Text :>
+                         QueryParams "ranges" Text :>
+                           QueryParam "bearer_token" Text :>
+                             QueryParam "dateTimeRenderOption" Text :>
+                               QueryParam "majorDimension" Text :>
+                                 QueryParam "callback" Text :>
+                                   QueryParam "alt" AltJSON :>
+                                     Get '[JSON] BatchGetValuesResponse
+
+-- | Returns one or more ranges of values from a spreadsheet. The caller must
+-- specify the spreadsheet ID and one or more ranges.
+--
+-- /See:/ 'spreadsheetsValuesBatchGet' smart constructor.
+data SpreadsheetsValuesBatchGet = SpreadsheetsValuesBatchGet'
+    { _svbgXgafv                :: !(Maybe Xgafv)
+    , _svbgValueRenderOption    :: !(Maybe Text)
+    , _svbgUploadProtocol       :: !(Maybe Text)
+    , _svbgPp                   :: !Bool
+    , _svbgAccessToken          :: !(Maybe Text)
+    , _svbgSpreadsheetId        :: !Text
+    , _svbgUploadType           :: !(Maybe Text)
+    , _svbgRanges               :: !(Maybe [Text])
+    , _svbgBearerToken          :: !(Maybe Text)
+    , _svbgDateTimeRenderOption :: !(Maybe Text)
+    , _svbgMajorDimension       :: !(Maybe Text)
+    , _svbgCallback             :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsValuesBatchGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'svbgXgafv'
+--
+-- * 'svbgValueRenderOption'
+--
+-- * 'svbgUploadProtocol'
+--
+-- * 'svbgPp'
+--
+-- * 'svbgAccessToken'
+--
+-- * 'svbgSpreadsheetId'
+--
+-- * 'svbgUploadType'
+--
+-- * 'svbgRanges'
+--
+-- * 'svbgBearerToken'
+--
+-- * 'svbgDateTimeRenderOption'
+--
+-- * 'svbgMajorDimension'
+--
+-- * 'svbgCallback'
+spreadsheetsValuesBatchGet
+    :: Text -- ^ 'svbgSpreadsheetId'
+    -> SpreadsheetsValuesBatchGet
+spreadsheetsValuesBatchGet pSvbgSpreadsheetId_ =
+    SpreadsheetsValuesBatchGet'
+    { _svbgXgafv = Nothing
+    , _svbgValueRenderOption = Nothing
+    , _svbgUploadProtocol = Nothing
+    , _svbgPp = True
+    , _svbgAccessToken = Nothing
+    , _svbgSpreadsheetId = pSvbgSpreadsheetId_
+    , _svbgUploadType = Nothing
+    , _svbgRanges = Nothing
+    , _svbgBearerToken = Nothing
+    , _svbgDateTimeRenderOption = Nothing
+    , _svbgMajorDimension = Nothing
+    , _svbgCallback = Nothing
+    }
+
+-- | V1 error format.
+svbgXgafv :: Lens' SpreadsheetsValuesBatchGet (Maybe Xgafv)
+svbgXgafv
+  = lens _svbgXgafv (\ s a -> s{_svbgXgafv = a})
+
+-- | How values should be represented in the output.
+svbgValueRenderOption :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgValueRenderOption
+  = lens _svbgValueRenderOption
+      (\ s a -> s{_svbgValueRenderOption = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+svbgUploadProtocol :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgUploadProtocol
+  = lens _svbgUploadProtocol
+      (\ s a -> s{_svbgUploadProtocol = a})
+
+-- | Pretty-print response.
+svbgPp :: Lens' SpreadsheetsValuesBatchGet Bool
+svbgPp = lens _svbgPp (\ s a -> s{_svbgPp = a})
+
+-- | OAuth access token.
+svbgAccessToken :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgAccessToken
+  = lens _svbgAccessToken
+      (\ s a -> s{_svbgAccessToken = a})
+
+-- | The ID of the spreadsheet to retrieve data from.
+svbgSpreadsheetId :: Lens' SpreadsheetsValuesBatchGet Text
+svbgSpreadsheetId
+  = lens _svbgSpreadsheetId
+      (\ s a -> s{_svbgSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+svbgUploadType :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgUploadType
+  = lens _svbgUploadType
+      (\ s a -> s{_svbgUploadType = a})
+
+-- | The A1 notation of the values to retrieve.
+svbgRanges :: Lens' SpreadsheetsValuesBatchGet [Text]
+svbgRanges
+  = lens _svbgRanges (\ s a -> s{_svbgRanges = a}) .
+      _Default
+      . _Coerce
+
+-- | OAuth bearer token.
+svbgBearerToken :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgBearerToken
+  = lens _svbgBearerToken
+      (\ s a -> s{_svbgBearerToken = a})
+
+-- | How dates, times, and durations should be represented in the output.
+-- This is ignored if value_render_option is FORMATTED_VALUE.
+svbgDateTimeRenderOption :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgDateTimeRenderOption
+  = lens _svbgDateTimeRenderOption
+      (\ s a -> s{_svbgDateTimeRenderOption = a})
+
+-- | The major dimension that results should use. For example, if the
+-- spreadsheet data is: \`A1=1,B1=2,A2=3,B2=4\`, then requesting
+-- \`range=A1:B2,majorDimension=ROWS\` will return \`[[1,2],[3,4]]\`,
+-- whereas requesting \`range=A1:B2,majorDimension=COLUMNS\` will return
+-- \`[[1,3],[2,4]]\`.
+svbgMajorDimension :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgMajorDimension
+  = lens _svbgMajorDimension
+      (\ s a -> s{_svbgMajorDimension = a})
+
+-- | JSONP
+svbgCallback :: Lens' SpreadsheetsValuesBatchGet (Maybe Text)
+svbgCallback
+  = lens _svbgCallback (\ s a -> s{_svbgCallback = a})
+
+instance GoogleRequest SpreadsheetsValuesBatchGet
+         where
+        type Rs SpreadsheetsValuesBatchGet =
+             BatchGetValuesResponse
+        type Scopes SpreadsheetsValuesBatchGet =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/drive.readonly",
+               "https://www.googleapis.com/auth/spreadsheets",
+               "https://www.googleapis.com/auth/spreadsheets.readonly"]
+        requestClient SpreadsheetsValuesBatchGet'{..}
+          = go _svbgSpreadsheetId _svbgXgafv
+              _svbgValueRenderOption
+              _svbgUploadProtocol
+              (Just _svbgPp)
+              _svbgAccessToken
+              _svbgUploadType
+              (_svbgRanges ^. _Default)
+              _svbgBearerToken
+              _svbgDateTimeRenderOption
+              _svbgMajorDimension
+              _svbgCallback
+              (Just AltJSON)
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsValuesBatchGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchUpdate.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/BatchUpdate.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Values.BatchUpdate
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets values in one or more ranges of a spreadsheet. The caller must
+-- specify the spreadsheet ID, a valueInputOption, and one or more
+-- ValueRanges.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.values.batchUpdate@.
+module Network.Google.Resource.Sheets.Spreadsheets.Values.BatchUpdate
+    (
+    -- * REST Resource
+      SpreadsheetsValuesBatchUpdateResource
+
+    -- * Creating a Request
+    , spreadsheetsValuesBatchUpdate
+    , SpreadsheetsValuesBatchUpdate
+
+    -- * Request Lenses
+    , svbuXgafv
+    , svbuUploadProtocol
+    , svbuPp
+    , svbuAccessToken
+    , svbuSpreadsheetId
+    , svbuUploadType
+    , svbuPayload
+    , svbuBearerToken
+    , svbuCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.values.batchUpdate@ method which the
+-- 'SpreadsheetsValuesBatchUpdate' request conforms to.
+type SpreadsheetsValuesBatchUpdateResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           "values:batchUpdate" :>
+             QueryParam "$.xgafv" Xgafv :>
+               QueryParam "upload_protocol" Text :>
+                 QueryParam "pp" Bool :>
+                   QueryParam "access_token" Text :>
+                     QueryParam "uploadType" Text :>
+                       QueryParam "bearer_token" Text :>
+                         QueryParam "callback" Text :>
+                           QueryParam "alt" AltJSON :>
+                             ReqBody '[JSON] BatchUpdateValuesRequest :>
+                               Post '[JSON] BatchUpdateValuesResponse
+
+-- | Sets values in one or more ranges of a spreadsheet. The caller must
+-- specify the spreadsheet ID, a valueInputOption, and one or more
+-- ValueRanges.
+--
+-- /See:/ 'spreadsheetsValuesBatchUpdate' smart constructor.
+data SpreadsheetsValuesBatchUpdate = SpreadsheetsValuesBatchUpdate'
+    { _svbuXgafv          :: !(Maybe Xgafv)
+    , _svbuUploadProtocol :: !(Maybe Text)
+    , _svbuPp             :: !Bool
+    , _svbuAccessToken    :: !(Maybe Text)
+    , _svbuSpreadsheetId  :: !Text
+    , _svbuUploadType     :: !(Maybe Text)
+    , _svbuPayload        :: !BatchUpdateValuesRequest
+    , _svbuBearerToken    :: !(Maybe Text)
+    , _svbuCallback       :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsValuesBatchUpdate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'svbuXgafv'
+--
+-- * 'svbuUploadProtocol'
+--
+-- * 'svbuPp'
+--
+-- * 'svbuAccessToken'
+--
+-- * 'svbuSpreadsheetId'
+--
+-- * 'svbuUploadType'
+--
+-- * 'svbuPayload'
+--
+-- * 'svbuBearerToken'
+--
+-- * 'svbuCallback'
+spreadsheetsValuesBatchUpdate
+    :: Text -- ^ 'svbuSpreadsheetId'
+    -> BatchUpdateValuesRequest -- ^ 'svbuPayload'
+    -> SpreadsheetsValuesBatchUpdate
+spreadsheetsValuesBatchUpdate pSvbuSpreadsheetId_ pSvbuPayload_ =
+    SpreadsheetsValuesBatchUpdate'
+    { _svbuXgafv = Nothing
+    , _svbuUploadProtocol = Nothing
+    , _svbuPp = True
+    , _svbuAccessToken = Nothing
+    , _svbuSpreadsheetId = pSvbuSpreadsheetId_
+    , _svbuUploadType = Nothing
+    , _svbuPayload = pSvbuPayload_
+    , _svbuBearerToken = Nothing
+    , _svbuCallback = Nothing
+    }
+
+-- | V1 error format.
+svbuXgafv :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Xgafv)
+svbuXgafv
+  = lens _svbuXgafv (\ s a -> s{_svbuXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+svbuUploadProtocol :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Text)
+svbuUploadProtocol
+  = lens _svbuUploadProtocol
+      (\ s a -> s{_svbuUploadProtocol = a})
+
+-- | Pretty-print response.
+svbuPp :: Lens' SpreadsheetsValuesBatchUpdate Bool
+svbuPp = lens _svbuPp (\ s a -> s{_svbuPp = a})
+
+-- | OAuth access token.
+svbuAccessToken :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Text)
+svbuAccessToken
+  = lens _svbuAccessToken
+      (\ s a -> s{_svbuAccessToken = a})
+
+-- | The ID of the spreadsheet to update.
+svbuSpreadsheetId :: Lens' SpreadsheetsValuesBatchUpdate Text
+svbuSpreadsheetId
+  = lens _svbuSpreadsheetId
+      (\ s a -> s{_svbuSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+svbuUploadType :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Text)
+svbuUploadType
+  = lens _svbuUploadType
+      (\ s a -> s{_svbuUploadType = a})
+
+-- | Multipart request metadata.
+svbuPayload :: Lens' SpreadsheetsValuesBatchUpdate BatchUpdateValuesRequest
+svbuPayload
+  = lens _svbuPayload (\ s a -> s{_svbuPayload = a})
+
+-- | OAuth bearer token.
+svbuBearerToken :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Text)
+svbuBearerToken
+  = lens _svbuBearerToken
+      (\ s a -> s{_svbuBearerToken = a})
+
+-- | JSONP
+svbuCallback :: Lens' SpreadsheetsValuesBatchUpdate (Maybe Text)
+svbuCallback
+  = lens _svbuCallback (\ s a -> s{_svbuCallback = a})
+
+instance GoogleRequest SpreadsheetsValuesBatchUpdate
+         where
+        type Rs SpreadsheetsValuesBatchUpdate =
+             BatchUpdateValuesResponse
+        type Scopes SpreadsheetsValuesBatchUpdate =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/spreadsheets"]
+        requestClient SpreadsheetsValuesBatchUpdate'{..}
+          = go _svbuSpreadsheetId _svbuXgafv
+              _svbuUploadProtocol
+              (Just _svbuPp)
+              _svbuAccessToken
+              _svbuUploadType
+              _svbuBearerToken
+              _svbuCallback
+              (Just AltJSON)
+              _svbuPayload
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy ::
+                         Proxy SpreadsheetsValuesBatchUpdateResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Get.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Get.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Get.hs
@@ -0,0 +1,234 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Values.Get
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a range of values from a spreadsheet. The caller must specify
+-- the spreadsheet ID and a range.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.values.get@.
+module Network.Google.Resource.Sheets.Spreadsheets.Values.Get
+    (
+    -- * REST Resource
+      SpreadsheetsValuesGetResource
+
+    -- * Creating a Request
+    , spreadsheetsValuesGet
+    , SpreadsheetsValuesGet
+
+    -- * Request Lenses
+    , svgXgafv
+    , svgValueRenderOption
+    , svgUploadProtocol
+    , svgPp
+    , svgAccessToken
+    , svgSpreadsheetId
+    , svgUploadType
+    , svgBearerToken
+    , svgRange
+    , svgDateTimeRenderOption
+    , svgMajorDimension
+    , svgCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.values.get@ method which the
+-- 'SpreadsheetsValuesGet' request conforms to.
+type SpreadsheetsValuesGetResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           "values" :>
+             Capture "range" Text :>
+               QueryParam "$.xgafv" Xgafv :>
+                 QueryParam "valueRenderOption" Text :>
+                   QueryParam "upload_protocol" Text :>
+                     QueryParam "pp" Bool :>
+                       QueryParam "access_token" Text :>
+                         QueryParam "uploadType" Text :>
+                           QueryParam "bearer_token" Text :>
+                             QueryParam "dateTimeRenderOption" Text :>
+                               QueryParam "majorDimension" Text :>
+                                 QueryParam "callback" Text :>
+                                   QueryParam "alt" AltJSON :>
+                                     Get '[JSON] ValueRange
+
+-- | Returns a range of values from a spreadsheet. The caller must specify
+-- the spreadsheet ID and a range.
+--
+-- /See:/ 'spreadsheetsValuesGet' smart constructor.
+data SpreadsheetsValuesGet = SpreadsheetsValuesGet'
+    { _svgXgafv                :: !(Maybe Xgafv)
+    , _svgValueRenderOption    :: !(Maybe Text)
+    , _svgUploadProtocol       :: !(Maybe Text)
+    , _svgPp                   :: !Bool
+    , _svgAccessToken          :: !(Maybe Text)
+    , _svgSpreadsheetId        :: !Text
+    , _svgUploadType           :: !(Maybe Text)
+    , _svgBearerToken          :: !(Maybe Text)
+    , _svgRange                :: !Text
+    , _svgDateTimeRenderOption :: !(Maybe Text)
+    , _svgMajorDimension       :: !(Maybe Text)
+    , _svgCallback             :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsValuesGet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'svgXgafv'
+--
+-- * 'svgValueRenderOption'
+--
+-- * 'svgUploadProtocol'
+--
+-- * 'svgPp'
+--
+-- * 'svgAccessToken'
+--
+-- * 'svgSpreadsheetId'
+--
+-- * 'svgUploadType'
+--
+-- * 'svgBearerToken'
+--
+-- * 'svgRange'
+--
+-- * 'svgDateTimeRenderOption'
+--
+-- * 'svgMajorDimension'
+--
+-- * 'svgCallback'
+spreadsheetsValuesGet
+    :: Text -- ^ 'svgSpreadsheetId'
+    -> Text -- ^ 'svgRange'
+    -> SpreadsheetsValuesGet
+spreadsheetsValuesGet pSvgSpreadsheetId_ pSvgRange_ =
+    SpreadsheetsValuesGet'
+    { _svgXgafv = Nothing
+    , _svgValueRenderOption = Nothing
+    , _svgUploadProtocol = Nothing
+    , _svgPp = True
+    , _svgAccessToken = Nothing
+    , _svgSpreadsheetId = pSvgSpreadsheetId_
+    , _svgUploadType = Nothing
+    , _svgBearerToken = Nothing
+    , _svgRange = pSvgRange_
+    , _svgDateTimeRenderOption = Nothing
+    , _svgMajorDimension = Nothing
+    , _svgCallback = Nothing
+    }
+
+-- | V1 error format.
+svgXgafv :: Lens' SpreadsheetsValuesGet (Maybe Xgafv)
+svgXgafv = lens _svgXgafv (\ s a -> s{_svgXgafv = a})
+
+-- | How values should be represented in the output.
+svgValueRenderOption :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgValueRenderOption
+  = lens _svgValueRenderOption
+      (\ s a -> s{_svgValueRenderOption = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+svgUploadProtocol :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgUploadProtocol
+  = lens _svgUploadProtocol
+      (\ s a -> s{_svgUploadProtocol = a})
+
+-- | Pretty-print response.
+svgPp :: Lens' SpreadsheetsValuesGet Bool
+svgPp = lens _svgPp (\ s a -> s{_svgPp = a})
+
+-- | OAuth access token.
+svgAccessToken :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgAccessToken
+  = lens _svgAccessToken
+      (\ s a -> s{_svgAccessToken = a})
+
+-- | The ID of the spreadsheet to retrieve data from.
+svgSpreadsheetId :: Lens' SpreadsheetsValuesGet Text
+svgSpreadsheetId
+  = lens _svgSpreadsheetId
+      (\ s a -> s{_svgSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+svgUploadType :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgUploadType
+  = lens _svgUploadType
+      (\ s a -> s{_svgUploadType = a})
+
+-- | OAuth bearer token.
+svgBearerToken :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgBearerToken
+  = lens _svgBearerToken
+      (\ s a -> s{_svgBearerToken = a})
+
+-- | The A1 notation of the values to retrieve.
+svgRange :: Lens' SpreadsheetsValuesGet Text
+svgRange = lens _svgRange (\ s a -> s{_svgRange = a})
+
+-- | How dates, times, and durations should be represented in the output.
+-- This is ignored if value_render_option is FORMATTED_VALUE.
+svgDateTimeRenderOption :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgDateTimeRenderOption
+  = lens _svgDateTimeRenderOption
+      (\ s a -> s{_svgDateTimeRenderOption = a})
+
+-- | The major dimension that results should use. For example, if the
+-- spreadsheet data is: \`A1=1,B1=2,A2=3,B2=4\`, then requesting
+-- \`range=A1:B2,majorDimension=ROWS\` will return \`[[1,2],[3,4]]\`,
+-- whereas requesting \`range=A1:B2,majorDimension=COLUMNS\` will return
+-- \`[[1,3],[2,4]]\`.
+svgMajorDimension :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgMajorDimension
+  = lens _svgMajorDimension
+      (\ s a -> s{_svgMajorDimension = a})
+
+-- | JSONP
+svgCallback :: Lens' SpreadsheetsValuesGet (Maybe Text)
+svgCallback
+  = lens _svgCallback (\ s a -> s{_svgCallback = a})
+
+instance GoogleRequest SpreadsheetsValuesGet where
+        type Rs SpreadsheetsValuesGet = ValueRange
+        type Scopes SpreadsheetsValuesGet =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/drive.readonly",
+               "https://www.googleapis.com/auth/spreadsheets",
+               "https://www.googleapis.com/auth/spreadsheets.readonly"]
+        requestClient SpreadsheetsValuesGet'{..}
+          = go _svgSpreadsheetId _svgRange _svgXgafv
+              _svgValueRenderOption
+              _svgUploadProtocol
+              (Just _svgPp)
+              _svgAccessToken
+              _svgUploadType
+              _svgBearerToken
+              _svgDateTimeRenderOption
+              _svgMajorDimension
+              _svgCallback
+              (Just AltJSON)
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsValuesGetResource)
+                      mempty
diff --git a/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Update.hs b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Update.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Resource/Sheets/Spreadsheets/Values/Update.hs
@@ -0,0 +1,215 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE TypeOperators      #-}
+
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds      #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+
+-- |
+-- Module      : Network.Google.Resource.Sheets.Spreadsheets.Values.Update
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets values in a range of a spreadsheet. The caller must specify the
+-- spreadsheet ID, range, and a valueInputOption.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference> for @sheets.spreadsheets.values.update@.
+module Network.Google.Resource.Sheets.Spreadsheets.Values.Update
+    (
+    -- * REST Resource
+      SpreadsheetsValuesUpdateResource
+
+    -- * Creating a Request
+    , spreadsheetsValuesUpdate
+    , SpreadsheetsValuesUpdate
+
+    -- * Request Lenses
+    , svuXgafv
+    , svuUploadProtocol
+    , svuPp
+    , svuAccessToken
+    , svuSpreadsheetId
+    , svuUploadType
+    , svuValueInputOption
+    , svuPayload
+    , svuBearerToken
+    , svuRange
+    , svuCallback
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types
+
+-- | A resource alias for @sheets.spreadsheets.values.update@ method which the
+-- 'SpreadsheetsValuesUpdate' request conforms to.
+type SpreadsheetsValuesUpdateResource =
+     "v4" :>
+       "spreadsheets" :>
+         Capture "spreadsheetId" Text :>
+           "values" :>
+             Capture "range" Text :>
+               QueryParam "$.xgafv" Xgafv :>
+                 QueryParam "upload_protocol" Text :>
+                   QueryParam "pp" Bool :>
+                     QueryParam "access_token" Text :>
+                       QueryParam "uploadType" Text :>
+                         QueryParam "valueInputOption" Text :>
+                           QueryParam "bearer_token" Text :>
+                             QueryParam "callback" Text :>
+                               QueryParam "alt" AltJSON :>
+                                 ReqBody '[JSON] ValueRange :>
+                                   Put '[JSON] UpdateValuesResponse
+
+-- | Sets values in a range of a spreadsheet. The caller must specify the
+-- spreadsheet ID, range, and a valueInputOption.
+--
+-- /See:/ 'spreadsheetsValuesUpdate' smart constructor.
+data SpreadsheetsValuesUpdate = SpreadsheetsValuesUpdate'
+    { _svuXgafv            :: !(Maybe Xgafv)
+    , _svuUploadProtocol   :: !(Maybe Text)
+    , _svuPp               :: !Bool
+    , _svuAccessToken      :: !(Maybe Text)
+    , _svuSpreadsheetId    :: !Text
+    , _svuUploadType       :: !(Maybe Text)
+    , _svuValueInputOption :: !(Maybe Text)
+    , _svuPayload          :: !ValueRange
+    , _svuBearerToken      :: !(Maybe Text)
+    , _svuRange            :: !Text
+    , _svuCallback         :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetsValuesUpdate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'svuXgafv'
+--
+-- * 'svuUploadProtocol'
+--
+-- * 'svuPp'
+--
+-- * 'svuAccessToken'
+--
+-- * 'svuSpreadsheetId'
+--
+-- * 'svuUploadType'
+--
+-- * 'svuValueInputOption'
+--
+-- * 'svuPayload'
+--
+-- * 'svuBearerToken'
+--
+-- * 'svuRange'
+--
+-- * 'svuCallback'
+spreadsheetsValuesUpdate
+    :: Text -- ^ 'svuSpreadsheetId'
+    -> ValueRange -- ^ 'svuPayload'
+    -> Text -- ^ 'svuRange'
+    -> SpreadsheetsValuesUpdate
+spreadsheetsValuesUpdate pSvuSpreadsheetId_ pSvuPayload_ pSvuRange_ =
+    SpreadsheetsValuesUpdate'
+    { _svuXgafv = Nothing
+    , _svuUploadProtocol = Nothing
+    , _svuPp = True
+    , _svuAccessToken = Nothing
+    , _svuSpreadsheetId = pSvuSpreadsheetId_
+    , _svuUploadType = Nothing
+    , _svuValueInputOption = Nothing
+    , _svuPayload = pSvuPayload_
+    , _svuBearerToken = Nothing
+    , _svuRange = pSvuRange_
+    , _svuCallback = Nothing
+    }
+
+-- | V1 error format.
+svuXgafv :: Lens' SpreadsheetsValuesUpdate (Maybe Xgafv)
+svuXgafv = lens _svuXgafv (\ s a -> s{_svuXgafv = a})
+
+-- | Upload protocol for media (e.g. \"raw\", \"multipart\").
+svuUploadProtocol :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuUploadProtocol
+  = lens _svuUploadProtocol
+      (\ s a -> s{_svuUploadProtocol = a})
+
+-- | Pretty-print response.
+svuPp :: Lens' SpreadsheetsValuesUpdate Bool
+svuPp = lens _svuPp (\ s a -> s{_svuPp = a})
+
+-- | OAuth access token.
+svuAccessToken :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuAccessToken
+  = lens _svuAccessToken
+      (\ s a -> s{_svuAccessToken = a})
+
+-- | The ID of the spreadsheet to update.
+svuSpreadsheetId :: Lens' SpreadsheetsValuesUpdate Text
+svuSpreadsheetId
+  = lens _svuSpreadsheetId
+      (\ s a -> s{_svuSpreadsheetId = a})
+
+-- | Legacy upload protocol for media (e.g. \"media\", \"multipart\").
+svuUploadType :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuUploadType
+  = lens _svuUploadType
+      (\ s a -> s{_svuUploadType = a})
+
+-- | How the input data should be interpreted.
+svuValueInputOption :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuValueInputOption
+  = lens _svuValueInputOption
+      (\ s a -> s{_svuValueInputOption = a})
+
+-- | Multipart request metadata.
+svuPayload :: Lens' SpreadsheetsValuesUpdate ValueRange
+svuPayload
+  = lens _svuPayload (\ s a -> s{_svuPayload = a})
+
+-- | OAuth bearer token.
+svuBearerToken :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuBearerToken
+  = lens _svuBearerToken
+      (\ s a -> s{_svuBearerToken = a})
+
+-- | The A1 notation of the values to update.
+svuRange :: Lens' SpreadsheetsValuesUpdate Text
+svuRange = lens _svuRange (\ s a -> s{_svuRange = a})
+
+-- | JSONP
+svuCallback :: Lens' SpreadsheetsValuesUpdate (Maybe Text)
+svuCallback
+  = lens _svuCallback (\ s a -> s{_svuCallback = a})
+
+instance GoogleRequest SpreadsheetsValuesUpdate where
+        type Rs SpreadsheetsValuesUpdate =
+             UpdateValuesResponse
+        type Scopes SpreadsheetsValuesUpdate =
+             '["https://www.googleapis.com/auth/drive",
+               "https://www.googleapis.com/auth/spreadsheets"]
+        requestClient SpreadsheetsValuesUpdate'{..}
+          = go _svuSpreadsheetId _svuRange _svuXgafv
+              _svuUploadProtocol
+              (Just _svuPp)
+              _svuAccessToken
+              _svuUploadType
+              _svuValueInputOption
+              _svuBearerToken
+              _svuCallback
+              (Just AltJSON)
+              _svuPayload
+              sheetsService
+          where go
+                  = buildClient
+                      (Proxy :: Proxy SpreadsheetsValuesUpdateResource)
+                      mempty
diff --git a/gen/Network/Google/Sheets.hs b/gen/Network/Google/Sheets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Sheets.hs
@@ -0,0 +1,1091 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TypeOperators     #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- |
+-- Module      : Network.Google.Sheets
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Reads and writes Google Sheets.
+--
+-- /See:/ <https://developers.google.com/sheets/ Google Sheets API Reference>
+module Network.Google.Sheets
+    (
+    -- * Service Configuration
+      sheetsService
+
+    -- * OAuth Scopes
+    , spreadsheetsReadOnlyScope
+    , driveReadOnlyScope
+    , driveScope
+    , spreadsheetsScope
+
+    -- * API Declaration
+    , SheetsAPI
+
+    -- * Resources
+
+    -- ** sheets.spreadsheets.batchUpdate
+    , module Network.Google.Resource.Sheets.Spreadsheets.BatchUpdate
+
+    -- ** sheets.spreadsheets.create
+    , module Network.Google.Resource.Sheets.Spreadsheets.Create
+
+    -- ** sheets.spreadsheets.get
+    , module Network.Google.Resource.Sheets.Spreadsheets.Get
+
+    -- ** sheets.spreadsheets.sheets.copyTo
+    , module Network.Google.Resource.Sheets.Spreadsheets.Sheets.CopyTo
+
+    -- ** sheets.spreadsheets.values.batchGet
+    , module Network.Google.Resource.Sheets.Spreadsheets.Values.BatchGet
+
+    -- ** sheets.spreadsheets.values.batchUpdate
+    , module Network.Google.Resource.Sheets.Spreadsheets.Values.BatchUpdate
+
+    -- ** sheets.spreadsheets.values.get
+    , module Network.Google.Resource.Sheets.Spreadsheets.Values.Get
+
+    -- ** sheets.spreadsheets.values.update
+    , module Network.Google.Resource.Sheets.Spreadsheets.Values.Update
+
+    -- * Types
+
+    -- ** PivotGroupSortValueBucket
+    , PivotGroupSortValueBucket
+    , pivotGroupSortValueBucket
+    , pgsvbBuckets
+    , pgsvbValuesIndex
+
+    -- ** ValueRange
+    , ValueRange
+    , valueRange
+    , vrValues
+    , vrRange
+    , vrMajorDimension
+
+    -- ** SortRangeRequest
+    , SortRangeRequest
+    , sortRangeRequest
+    , srrSortSpecs
+    , srrRange
+
+    -- ** CopyPasteRequestPasteType
+    , CopyPasteRequestPasteType (..)
+
+    -- ** DeleteNamedRangeRequest
+    , DeleteNamedRangeRequest
+    , deleteNamedRangeRequest
+    , dnrrNamedRangeId
+
+    -- ** UpdateNamedRangeRequest
+    , UpdateNamedRangeRequest
+    , updateNamedRangeRequest
+    , unrrNamedRange
+    , unrrFields
+
+    -- ** BasicChartAxisPosition
+    , BasicChartAxisPosition (..)
+
+    -- ** ChartData
+    , ChartData
+    , chartData
+    , cdSourceRange
+
+    -- ** BasicChartSeriesTargetAxis
+    , BasicChartSeriesTargetAxis (..)
+
+    -- ** SpreadsheetProperties
+    , SpreadsheetProperties
+    , spreadsheetProperties
+    , spDefaultFormat
+    , spLocale
+    , spAutoRecalc
+    , spTitle
+    , spTimeZone
+
+    -- ** BOrders
+    , BOrders
+    , bOrders
+    , boBottom
+    , boLeft
+    , boRight
+    , boTop
+
+    -- ** TextFormatRun
+    , TextFormatRun
+    , textFormatRun
+    , tfrFormat
+    , tfrStartIndex
+
+    -- ** AddSheetRequest
+    , AddSheetRequest
+    , addSheetRequest
+    , asrProperties
+
+    -- ** SortSpec
+    , SortSpec
+    , sortSpec
+    , ssSortOrder
+    , ssDimensionIndex
+
+    -- ** CopyPasteRequest
+    , CopyPasteRequest
+    , copyPasteRequest
+    , cprDestination
+    , cprSource
+    , cprPasteOrientation
+    , cprPasteType
+
+    -- ** GridRange
+    , GridRange
+    , gridRange
+    , grEndColumnIndex
+    , grStartColumnIndex
+    , grEndRowIndex
+    , grStartRowIndex
+    , grSheetId
+
+    -- ** AppendDimensionRequestDimension
+    , AppendDimensionRequestDimension (..)
+
+    -- ** AddFilterViewResponse
+    , AddFilterViewResponse
+    , addFilterViewResponse
+    , afvrFilter
+
+    -- ** DimensionRangeDimension
+    , DimensionRangeDimension (..)
+
+    -- ** BooleanCondition
+    , BooleanCondition
+    , booleanCondition
+    , bcValues
+    , bcType
+
+    -- ** AutoResizeDimensionsRequest
+    , AutoResizeDimensionsRequest
+    , autoResizeDimensionsRequest
+    , ardrDimensions
+
+    -- ** Sheet
+    , Sheet
+    , sheet
+    , sData
+    , sMerges
+    , sProtectedRanges
+    , sCharts
+    , sBasicFilter
+    , sConditionalFormats
+    , sFilterViews
+    , sProperties
+
+    -- ** GridCoordinate
+    , GridCoordinate
+    , gridCoordinate
+    , gcColumnIndex
+    , gcRowIndex
+    , gcSheetId
+
+    -- ** ClearBasicFilterRequest
+    , ClearBasicFilterRequest
+    , clearBasicFilterRequest
+    , cbfrSheetId
+
+    -- ** UpdateEmbeddedObjectPositionRequest
+    , UpdateEmbeddedObjectPositionRequest
+    , updateEmbeddedObjectPositionRequest
+    , ueoprNewPosition
+    , ueoprObjectId
+    , ueoprFields
+
+    -- ** SourceAndDestinationDimension
+    , SourceAndDestinationDimension (..)
+
+    -- ** BooleanRule
+    , BooleanRule
+    , booleanRule
+    , brFormat
+    , brCondition
+
+    -- ** CellFormatWrapStrategy
+    , CellFormatWrapStrategy (..)
+
+    -- ** SourceAndDestination
+    , SourceAndDestination
+    , sourceAndDestination
+    , sadDimension
+    , sadSource
+    , sadFillLength
+
+    -- ** PasteDataRequest
+    , PasteDataRequest
+    , pasteDataRequest
+    , pdrData
+    , pdrCoordinate
+    , pdrHTML
+    , pdrType
+    , pdrDelimiter
+
+    -- ** BatchUpdateValuesRequestValueInputOption
+    , BatchUpdateValuesRequestValueInputOption (..)
+
+    -- ** AppendCellsRequest
+    , AppendCellsRequest
+    , appendCellsRequest
+    , acrRows
+    , acrSheetId
+    , acrFields
+
+    -- ** FindReplaceResponse
+    , FindReplaceResponse
+    , findReplaceResponse
+    , frrValuesChanged
+    , frrFormulasChanged
+    , frrRowsChanged
+    , frrSheetsChanged
+    , frrOccurrencesChanged
+
+    -- ** PieChartSpec
+    , PieChartSpec
+    , pieChartSpec
+    , pcsPieHole
+    , pcsLegendPosition
+    , pcsDomain
+    , pcsSeries
+    , pcsThreeDimensional
+
+    -- ** DataValidationRule
+    , DataValidationRule
+    , dataValidationRule
+    , dvrShowCustomUi
+    , dvrInputMessage
+    , dvrStrict
+    , dvrCondition
+
+    -- ** FilterView
+    , FilterView
+    , filterView
+    , fvSortSpecs
+    , fvNamedRangeId
+    , fvRange
+    , fvFilterViewId
+    , fvTitle
+    , fvCriteria
+
+    -- ** Color
+    , Color
+    , color
+    , cRed
+    , cAlpha
+    , cGreen
+    , cBlue
+
+    -- ** DeleteFilterViewRequest
+    , DeleteFilterViewRequest
+    , deleteFilterViewRequest
+    , dfvrFilterId
+
+    -- ** UpdateFilterViewRequest
+    , UpdateFilterViewRequest
+    , updateFilterViewRequest
+    , ufvrFilter
+    , ufvrFields
+
+    -- ** BasicChartSeries
+    , BasicChartSeries
+    , basicChartSeries
+    , bcsTargetAxis
+    , bcsSeries
+    , bcsType
+
+    -- ** AddProtectedRangeRequest
+    , AddProtectedRangeRequest
+    , addProtectedRangeRequest
+    , aprrProtectedRange
+
+    -- ** PieChartSpecLegendPosition
+    , PieChartSpecLegendPosition (..)
+
+    -- ** RepeatCellRequest
+    , RepeatCellRequest
+    , repeatCellRequest
+    , rcrCell
+    , rcrRange
+    , rcrFields
+
+    -- ** ConditionValue
+    , ConditionValue
+    , conditionValue
+    , cvRelativeDate
+    , cvUserEnteredValue
+
+    -- ** DeleteDimensionRequest
+    , DeleteDimensionRequest
+    , deleteDimensionRequest
+    , ddrRange
+
+    -- ** FindReplaceRequest
+    , FindReplaceRequest
+    , findReplaceRequest
+    , frrMatchCase
+    , frrAllSheets
+    , frrIncludeFormulas
+    , frrMatchEntireCell
+    , frrRange
+    , frrSheetId
+    , frrFind
+    , frrSearchByRegex
+    , frrReplacement
+
+    -- ** MoveDimensionRequest
+    , MoveDimensionRequest
+    , moveDimensionRequest
+    , mdrDestinationIndex
+    , mdrSource
+
+    -- ** CellFormatVerticalAlignment
+    , CellFormatVerticalAlignment (..)
+
+    -- ** NumberFormatType
+    , NumberFormatType (..)
+
+    -- ** GradientRule
+    , GradientRule
+    , gradientRule
+    , grMidpoint
+    , grMaxpoint
+    , grMinpoint
+
+    -- ** CutPasteRequest
+    , CutPasteRequest
+    , cutPasteRequest
+    , cDestination
+    , cSource
+    , cPasteType
+
+    -- ** UpdateEmbeddedObjectPositionResponse
+    , UpdateEmbeddedObjectPositionResponse
+    , updateEmbeddedObjectPositionResponse
+    , ueoprPosition
+
+    -- ** ConditionValueRelativeDate
+    , ConditionValueRelativeDate (..)
+
+    -- ** Response
+    , Response
+    , response
+    , rAddFilterView
+    , rDuplicateFilterView
+    , rUpdateEmbeddedObjectPosition
+    , rAddSheet
+    , rFindReplace
+    , rAddProtectedRange
+    , rDeleteConditionalFormatRule
+    , rUpdateConditionalFormatRule
+    , rAddNamedRange
+    , rAddChart
+    , rDuplicateSheet
+
+    -- ** FilterCriteria
+    , FilterCriteria
+    , filterCriteria
+    , fcHiddenValues
+    , fcCondition
+
+    -- ** ErrorValue
+    , ErrorValue
+    , errorValue
+    , evType
+    , evMessage
+
+    -- ** UpdateConditionalFormatRuleRequest
+    , UpdateConditionalFormatRuleRequest
+    , updateConditionalFormatRuleRequest
+    , ucfrrRule
+    , ucfrrNewIndex
+    , ucfrrSheetId
+    , ucfrrIndex
+
+    -- ** DeleteConditionalFormatRuleRequest
+    , DeleteConditionalFormatRuleRequest
+    , deleteConditionalFormatRuleRequest
+    , dcfrrSheetId
+    , dcfrrIndex
+
+    -- ** SortSpecSortOrder
+    , SortSpecSortOrder (..)
+
+    -- ** OverlayPosition
+    , OverlayPosition
+    , overlayPosition
+    , opHeightPixels
+    , opOffSetYPixels
+    , opAnchorCell
+    , opWidthPixels
+    , opOffSetXPixels
+
+    -- ** DeleteEmbeddedObjectRequest
+    , DeleteEmbeddedObjectRequest
+    , deleteEmbeddedObjectRequest
+    , deorObjectId
+
+    -- ** SheetProperties
+    , SheetProperties
+    , sheetProperties
+    , sTabColor
+    , sGridProperties
+    , sSheetType
+    , sHidden
+    , sSheetId
+    , sTitle
+    , sRightToLeft
+    , sIndex
+
+    -- ** FilterViewCriteria
+    , FilterViewCriteria
+    , filterViewCriteria
+    , fvcAddtional
+
+    -- ** BatchUpdateValuesResponse
+    , BatchUpdateValuesResponse
+    , batchUpdateValuesResponse
+    , buvrTotalUpdatedColumns
+    , buvrResponses
+    , buvrSpreadsheetId
+    , buvrTotalUpdatedSheets
+    , buvrTotalUpdatedCells
+    , buvrTotalUpdatedRows
+
+    -- ** UpdateSheetPropertiesRequest
+    , UpdateSheetPropertiesRequest
+    , updateSheetPropertiesRequest
+    , usprFields
+    , usprProperties
+
+    -- ** Spreadsheet
+    , Spreadsheet
+    , spreadsheet
+    , sprSheets
+    , sprNamedRanges
+    , sprSpreadsheetId
+    , sprProperties
+
+    -- ** InsertDimensionRequest
+    , InsertDimensionRequest
+    , insertDimensionRequest
+    , idrRange
+    , idrInheritFromBefore
+
+    -- ** PivotValueSummarizeFunction
+    , PivotValueSummarizeFunction (..)
+
+    -- ** InterpolationPoint
+    , InterpolationPoint
+    , interpolationPoint
+    , ipColor
+    , ipValue
+    , ipType
+
+    -- ** CellData
+    , CellData
+    , cellData
+    , cdTextFormatRuns
+    , cdNote
+    , cdUserEnteredValue
+    , cdUserEnteredFormat
+    , cdEffectiveFormat
+    , cdPivotTable
+    , cdFormattedValue
+    , cdDataValidation
+    , cdHyperlink
+    , cdEffectiveValue
+
+    -- ** ChartSourceRange
+    , ChartSourceRange
+    , chartSourceRange
+    , csrSources
+
+    -- ** AddNamedRangeResponse
+    , AddNamedRangeResponse
+    , addNamedRangeResponse
+    , anrrNamedRange
+
+    -- ** AddChartResponse
+    , AddChartResponse
+    , addChartResponse
+    , acrChart
+
+    -- ** UpdateChartSpecRequest
+    , UpdateChartSpecRequest
+    , updateChartSpecRequest
+    , ucsrSpec
+    , ucsrChartId
+
+    -- ** SetBasicFilterRequest
+    , SetBasicFilterRequest
+    , setBasicFilterRequest
+    , sbfrFilter
+
+    -- ** GridProperties
+    , GridProperties
+    , gridProperties
+    , gpFrozenColumnCount
+    , gpColumnCount
+    , gpHideGridlines
+    , gpFrozenRowCount
+    , gpRowCount
+
+    -- ** CellFormatHyperlinkDisplayType
+    , CellFormatHyperlinkDisplayType (..)
+
+    -- ** BasicFilterCriteria
+    , BasicFilterCriteria
+    , basicFilterCriteria
+    , bfcAddtional
+
+    -- ** UpdateDimensionPropertiesRequest
+    , UpdateDimensionPropertiesRequest
+    , updateDimensionPropertiesRequest
+    , udprRange
+    , udprFields
+    , udprProperties
+
+    -- ** PivotTableCriteria
+    , PivotTableCriteria
+    , pivotTableCriteria
+    , ptcAddtional
+
+    -- ** AutoFillRequest
+    , AutoFillRequest
+    , autoFillRequest
+    , afrSourceAndDestination
+    , afrUseAlternateSeries
+    , afrRange
+
+    -- ** DuplicateSheetRequest
+    , DuplicateSheetRequest
+    , duplicateSheetRequest
+    , dsrNewSheetName
+    , dsrInsertSheetIndex
+    , dsrSourceSheetId
+    , dsrNewSheetId
+
+    -- ** DuplicateFilterViewResponse
+    , DuplicateFilterViewResponse
+    , duplicateFilterViewResponse
+    , dfvrFilter
+
+    -- ** SheetPropertiesSheetType
+    , SheetPropertiesSheetType (..)
+
+    -- ** BatchUpdateValuesRequest
+    , BatchUpdateValuesRequest
+    , batchUpdateValuesRequest
+    , buvrData
+    , buvrValueInputOption
+
+    -- ** AddChartRequest
+    , AddChartRequest
+    , addChartRequest
+    , aChart
+
+    -- ** NamedRange
+    , NamedRange
+    , namedRange
+    , nrNamedRangeId
+    , nrName
+    , nrRange
+
+    -- ** MergeCellsRequest
+    , MergeCellsRequest
+    , mergeCellsRequest
+    , mcrMergeType
+    , mcrRange
+
+    -- ** MergeCellsRequestMergeType
+    , MergeCellsRequestMergeType (..)
+
+    -- ** CellFormatHorizontalAlignment
+    , CellFormatHorizontalAlignment (..)
+
+    -- ** BOrder
+    , BOrder
+    , bOrder
+    , boStyle
+    , boColor
+    , boWidth
+
+    -- ** ExtendedValue
+    , ExtendedValue
+    , extendedValue
+    , evBoolValue
+    , evNumberValue
+    , evErrorValue
+    , evStringValue
+    , evFormulaValue
+
+    -- ** AddNamedRangeRequest
+    , AddNamedRangeRequest
+    , addNamedRangeRequest
+    , aNamedRange
+
+    -- ** PivotFilterCriteria
+    , PivotFilterCriteria
+    , pivotFilterCriteria
+    , pfcVisibleValues
+
+    -- ** DimensionRange
+    , DimensionRange
+    , dimensionRange
+    , drDimension
+    , drEndIndex
+    , drSheetId
+    , drStartIndex
+
+    -- ** UpdateSpreadsheetPropertiesRequest
+    , UpdateSpreadsheetPropertiesRequest
+    , updateSpreadsheetPropertiesRequest
+    , uFields
+    , uProperties
+
+    -- ** AddProtectedRangeResponse
+    , AddProtectedRangeResponse
+    , addProtectedRangeResponse
+    , aProtectedRange
+
+    -- ** AppendDimensionRequest
+    , AppendDimensionRequest
+    , appendDimensionRequest
+    , adrLength
+    , adrDimension
+    , adrSheetId
+
+    -- ** PivotValue
+    , PivotValue
+    , pivotValue
+    , pvSourceColumnOffSet
+    , pvFormula
+    , pvName
+    , pvSummarizeFunction
+
+    -- ** UnmergeCellsRequest
+    , UnmergeCellsRequest
+    , unmergeCellsRequest
+    , ucrRange
+
+    -- ** DeleteSheetRequest
+    , DeleteSheetRequest
+    , deleteSheetRequest
+    , dsrSheetId
+
+    -- ** BooleanConditionType
+    , BooleanConditionType (..)
+
+    -- ** UpdateBOrdersRequest
+    , UpdateBOrdersRequest
+    , updateBOrdersRequest
+    , uborBottom
+    , uborInnerHorizontal
+    , uborLeft
+    , uborInnerVertical
+    , uborRange
+    , uborRight
+    , uborTop
+
+    -- ** ValueRangeMajorDimension
+    , ValueRangeMajorDimension (..)
+
+    -- ** PivotGroupSortOrder
+    , PivotGroupSortOrder (..)
+
+    -- ** BasicChartSpecChartType
+    , BasicChartSpecChartType (..)
+
+    -- ** EmbeddedChart
+    , EmbeddedChart
+    , embeddedChart
+    , ecSpec
+    , ecPosition
+    , ecChartId
+
+    -- ** RowData
+    , RowData
+    , rowData
+    , rdValues
+
+    -- ** Editors
+    , Editors
+    , editors
+    , eGroups
+    , eUsers
+    , eDomainUsersCanEdit
+
+    -- ** Xgafv
+    , Xgafv (..)
+
+    -- ** PivotTable
+    , PivotTable
+    , pivotTable
+    , ptValues
+    , ptValueLayout
+    , ptRows
+    , ptSource
+    , ptColumns
+    , ptCriteria
+
+    -- ** EmbeddedObjectPosition
+    , EmbeddedObjectPosition
+    , embeddedObjectPosition
+    , eopOverlayPosition
+    , eopSheetId
+    , eopNewSheet
+
+    -- ** BasicFilter
+    , BasicFilter
+    , basicFilter
+    , bfSortSpecs
+    , bfRange
+    , bfCriteria
+
+    -- ** TextToColumnsRequest
+    , TextToColumnsRequest
+    , textToColumnsRequest
+    , ttcrDelimiterType
+    , ttcrSource
+    , ttcrDelimiter
+
+    -- ** SpreadsheetPropertiesAutoRecalc
+    , SpreadsheetPropertiesAutoRecalc (..)
+
+    -- ** CopyPasteRequestPasteOrientation
+    , CopyPasteRequestPasteOrientation (..)
+
+    -- ** BatchUpdateSpreadsheetRequest
+    , BatchUpdateSpreadsheetRequest
+    , batchUpdateSpreadsheetRequest
+    , busrRequests
+
+    -- ** PasteDataRequestType
+    , PasteDataRequestType (..)
+
+    -- ** UpdateValuesResponse
+    , UpdateValuesResponse
+    , updateValuesResponse
+    , uvrUpdatedCells
+    , uvrSpreadsheetId
+    , uvrUpdatedRows
+    , uvrUpdatedRange
+    , uvrUpdatedColumns
+
+    -- ** CopySheetToAnotherSpreadsheetRequest
+    , CopySheetToAnotherSpreadsheetRequest
+    , copySheetToAnotherSpreadsheetRequest
+    , cstasrDestinationSpreadsheetId
+
+    -- ** AddFilterViewRequest
+    , AddFilterViewRequest
+    , addFilterViewRequest
+    , aFilter
+
+    -- ** PivotGroupValueMetadata
+    , PivotGroupValueMetadata
+    , pivotGroupValueMetadata
+    , pgvmValue
+    , pgvmCollapsed
+
+    -- ** CellFormatTextDirection
+    , CellFormatTextDirection (..)
+
+    -- ** BasicChartSeriesType
+    , BasicChartSeriesType (..)
+
+    -- ** UpdateCellsRequest
+    , UpdateCellsRequest
+    , updateCellsRequest
+    , updStart
+    , updRows
+    , updRange
+    , updFields
+
+    -- ** CellFormat
+    , CellFormat
+    , cellFormat
+    , cfBOrders
+    , cfVerticalAlignment
+    , cfBackgRoundColor
+    , cfHyperlinkDisplayType
+    , cfWrapStrategy
+    , cfNumberFormat
+    , cfTextDirection
+    , cfTextFormat
+    , cfHorizontalAlignment
+    , cfPadding
+
+    -- ** DeleteProtectedRangeRequest
+    , DeleteProtectedRangeRequest
+    , deleteProtectedRangeRequest
+    , dprrProtectedRangeId
+
+    -- ** UpdateProtectedRangeRequest
+    , UpdateProtectedRangeRequest
+    , updateProtectedRangeRequest
+    , uprrProtectedRange
+    , uprrFields
+
+    -- ** AddSheetResponse
+    , AddSheetResponse
+    , addSheetResponse
+    , aProperties
+
+    -- ** ProtectedRange
+    , ProtectedRange
+    , protectedRange
+    , prProtectedRangeId
+    , prWarningOnly
+    , prNamedRangeId
+    , prRange
+    , prEditors
+    , prUnprotectedRanges
+    , prRequestingUserCanEdit
+    , prDescription
+
+    -- ** BasicChartAxis
+    , BasicChartAxis
+    , basicChartAxis
+    , bcaFormat
+    , bcaTitle
+    , bcaPosition
+
+    -- ** GridData
+    , GridData
+    , gridData
+    , gdRowMetadata
+    , gdStartRow
+    , gdRowData
+    , gdColumnMetadata
+    , gdStartColumn
+
+    -- ** NumberFormat
+    , NumberFormat
+    , numberFormat
+    , nfPattern
+    , nfType
+
+    -- ** BatchUpdateSpreadsheetResponse
+    , BatchUpdateSpreadsheetResponse
+    , batchUpdateSpreadsheetResponse
+    , busrSpreadsheetId
+    , busrReplies
+
+    -- ** SetDataValidationRequest
+    , SetDataValidationRequest
+    , setDataValidationRequest
+    , sdvrRule
+    , sdvrRange
+
+    -- ** ChartSpecHiddenDimensionStrategy
+    , ChartSpecHiddenDimensionStrategy (..)
+
+    -- ** DuplicateFilterViewRequest
+    , DuplicateFilterViewRequest
+    , duplicateFilterViewRequest
+    , dFilterId
+
+    -- ** BOrderStyle
+    , BOrderStyle (..)
+
+    -- ** PivotGroup
+    , PivotGroup
+    , pivotGroup
+    , pgValueMetadata
+    , pgSourceColumnOffSet
+    , pgSortOrder
+    , pgShowTotals
+    , pgValueBucket
+
+    -- ** CutPasteRequestPasteType
+    , CutPasteRequestPasteType (..)
+
+    -- ** BasicChartSpecLegendPosition
+    , BasicChartSpecLegendPosition (..)
+
+    -- ** ErrorValueType
+    , ErrorValueType (..)
+
+    -- ** ConditionalFormatRule
+    , ConditionalFormatRule
+    , conditionalFormatRule
+    , cfrBooleanRule
+    , cfrGradientRule
+    , cfrRanges
+
+    -- ** BasicChartSpec
+    , BasicChartSpec
+    , basicChartSpec
+    , bHeaderCount
+    , bLegendPosition
+    , bSeries
+    , bChartType
+    , bDomains
+    , bAxis
+
+    -- ** AddConditionalFormatRuleRequest
+    , AddConditionalFormatRuleRequest
+    , addConditionalFormatRuleRequest
+    , acfrrRule
+    , acfrrIndex
+
+    -- ** PivotTableValueLayout
+    , PivotTableValueLayout (..)
+
+    -- ** DuplicateSheetResponse
+    , DuplicateSheetResponse
+    , duplicateSheetResponse
+    , dsrProperties
+
+    -- ** TextFormat
+    , TextFormat
+    , textFormat
+    , tfFontFamily
+    , tfForegRoundColor
+    , tfFontSize
+    , tfUnderline
+    , tfItalic
+    , tfBold
+    , tfStrikethrough
+
+    -- ** BasicChartDomain
+    , BasicChartDomain
+    , basicChartDomain
+    , bcdDomain
+
+    -- ** InterpolationPointType
+    , InterpolationPointType (..)
+
+    -- ** TextToColumnsRequestDelimiterType
+    , TextToColumnsRequestDelimiterType (..)
+
+    -- ** Padding
+    , Padding
+    , padding
+    , pBottom
+    , pLeft
+    , pRight
+    , pTop
+
+    -- ** ChartSpec
+    , ChartSpec
+    , chartSpec
+    , csTitle
+    , csPieChart
+    , csBasicChart
+    , csHiddenDimensionStrategy
+
+    -- ** DimensionProperties
+    , DimensionProperties
+    , dimensionProperties
+    , dpHiddenByFilter
+    , dpPixelSize
+    , dpHiddenByUser
+
+    -- ** BatchGetValuesResponse
+    , BatchGetValuesResponse
+    , batchGetValuesResponse
+    , bgvrSpreadsheetId
+    , bgvrValueRanges
+
+    -- ** Request'
+    , Request'
+    , request'
+    , reqAddFilterView
+    , reqDeleteProtectedRange
+    , reqUpdateProtectedRange
+    , reqUpdateCells
+    , reqDuplicateFilterView
+    , reqAddConditionalFormatRule
+    , reqSortRange
+    , reqUpdateNamedRange
+    , reqDeleteNamedRange
+    , reqClearBasicFilter
+    , reqAppendCells
+    , reqPasteData
+    , reqUpdateEmbeddedObjectPosition
+    , reqCopyPaste
+    , reqAutoResizeDimensions
+    , reqAddSheet
+    , reqFindReplace
+    , reqDeleteDimension
+    , reqCutPaste
+    , reqMoveDimension
+    , reqRepeatCell
+    , reqAddProtectedRange
+    , reqUpdateFilterView
+    , reqDeleteFilterView
+    , reqInsertDimension
+    , reqUpdateSheetProperties
+    , reqDeleteConditionalFormatRule
+    , reqUpdateConditionalFormatRule
+    , reqDeleteEmbeddedObject
+    , reqMergeCells
+    , reqAddNamedRange
+    , reqAddChart
+    , reqDuplicateSheet
+    , reqAutoFill
+    , reqUpdateDimensionProperties
+    , reqUpdateChartSpec
+    , reqSetBasicFilter
+    , reqTextToColumns
+    , reqUpdateSpreadsheetProperties
+    , reqDeleteSheet
+    , reqUnmergeCells
+    , reqUpdateBOrders
+    , reqAppendDimension
+    , reqSetDataValidation
+
+    -- ** DeleteConditionalFormatRuleResponse
+    , DeleteConditionalFormatRuleResponse
+    , deleteConditionalFormatRuleResponse
+    , dcfrrRule
+
+    -- ** UpdateConditionalFormatRuleResponse
+    , UpdateConditionalFormatRuleResponse
+    , updateConditionalFormatRuleResponse
+    , uNewRule
+    , uNewIndex
+    , uOldIndex
+    , uOldRule
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Resource.Sheets.Spreadsheets.BatchUpdate
+import           Network.Google.Resource.Sheets.Spreadsheets.Create
+import           Network.Google.Resource.Sheets.Spreadsheets.Get
+import           Network.Google.Resource.Sheets.Spreadsheets.Sheets.CopyTo
+import           Network.Google.Resource.Sheets.Spreadsheets.Values.BatchGet
+import           Network.Google.Resource.Sheets.Spreadsheets.Values.BatchUpdate
+import           Network.Google.Resource.Sheets.Spreadsheets.Values.Get
+import           Network.Google.Resource.Sheets.Spreadsheets.Values.Update
+import           Network.Google.Sheets.Types
+
+{- $resources
+TODO
+-}
+
+-- | Represents the entirety of the methods and resources available for the Google Sheets API service.
+type SheetsAPI =
+     SpreadsheetsSheetsCopyToResource :<|>
+       SpreadsheetsValuesGetResource
+       :<|> SpreadsheetsValuesBatchGetResource
+       :<|> SpreadsheetsValuesBatchUpdateResource
+       :<|> SpreadsheetsValuesUpdateResource
+       :<|> SpreadsheetsGetResource
+       :<|> SpreadsheetsCreateResource
+       :<|> SpreadsheetsBatchUpdateResource
diff --git a/gen/Network/Google/Sheets/Types.hs b/gen/Network/Google/Sheets/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Sheets/Types.hs
@@ -0,0 +1,1058 @@
+{-# LANGUAGE DataKinds          #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Sheets.Types
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.Sheets.Types
+    (
+    -- * Service Configuration
+      sheetsService
+
+    -- * OAuth Scopes
+    , spreadsheetsReadOnlyScope
+    , driveReadOnlyScope
+    , driveScope
+    , spreadsheetsScope
+
+    -- * PivotGroupSortValueBucket
+    , PivotGroupSortValueBucket
+    , pivotGroupSortValueBucket
+    , pgsvbBuckets
+    , pgsvbValuesIndex
+
+    -- * ValueRange
+    , ValueRange
+    , valueRange
+    , vrValues
+    , vrRange
+    , vrMajorDimension
+
+    -- * SortRangeRequest
+    , SortRangeRequest
+    , sortRangeRequest
+    , srrSortSpecs
+    , srrRange
+
+    -- * CopyPasteRequestPasteType
+    , CopyPasteRequestPasteType (..)
+
+    -- * DeleteNamedRangeRequest
+    , DeleteNamedRangeRequest
+    , deleteNamedRangeRequest
+    , dnrrNamedRangeId
+
+    -- * UpdateNamedRangeRequest
+    , UpdateNamedRangeRequest
+    , updateNamedRangeRequest
+    , unrrNamedRange
+    , unrrFields
+
+    -- * BasicChartAxisPosition
+    , BasicChartAxisPosition (..)
+
+    -- * ChartData
+    , ChartData
+    , chartData
+    , cdSourceRange
+
+    -- * BasicChartSeriesTargetAxis
+    , BasicChartSeriesTargetAxis (..)
+
+    -- * SpreadsheetProperties
+    , SpreadsheetProperties
+    , spreadsheetProperties
+    , spDefaultFormat
+    , spLocale
+    , spAutoRecalc
+    , spTitle
+    , spTimeZone
+
+    -- * BOrders
+    , BOrders
+    , bOrders
+    , boBottom
+    , boLeft
+    , boRight
+    , boTop
+
+    -- * TextFormatRun
+    , TextFormatRun
+    , textFormatRun
+    , tfrFormat
+    , tfrStartIndex
+
+    -- * AddSheetRequest
+    , AddSheetRequest
+    , addSheetRequest
+    , asrProperties
+
+    -- * SortSpec
+    , SortSpec
+    , sortSpec
+    , ssSortOrder
+    , ssDimensionIndex
+
+    -- * CopyPasteRequest
+    , CopyPasteRequest
+    , copyPasteRequest
+    , cprDestination
+    , cprSource
+    , cprPasteOrientation
+    , cprPasteType
+
+    -- * GridRange
+    , GridRange
+    , gridRange
+    , grEndColumnIndex
+    , grStartColumnIndex
+    , grEndRowIndex
+    , grStartRowIndex
+    , grSheetId
+
+    -- * AppendDimensionRequestDimension
+    , AppendDimensionRequestDimension (..)
+
+    -- * AddFilterViewResponse
+    , AddFilterViewResponse
+    , addFilterViewResponse
+    , afvrFilter
+
+    -- * DimensionRangeDimension
+    , DimensionRangeDimension (..)
+
+    -- * BooleanCondition
+    , BooleanCondition
+    , booleanCondition
+    , bcValues
+    , bcType
+
+    -- * AutoResizeDimensionsRequest
+    , AutoResizeDimensionsRequest
+    , autoResizeDimensionsRequest
+    , ardrDimensions
+
+    -- * Sheet
+    , Sheet
+    , sheet
+    , sData
+    , sMerges
+    , sProtectedRanges
+    , sCharts
+    , sBasicFilter
+    , sConditionalFormats
+    , sFilterViews
+    , sProperties
+
+    -- * GridCoordinate
+    , GridCoordinate
+    , gridCoordinate
+    , gcColumnIndex
+    , gcRowIndex
+    , gcSheetId
+
+    -- * ClearBasicFilterRequest
+    , ClearBasicFilterRequest
+    , clearBasicFilterRequest
+    , cbfrSheetId
+
+    -- * UpdateEmbeddedObjectPositionRequest
+    , UpdateEmbeddedObjectPositionRequest
+    , updateEmbeddedObjectPositionRequest
+    , ueoprNewPosition
+    , ueoprObjectId
+    , ueoprFields
+
+    -- * SourceAndDestinationDimension
+    , SourceAndDestinationDimension (..)
+
+    -- * BooleanRule
+    , BooleanRule
+    , booleanRule
+    , brFormat
+    , brCondition
+
+    -- * CellFormatWrapStrategy
+    , CellFormatWrapStrategy (..)
+
+    -- * SourceAndDestination
+    , SourceAndDestination
+    , sourceAndDestination
+    , sadDimension
+    , sadSource
+    , sadFillLength
+
+    -- * PasteDataRequest
+    , PasteDataRequest
+    , pasteDataRequest
+    , pdrData
+    , pdrCoordinate
+    , pdrHTML
+    , pdrType
+    , pdrDelimiter
+
+    -- * BatchUpdateValuesRequestValueInputOption
+    , BatchUpdateValuesRequestValueInputOption (..)
+
+    -- * AppendCellsRequest
+    , AppendCellsRequest
+    , appendCellsRequest
+    , acrRows
+    , acrSheetId
+    , acrFields
+
+    -- * FindReplaceResponse
+    , FindReplaceResponse
+    , findReplaceResponse
+    , frrValuesChanged
+    , frrFormulasChanged
+    , frrRowsChanged
+    , frrSheetsChanged
+    , frrOccurrencesChanged
+
+    -- * PieChartSpec
+    , PieChartSpec
+    , pieChartSpec
+    , pcsPieHole
+    , pcsLegendPosition
+    , pcsDomain
+    , pcsSeries
+    , pcsThreeDimensional
+
+    -- * DataValidationRule
+    , DataValidationRule
+    , dataValidationRule
+    , dvrShowCustomUi
+    , dvrInputMessage
+    , dvrStrict
+    , dvrCondition
+
+    -- * FilterView
+    , FilterView
+    , filterView
+    , fvSortSpecs
+    , fvNamedRangeId
+    , fvRange
+    , fvFilterViewId
+    , fvTitle
+    , fvCriteria
+
+    -- * Color
+    , Color
+    , color
+    , cRed
+    , cAlpha
+    , cGreen
+    , cBlue
+
+    -- * DeleteFilterViewRequest
+    , DeleteFilterViewRequest
+    , deleteFilterViewRequest
+    , dfvrFilterId
+
+    -- * UpdateFilterViewRequest
+    , UpdateFilterViewRequest
+    , updateFilterViewRequest
+    , ufvrFilter
+    , ufvrFields
+
+    -- * BasicChartSeries
+    , BasicChartSeries
+    , basicChartSeries
+    , bcsTargetAxis
+    , bcsSeries
+    , bcsType
+
+    -- * AddProtectedRangeRequest
+    , AddProtectedRangeRequest
+    , addProtectedRangeRequest
+    , aprrProtectedRange
+
+    -- * PieChartSpecLegendPosition
+    , PieChartSpecLegendPosition (..)
+
+    -- * RepeatCellRequest
+    , RepeatCellRequest
+    , repeatCellRequest
+    , rcrCell
+    , rcrRange
+    , rcrFields
+
+    -- * ConditionValue
+    , ConditionValue
+    , conditionValue
+    , cvRelativeDate
+    , cvUserEnteredValue
+
+    -- * DeleteDimensionRequest
+    , DeleteDimensionRequest
+    , deleteDimensionRequest
+    , ddrRange
+
+    -- * FindReplaceRequest
+    , FindReplaceRequest
+    , findReplaceRequest
+    , frrMatchCase
+    , frrAllSheets
+    , frrIncludeFormulas
+    , frrMatchEntireCell
+    , frrRange
+    , frrSheetId
+    , frrFind
+    , frrSearchByRegex
+    , frrReplacement
+
+    -- * MoveDimensionRequest
+    , MoveDimensionRequest
+    , moveDimensionRequest
+    , mdrDestinationIndex
+    , mdrSource
+
+    -- * CellFormatVerticalAlignment
+    , CellFormatVerticalAlignment (..)
+
+    -- * NumberFormatType
+    , NumberFormatType (..)
+
+    -- * GradientRule
+    , GradientRule
+    , gradientRule
+    , grMidpoint
+    , grMaxpoint
+    , grMinpoint
+
+    -- * CutPasteRequest
+    , CutPasteRequest
+    , cutPasteRequest
+    , cDestination
+    , cSource
+    , cPasteType
+
+    -- * UpdateEmbeddedObjectPositionResponse
+    , UpdateEmbeddedObjectPositionResponse
+    , updateEmbeddedObjectPositionResponse
+    , ueoprPosition
+
+    -- * ConditionValueRelativeDate
+    , ConditionValueRelativeDate (..)
+
+    -- * Response
+    , Response
+    , response
+    , rAddFilterView
+    , rDuplicateFilterView
+    , rUpdateEmbeddedObjectPosition
+    , rAddSheet
+    , rFindReplace
+    , rAddProtectedRange
+    , rDeleteConditionalFormatRule
+    , rUpdateConditionalFormatRule
+    , rAddNamedRange
+    , rAddChart
+    , rDuplicateSheet
+
+    -- * FilterCriteria
+    , FilterCriteria
+    , filterCriteria
+    , fcHiddenValues
+    , fcCondition
+
+    -- * ErrorValue
+    , ErrorValue
+    , errorValue
+    , evType
+    , evMessage
+
+    -- * UpdateConditionalFormatRuleRequest
+    , UpdateConditionalFormatRuleRequest
+    , updateConditionalFormatRuleRequest
+    , ucfrrRule
+    , ucfrrNewIndex
+    , ucfrrSheetId
+    , ucfrrIndex
+
+    -- * DeleteConditionalFormatRuleRequest
+    , DeleteConditionalFormatRuleRequest
+    , deleteConditionalFormatRuleRequest
+    , dcfrrSheetId
+    , dcfrrIndex
+
+    -- * SortSpecSortOrder
+    , SortSpecSortOrder (..)
+
+    -- * OverlayPosition
+    , OverlayPosition
+    , overlayPosition
+    , opHeightPixels
+    , opOffSetYPixels
+    , opAnchorCell
+    , opWidthPixels
+    , opOffSetXPixels
+
+    -- * DeleteEmbeddedObjectRequest
+    , DeleteEmbeddedObjectRequest
+    , deleteEmbeddedObjectRequest
+    , deorObjectId
+
+    -- * SheetProperties
+    , SheetProperties
+    , sheetProperties
+    , sTabColor
+    , sGridProperties
+    , sSheetType
+    , sHidden
+    , sSheetId
+    , sTitle
+    , sRightToLeft
+    , sIndex
+
+    -- * FilterViewCriteria
+    , FilterViewCriteria
+    , filterViewCriteria
+    , fvcAddtional
+
+    -- * BatchUpdateValuesResponse
+    , BatchUpdateValuesResponse
+    , batchUpdateValuesResponse
+    , buvrTotalUpdatedColumns
+    , buvrResponses
+    , buvrSpreadsheetId
+    , buvrTotalUpdatedSheets
+    , buvrTotalUpdatedCells
+    , buvrTotalUpdatedRows
+
+    -- * UpdateSheetPropertiesRequest
+    , UpdateSheetPropertiesRequest
+    , updateSheetPropertiesRequest
+    , usprFields
+    , usprProperties
+
+    -- * Spreadsheet
+    , Spreadsheet
+    , spreadsheet
+    , sprSheets
+    , sprNamedRanges
+    , sprSpreadsheetId
+    , sprProperties
+
+    -- * InsertDimensionRequest
+    , InsertDimensionRequest
+    , insertDimensionRequest
+    , idrRange
+    , idrInheritFromBefore
+
+    -- * PivotValueSummarizeFunction
+    , PivotValueSummarizeFunction (..)
+
+    -- * InterpolationPoint
+    , InterpolationPoint
+    , interpolationPoint
+    , ipColor
+    , ipValue
+    , ipType
+
+    -- * CellData
+    , CellData
+    , cellData
+    , cdTextFormatRuns
+    , cdNote
+    , cdUserEnteredValue
+    , cdUserEnteredFormat
+    , cdEffectiveFormat
+    , cdPivotTable
+    , cdFormattedValue
+    , cdDataValidation
+    , cdHyperlink
+    , cdEffectiveValue
+
+    -- * ChartSourceRange
+    , ChartSourceRange
+    , chartSourceRange
+    , csrSources
+
+    -- * AddNamedRangeResponse
+    , AddNamedRangeResponse
+    , addNamedRangeResponse
+    , anrrNamedRange
+
+    -- * AddChartResponse
+    , AddChartResponse
+    , addChartResponse
+    , acrChart
+
+    -- * UpdateChartSpecRequest
+    , UpdateChartSpecRequest
+    , updateChartSpecRequest
+    , ucsrSpec
+    , ucsrChartId
+
+    -- * SetBasicFilterRequest
+    , SetBasicFilterRequest
+    , setBasicFilterRequest
+    , sbfrFilter
+
+    -- * GridProperties
+    , GridProperties
+    , gridProperties
+    , gpFrozenColumnCount
+    , gpColumnCount
+    , gpHideGridlines
+    , gpFrozenRowCount
+    , gpRowCount
+
+    -- * CellFormatHyperlinkDisplayType
+    , CellFormatHyperlinkDisplayType (..)
+
+    -- * BasicFilterCriteria
+    , BasicFilterCriteria
+    , basicFilterCriteria
+    , bfcAddtional
+
+    -- * UpdateDimensionPropertiesRequest
+    , UpdateDimensionPropertiesRequest
+    , updateDimensionPropertiesRequest
+    , udprRange
+    , udprFields
+    , udprProperties
+
+    -- * PivotTableCriteria
+    , PivotTableCriteria
+    , pivotTableCriteria
+    , ptcAddtional
+
+    -- * AutoFillRequest
+    , AutoFillRequest
+    , autoFillRequest
+    , afrSourceAndDestination
+    , afrUseAlternateSeries
+    , afrRange
+
+    -- * DuplicateSheetRequest
+    , DuplicateSheetRequest
+    , duplicateSheetRequest
+    , dsrNewSheetName
+    , dsrInsertSheetIndex
+    , dsrSourceSheetId
+    , dsrNewSheetId
+
+    -- * DuplicateFilterViewResponse
+    , DuplicateFilterViewResponse
+    , duplicateFilterViewResponse
+    , dfvrFilter
+
+    -- * SheetPropertiesSheetType
+    , SheetPropertiesSheetType (..)
+
+    -- * BatchUpdateValuesRequest
+    , BatchUpdateValuesRequest
+    , batchUpdateValuesRequest
+    , buvrData
+    , buvrValueInputOption
+
+    -- * AddChartRequest
+    , AddChartRequest
+    , addChartRequest
+    , aChart
+
+    -- * NamedRange
+    , NamedRange
+    , namedRange
+    , nrNamedRangeId
+    , nrName
+    , nrRange
+
+    -- * MergeCellsRequest
+    , MergeCellsRequest
+    , mergeCellsRequest
+    , mcrMergeType
+    , mcrRange
+
+    -- * MergeCellsRequestMergeType
+    , MergeCellsRequestMergeType (..)
+
+    -- * CellFormatHorizontalAlignment
+    , CellFormatHorizontalAlignment (..)
+
+    -- * BOrder
+    , BOrder
+    , bOrder
+    , boStyle
+    , boColor
+    , boWidth
+
+    -- * ExtendedValue
+    , ExtendedValue
+    , extendedValue
+    , evBoolValue
+    , evNumberValue
+    , evErrorValue
+    , evStringValue
+    , evFormulaValue
+
+    -- * AddNamedRangeRequest
+    , AddNamedRangeRequest
+    , addNamedRangeRequest
+    , aNamedRange
+
+    -- * PivotFilterCriteria
+    , PivotFilterCriteria
+    , pivotFilterCriteria
+    , pfcVisibleValues
+
+    -- * DimensionRange
+    , DimensionRange
+    , dimensionRange
+    , drDimension
+    , drEndIndex
+    , drSheetId
+    , drStartIndex
+
+    -- * UpdateSpreadsheetPropertiesRequest
+    , UpdateSpreadsheetPropertiesRequest
+    , updateSpreadsheetPropertiesRequest
+    , uFields
+    , uProperties
+
+    -- * AddProtectedRangeResponse
+    , AddProtectedRangeResponse
+    , addProtectedRangeResponse
+    , aProtectedRange
+
+    -- * AppendDimensionRequest
+    , AppendDimensionRequest
+    , appendDimensionRequest
+    , adrLength
+    , adrDimension
+    , adrSheetId
+
+    -- * PivotValue
+    , PivotValue
+    , pivotValue
+    , pvSourceColumnOffSet
+    , pvFormula
+    , pvName
+    , pvSummarizeFunction
+
+    -- * UnmergeCellsRequest
+    , UnmergeCellsRequest
+    , unmergeCellsRequest
+    , ucrRange
+
+    -- * DeleteSheetRequest
+    , DeleteSheetRequest
+    , deleteSheetRequest
+    , dsrSheetId
+
+    -- * BooleanConditionType
+    , BooleanConditionType (..)
+
+    -- * UpdateBOrdersRequest
+    , UpdateBOrdersRequest
+    , updateBOrdersRequest
+    , uborBottom
+    , uborInnerHorizontal
+    , uborLeft
+    , uborInnerVertical
+    , uborRange
+    , uborRight
+    , uborTop
+
+    -- * ValueRangeMajorDimension
+    , ValueRangeMajorDimension (..)
+
+    -- * PivotGroupSortOrder
+    , PivotGroupSortOrder (..)
+
+    -- * BasicChartSpecChartType
+    , BasicChartSpecChartType (..)
+
+    -- * EmbeddedChart
+    , EmbeddedChart
+    , embeddedChart
+    , ecSpec
+    , ecPosition
+    , ecChartId
+
+    -- * RowData
+    , RowData
+    , rowData
+    , rdValues
+
+    -- * Editors
+    , Editors
+    , editors
+    , eGroups
+    , eUsers
+    , eDomainUsersCanEdit
+
+    -- * Xgafv
+    , Xgafv (..)
+
+    -- * PivotTable
+    , PivotTable
+    , pivotTable
+    , ptValues
+    , ptValueLayout
+    , ptRows
+    , ptSource
+    , ptColumns
+    , ptCriteria
+
+    -- * EmbeddedObjectPosition
+    , EmbeddedObjectPosition
+    , embeddedObjectPosition
+    , eopOverlayPosition
+    , eopSheetId
+    , eopNewSheet
+
+    -- * BasicFilter
+    , BasicFilter
+    , basicFilter
+    , bfSortSpecs
+    , bfRange
+    , bfCriteria
+
+    -- * TextToColumnsRequest
+    , TextToColumnsRequest
+    , textToColumnsRequest
+    , ttcrDelimiterType
+    , ttcrSource
+    , ttcrDelimiter
+
+    -- * SpreadsheetPropertiesAutoRecalc
+    , SpreadsheetPropertiesAutoRecalc (..)
+
+    -- * CopyPasteRequestPasteOrientation
+    , CopyPasteRequestPasteOrientation (..)
+
+    -- * BatchUpdateSpreadsheetRequest
+    , BatchUpdateSpreadsheetRequest
+    , batchUpdateSpreadsheetRequest
+    , busrRequests
+
+    -- * PasteDataRequestType
+    , PasteDataRequestType (..)
+
+    -- * UpdateValuesResponse
+    , UpdateValuesResponse
+    , updateValuesResponse
+    , uvrUpdatedCells
+    , uvrSpreadsheetId
+    , uvrUpdatedRows
+    , uvrUpdatedRange
+    , uvrUpdatedColumns
+
+    -- * CopySheetToAnotherSpreadsheetRequest
+    , CopySheetToAnotherSpreadsheetRequest
+    , copySheetToAnotherSpreadsheetRequest
+    , cstasrDestinationSpreadsheetId
+
+    -- * AddFilterViewRequest
+    , AddFilterViewRequest
+    , addFilterViewRequest
+    , aFilter
+
+    -- * PivotGroupValueMetadata
+    , PivotGroupValueMetadata
+    , pivotGroupValueMetadata
+    , pgvmValue
+    , pgvmCollapsed
+
+    -- * CellFormatTextDirection
+    , CellFormatTextDirection (..)
+
+    -- * BasicChartSeriesType
+    , BasicChartSeriesType (..)
+
+    -- * UpdateCellsRequest
+    , UpdateCellsRequest
+    , updateCellsRequest
+    , updStart
+    , updRows
+    , updRange
+    , updFields
+
+    -- * CellFormat
+    , CellFormat
+    , cellFormat
+    , cfBOrders
+    , cfVerticalAlignment
+    , cfBackgRoundColor
+    , cfHyperlinkDisplayType
+    , cfWrapStrategy
+    , cfNumberFormat
+    , cfTextDirection
+    , cfTextFormat
+    , cfHorizontalAlignment
+    , cfPadding
+
+    -- * DeleteProtectedRangeRequest
+    , DeleteProtectedRangeRequest
+    , deleteProtectedRangeRequest
+    , dprrProtectedRangeId
+
+    -- * UpdateProtectedRangeRequest
+    , UpdateProtectedRangeRequest
+    , updateProtectedRangeRequest
+    , uprrProtectedRange
+    , uprrFields
+
+    -- * AddSheetResponse
+    , AddSheetResponse
+    , addSheetResponse
+    , aProperties
+
+    -- * ProtectedRange
+    , ProtectedRange
+    , protectedRange
+    , prProtectedRangeId
+    , prWarningOnly
+    , prNamedRangeId
+    , prRange
+    , prEditors
+    , prUnprotectedRanges
+    , prRequestingUserCanEdit
+    , prDescription
+
+    -- * BasicChartAxis
+    , BasicChartAxis
+    , basicChartAxis
+    , bcaFormat
+    , bcaTitle
+    , bcaPosition
+
+    -- * GridData
+    , GridData
+    , gridData
+    , gdRowMetadata
+    , gdStartRow
+    , gdRowData
+    , gdColumnMetadata
+    , gdStartColumn
+
+    -- * NumberFormat
+    , NumberFormat
+    , numberFormat
+    , nfPattern
+    , nfType
+
+    -- * BatchUpdateSpreadsheetResponse
+    , BatchUpdateSpreadsheetResponse
+    , batchUpdateSpreadsheetResponse
+    , busrSpreadsheetId
+    , busrReplies
+
+    -- * SetDataValidationRequest
+    , SetDataValidationRequest
+    , setDataValidationRequest
+    , sdvrRule
+    , sdvrRange
+
+    -- * ChartSpecHiddenDimensionStrategy
+    , ChartSpecHiddenDimensionStrategy (..)
+
+    -- * DuplicateFilterViewRequest
+    , DuplicateFilterViewRequest
+    , duplicateFilterViewRequest
+    , dFilterId
+
+    -- * BOrderStyle
+    , BOrderStyle (..)
+
+    -- * PivotGroup
+    , PivotGroup
+    , pivotGroup
+    , pgValueMetadata
+    , pgSourceColumnOffSet
+    , pgSortOrder
+    , pgShowTotals
+    , pgValueBucket
+
+    -- * CutPasteRequestPasteType
+    , CutPasteRequestPasteType (..)
+
+    -- * BasicChartSpecLegendPosition
+    , BasicChartSpecLegendPosition (..)
+
+    -- * ErrorValueType
+    , ErrorValueType (..)
+
+    -- * ConditionalFormatRule
+    , ConditionalFormatRule
+    , conditionalFormatRule
+    , cfrBooleanRule
+    , cfrGradientRule
+    , cfrRanges
+
+    -- * BasicChartSpec
+    , BasicChartSpec
+    , basicChartSpec
+    , bHeaderCount
+    , bLegendPosition
+    , bSeries
+    , bChartType
+    , bDomains
+    , bAxis
+
+    -- * AddConditionalFormatRuleRequest
+    , AddConditionalFormatRuleRequest
+    , addConditionalFormatRuleRequest
+    , acfrrRule
+    , acfrrIndex
+
+    -- * PivotTableValueLayout
+    , PivotTableValueLayout (..)
+
+    -- * DuplicateSheetResponse
+    , DuplicateSheetResponse
+    , duplicateSheetResponse
+    , dsrProperties
+
+    -- * TextFormat
+    , TextFormat
+    , textFormat
+    , tfFontFamily
+    , tfForegRoundColor
+    , tfFontSize
+    , tfUnderline
+    , tfItalic
+    , tfBold
+    , tfStrikethrough
+
+    -- * BasicChartDomain
+    , BasicChartDomain
+    , basicChartDomain
+    , bcdDomain
+
+    -- * InterpolationPointType
+    , InterpolationPointType (..)
+
+    -- * TextToColumnsRequestDelimiterType
+    , TextToColumnsRequestDelimiterType (..)
+
+    -- * Padding
+    , Padding
+    , padding
+    , pBottom
+    , pLeft
+    , pRight
+    , pTop
+
+    -- * ChartSpec
+    , ChartSpec
+    , chartSpec
+    , csTitle
+    , csPieChart
+    , csBasicChart
+    , csHiddenDimensionStrategy
+
+    -- * DimensionProperties
+    , DimensionProperties
+    , dimensionProperties
+    , dpHiddenByFilter
+    , dpPixelSize
+    , dpHiddenByUser
+
+    -- * BatchGetValuesResponse
+    , BatchGetValuesResponse
+    , batchGetValuesResponse
+    , bgvrSpreadsheetId
+    , bgvrValueRanges
+
+    -- * Request'
+    , Request'
+    , request'
+    , reqAddFilterView
+    , reqDeleteProtectedRange
+    , reqUpdateProtectedRange
+    , reqUpdateCells
+    , reqDuplicateFilterView
+    , reqAddConditionalFormatRule
+    , reqSortRange
+    , reqUpdateNamedRange
+    , reqDeleteNamedRange
+    , reqClearBasicFilter
+    , reqAppendCells
+    , reqPasteData
+    , reqUpdateEmbeddedObjectPosition
+    , reqCopyPaste
+    , reqAutoResizeDimensions
+    , reqAddSheet
+    , reqFindReplace
+    , reqDeleteDimension
+    , reqCutPaste
+    , reqMoveDimension
+    , reqRepeatCell
+    , reqAddProtectedRange
+    , reqUpdateFilterView
+    , reqDeleteFilterView
+    , reqInsertDimension
+    , reqUpdateSheetProperties
+    , reqDeleteConditionalFormatRule
+    , reqUpdateConditionalFormatRule
+    , reqDeleteEmbeddedObject
+    , reqMergeCells
+    , reqAddNamedRange
+    , reqAddChart
+    , reqDuplicateSheet
+    , reqAutoFill
+    , reqUpdateDimensionProperties
+    , reqUpdateChartSpec
+    , reqSetBasicFilter
+    , reqTextToColumns
+    , reqUpdateSpreadsheetProperties
+    , reqDeleteSheet
+    , reqUnmergeCells
+    , reqUpdateBOrders
+    , reqAppendDimension
+    , reqSetDataValidation
+
+    -- * DeleteConditionalFormatRuleResponse
+    , DeleteConditionalFormatRuleResponse
+    , deleteConditionalFormatRuleResponse
+    , dcfrrRule
+
+    -- * UpdateConditionalFormatRuleResponse
+    , UpdateConditionalFormatRuleResponse
+    , updateConditionalFormatRuleResponse
+    , uNewRule
+    , uNewIndex
+    , uOldIndex
+    , uOldRule
+    ) where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types.Product
+import           Network.Google.Sheets.Types.Sum
+
+-- | Default request referring to version 'v4' of the Google Sheets API. This contains the host and root path used as a starting point for constructing service requests.
+sheetsService :: ServiceConfig
+sheetsService
+  = defaultService (ServiceId "sheets:v4")
+      "sheets.googleapis.com"
+
+-- | View your Google Spreadsheets
+spreadsheetsReadOnlyScope :: Proxy '["https://www.googleapis.com/auth/spreadsheets.readonly"]
+spreadsheetsReadOnlyScope = Proxy;
+
+-- | View the files in your Google Drive
+driveReadOnlyScope :: Proxy '["https://www.googleapis.com/auth/drive.readonly"]
+driveReadOnlyScope = Proxy;
+
+-- | View and manage the files in your Google Drive
+driveScope :: Proxy '["https://www.googleapis.com/auth/drive"]
+driveScope = Proxy;
+
+-- | View and manage your spreadsheets in Google Drive
+spreadsheetsScope :: Proxy '["https://www.googleapis.com/auth/spreadsheets"]
+spreadsheetsScope = Proxy;
diff --git a/gen/Network/Google/Sheets/Types/Product.hs b/gen/Network/Google/Sheets/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Sheets/Types/Product.hs
@@ -0,0 +1,8212 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Sheets.Types.Product
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.Sheets.Types.Product where
+
+import           Network.Google.Prelude
+import           Network.Google.Sheets.Types.Sum
+
+-- | Information about which values in a pivot group should be used for
+-- sorting.
+--
+-- /See:/ 'pivotGroupSortValueBucket' smart constructor.
+data PivotGroupSortValueBucket = PivotGroupSortValueBucket'
+    { _pgsvbBuckets     :: !(Maybe [ExtendedValue])
+    , _pgsvbValuesIndex :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotGroupSortValueBucket' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pgsvbBuckets'
+--
+-- * 'pgsvbValuesIndex'
+pivotGroupSortValueBucket
+    :: PivotGroupSortValueBucket
+pivotGroupSortValueBucket =
+    PivotGroupSortValueBucket'
+    { _pgsvbBuckets = Nothing
+    , _pgsvbValuesIndex = Nothing
+    }
+
+-- | Determines the bucket from which values are chosen to sort. For example,
+-- in a pivot table with one row group & two column groups, the row group
+-- can list up to two values. The first value corresponds to a value within
+-- the first column group, and the second value corresponds to a value in
+-- the second column group. If no values are listed, this would indicate
+-- that the row should be sorted according to the \"Grand Total\" over the
+-- column groups. If a single value is listed, this would correspond to
+-- using the \"Total\" of that bucket.
+pgsvbBuckets :: Lens' PivotGroupSortValueBucket [ExtendedValue]
+pgsvbBuckets
+  = lens _pgsvbBuckets (\ s a -> s{_pgsvbBuckets = a})
+      . _Default
+      . _Coerce
+
+-- | The offset in the PivotTable.values list which the values in this
+-- grouping should be sorted by.
+pgsvbValuesIndex :: Lens' PivotGroupSortValueBucket (Maybe Int32)
+pgsvbValuesIndex
+  = lens _pgsvbValuesIndex
+      (\ s a -> s{_pgsvbValuesIndex = a})
+      . mapping _Coerce
+
+instance FromJSON PivotGroupSortValueBucket where
+        parseJSON
+          = withObject "PivotGroupSortValueBucket"
+              (\ o ->
+                 PivotGroupSortValueBucket' <$>
+                   (o .:? "buckets" .!= mempty) <*>
+                     (o .:? "valuesIndex"))
+
+instance ToJSON PivotGroupSortValueBucket where
+        toJSON PivotGroupSortValueBucket'{..}
+          = object
+              (catMaybes
+                 [("buckets" .=) <$> _pgsvbBuckets,
+                  ("valuesIndex" .=) <$> _pgsvbValuesIndex])
+
+-- | Data within a range of the spreadsheet.
+--
+-- /See:/ 'valueRange' smart constructor.
+data ValueRange = ValueRange'
+    { _vrValues         :: !(Maybe [[JSONValue]])
+    , _vrRange          :: !(Maybe Text)
+    , _vrMajorDimension :: !(Maybe ValueRangeMajorDimension)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ValueRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vrValues'
+--
+-- * 'vrRange'
+--
+-- * 'vrMajorDimension'
+valueRange
+    :: ValueRange
+valueRange =
+    ValueRange'
+    { _vrValues = Nothing
+    , _vrRange = Nothing
+    , _vrMajorDimension = Nothing
+    }
+
+-- | The data that was read or to be written. This is an array of arrays, the
+-- outer array representing all the data and each inner array representing
+-- a major dimension. Each item in the inner array corresponds with one
+-- cell. For output, empty trailing rows and columns will not be included.
+-- For input, supported value types are: bool, string, and double. Null
+-- values will be skipped. To set a cell to an empty value, set the string
+-- value to an empty string.
+vrValues :: Lens' ValueRange [[JSONValue]]
+vrValues
+  = lens _vrValues (\ s a -> s{_vrValues = a}) .
+      _Default
+      . _Coerce
+
+-- | The range the values cover, in A1 notation. For output, this range
+-- indicates the entire requested range, even though the values will
+-- exclude trailing rows and columns.
+vrRange :: Lens' ValueRange (Maybe Text)
+vrRange = lens _vrRange (\ s a -> s{_vrRange = a})
+
+-- | The major dimension of the values. For output, if the spreadsheet data
+-- is: \`A1=1,B1=2,A2=3,B2=4\`, then requesting
+-- \`range=A1:B2,majorDimension=ROWS\` will return \`[[1,2],[3,4]]\`,
+-- whereas requesting \`range=A1:B2,majorDimension=COLUMNS\` will return
+-- \`[[1,3],[2,4]]\`. For input, with \`range=A1:B2,majorDimension=ROWS\`
+-- then \`[[1,2],[3,4]]\` will set \`A1=1,B1=2,A2=3,B2=4\`. With
+-- \`range=A1:B2,majorDimension=COLUMNS\` then \`[[1,2],[3,4]]\` will set
+-- \`A1=1,B1=3,A2=2,B2=4\`. When writing, if this field is not set, it
+-- defaults to ROWS.
+vrMajorDimension :: Lens' ValueRange (Maybe ValueRangeMajorDimension)
+vrMajorDimension
+  = lens _vrMajorDimension
+      (\ s a -> s{_vrMajorDimension = a})
+
+instance FromJSON ValueRange where
+        parseJSON
+          = withObject "ValueRange"
+              (\ o ->
+                 ValueRange' <$>
+                   (o .:? "values" .!= mempty) <*> (o .:? "range") <*>
+                     (o .:? "majorDimension"))
+
+instance ToJSON ValueRange where
+        toJSON ValueRange'{..}
+          = object
+              (catMaybes
+                 [("values" .=) <$> _vrValues,
+                  ("range" .=) <$> _vrRange,
+                  ("majorDimension" .=) <$> _vrMajorDimension])
+
+-- | Sorts data in rows based on a sort order per column.
+--
+-- /See:/ 'sortRangeRequest' smart constructor.
+data SortRangeRequest = SortRangeRequest'
+    { _srrSortSpecs :: !(Maybe [SortSpec])
+    , _srrRange     :: !(Maybe GridRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SortRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'srrSortSpecs'
+--
+-- * 'srrRange'
+sortRangeRequest
+    :: SortRangeRequest
+sortRangeRequest =
+    SortRangeRequest'
+    { _srrSortSpecs = Nothing
+    , _srrRange = Nothing
+    }
+
+-- | The sort order per column. Later specifications are used when values are
+-- equal in the earlier specifications.
+srrSortSpecs :: Lens' SortRangeRequest [SortSpec]
+srrSortSpecs
+  = lens _srrSortSpecs (\ s a -> s{_srrSortSpecs = a})
+      . _Default
+      . _Coerce
+
+-- | The range to sort.
+srrRange :: Lens' SortRangeRequest (Maybe GridRange)
+srrRange = lens _srrRange (\ s a -> s{_srrRange = a})
+
+instance FromJSON SortRangeRequest where
+        parseJSON
+          = withObject "SortRangeRequest"
+              (\ o ->
+                 SortRangeRequest' <$>
+                   (o .:? "sortSpecs" .!= mempty) <*> (o .:? "range"))
+
+instance ToJSON SortRangeRequest where
+        toJSON SortRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("sortSpecs" .=) <$> _srrSortSpecs,
+                  ("range" .=) <$> _srrRange])
+
+-- | Removes the named range with the given ID from the spreadsheet.
+--
+-- /See:/ 'deleteNamedRangeRequest' smart constructor.
+newtype DeleteNamedRangeRequest = DeleteNamedRangeRequest'
+    { _dnrrNamedRangeId :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteNamedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dnrrNamedRangeId'
+deleteNamedRangeRequest
+    :: DeleteNamedRangeRequest
+deleteNamedRangeRequest =
+    DeleteNamedRangeRequest'
+    { _dnrrNamedRangeId = Nothing
+    }
+
+-- | The ID of the named range to delete.
+dnrrNamedRangeId :: Lens' DeleteNamedRangeRequest (Maybe Text)
+dnrrNamedRangeId
+  = lens _dnrrNamedRangeId
+      (\ s a -> s{_dnrrNamedRangeId = a})
+
+instance FromJSON DeleteNamedRangeRequest where
+        parseJSON
+          = withObject "DeleteNamedRangeRequest"
+              (\ o ->
+                 DeleteNamedRangeRequest' <$> (o .:? "namedRangeId"))
+
+instance ToJSON DeleteNamedRangeRequest where
+        toJSON DeleteNamedRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("namedRangeId" .=) <$> _dnrrNamedRangeId])
+
+-- | Updates properties of the named range with the specified namedRangeId.
+--
+-- /See:/ 'updateNamedRangeRequest' smart constructor.
+data UpdateNamedRangeRequest = UpdateNamedRangeRequest'
+    { _unrrNamedRange :: !(Maybe NamedRange)
+    , _unrrFields     :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateNamedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'unrrNamedRange'
+--
+-- * 'unrrFields'
+updateNamedRangeRequest
+    :: UpdateNamedRangeRequest
+updateNamedRangeRequest =
+    UpdateNamedRangeRequest'
+    { _unrrNamedRange = Nothing
+    , _unrrFields = Nothing
+    }
+
+-- | The named range to update with the new properties.
+unrrNamedRange :: Lens' UpdateNamedRangeRequest (Maybe NamedRange)
+unrrNamedRange
+  = lens _unrrNamedRange
+      (\ s a -> s{_unrrNamedRange = a})
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`namedRange\` is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+unrrFields :: Lens' UpdateNamedRangeRequest (Maybe FieldMask)
+unrrFields
+  = lens _unrrFields (\ s a -> s{_unrrFields = a})
+
+instance FromJSON UpdateNamedRangeRequest where
+        parseJSON
+          = withObject "UpdateNamedRangeRequest"
+              (\ o ->
+                 UpdateNamedRangeRequest' <$>
+                   (o .:? "namedRange") <*> (o .:? "fields"))
+
+instance ToJSON UpdateNamedRangeRequest where
+        toJSON UpdateNamedRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("namedRange" .=) <$> _unrrNamedRange,
+                  ("fields" .=) <$> _unrrFields])
+
+-- | The data included in a domain or series.
+--
+-- /See:/ 'chartData' smart constructor.
+newtype ChartData = ChartData'
+    { _cdSourceRange :: Maybe ChartSourceRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ChartData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdSourceRange'
+chartData
+    :: ChartData
+chartData =
+    ChartData'
+    { _cdSourceRange = Nothing
+    }
+
+-- | The source ranges of the data.
+cdSourceRange :: Lens' ChartData (Maybe ChartSourceRange)
+cdSourceRange
+  = lens _cdSourceRange
+      (\ s a -> s{_cdSourceRange = a})
+
+instance FromJSON ChartData where
+        parseJSON
+          = withObject "ChartData"
+              (\ o -> ChartData' <$> (o .:? "sourceRange"))
+
+instance ToJSON ChartData where
+        toJSON ChartData'{..}
+          = object
+              (catMaybes [("sourceRange" .=) <$> _cdSourceRange])
+
+-- | Properties of a spreadsheet.
+--
+-- /See:/ 'spreadsheetProperties' smart constructor.
+data SpreadsheetProperties = SpreadsheetProperties'
+    { _spDefaultFormat :: !(Maybe CellFormat)
+    , _spLocale        :: !(Maybe Text)
+    , _spAutoRecalc    :: !(Maybe SpreadsheetPropertiesAutoRecalc)
+    , _spTitle         :: !(Maybe Text)
+    , _spTimeZone      :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SpreadsheetProperties' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'spDefaultFormat'
+--
+-- * 'spLocale'
+--
+-- * 'spAutoRecalc'
+--
+-- * 'spTitle'
+--
+-- * 'spTimeZone'
+spreadsheetProperties
+    :: SpreadsheetProperties
+spreadsheetProperties =
+    SpreadsheetProperties'
+    { _spDefaultFormat = Nothing
+    , _spLocale = Nothing
+    , _spAutoRecalc = Nothing
+    , _spTitle = Nothing
+    , _spTimeZone = Nothing
+    }
+
+-- | The default format of all cells in the spreadsheet.
+-- CellData.effectiveFormat will not be set if the cell\'s format is equal
+-- to this default format. This field is read-only.
+spDefaultFormat :: Lens' SpreadsheetProperties (Maybe CellFormat)
+spDefaultFormat
+  = lens _spDefaultFormat
+      (\ s a -> s{_spDefaultFormat = a})
+
+-- | The locale of the spreadsheet in one of the following formats: * an ISO
+-- 639-1 language code such as \`en\` * an ISO 639-2 language code such as
+-- \`fil\`, if no 639-1 code exists * a combination of the ISO language
+-- code and country code, such as \`en_US\` Note: when updating this field,
+-- not all locales\/languages are supported.
+spLocale :: Lens' SpreadsheetProperties (Maybe Text)
+spLocale = lens _spLocale (\ s a -> s{_spLocale = a})
+
+-- | The amount of time to wait before volatile functions are recalculated.
+spAutoRecalc :: Lens' SpreadsheetProperties (Maybe SpreadsheetPropertiesAutoRecalc)
+spAutoRecalc
+  = lens _spAutoRecalc (\ s a -> s{_spAutoRecalc = a})
+
+-- | The title of the spreadsheet.
+spTitle :: Lens' SpreadsheetProperties (Maybe Text)
+spTitle = lens _spTitle (\ s a -> s{_spTitle = a})
+
+-- | The time zone of the spreadsheet, in CLDR format such as
+-- \`America\/New_York\`. If the time zone isn\'t recognized, this may be a
+-- custom time zone such as \`GMT-07:00\`.
+spTimeZone :: Lens' SpreadsheetProperties (Maybe Text)
+spTimeZone
+  = lens _spTimeZone (\ s a -> s{_spTimeZone = a})
+
+instance FromJSON SpreadsheetProperties where
+        parseJSON
+          = withObject "SpreadsheetProperties"
+              (\ o ->
+                 SpreadsheetProperties' <$>
+                   (o .:? "defaultFormat") <*> (o .:? "locale") <*>
+                     (o .:? "autoRecalc")
+                     <*> (o .:? "title")
+                     <*> (o .:? "timeZone"))
+
+instance ToJSON SpreadsheetProperties where
+        toJSON SpreadsheetProperties'{..}
+          = object
+              (catMaybes
+                 [("defaultFormat" .=) <$> _spDefaultFormat,
+                  ("locale" .=) <$> _spLocale,
+                  ("autoRecalc" .=) <$> _spAutoRecalc,
+                  ("title" .=) <$> _spTitle,
+                  ("timeZone" .=) <$> _spTimeZone])
+
+-- | The borders of the cell.
+--
+-- /See:/ 'bOrders' smart constructor.
+data BOrders = BOrders'
+    { _boBottom :: !(Maybe BOrder)
+    , _boLeft   :: !(Maybe BOrder)
+    , _boRight  :: !(Maybe BOrder)
+    , _boTop    :: !(Maybe BOrder)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BOrders' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'boBottom'
+--
+-- * 'boLeft'
+--
+-- * 'boRight'
+--
+-- * 'boTop'
+bOrders
+    :: BOrders
+bOrders =
+    BOrders'
+    { _boBottom = Nothing
+    , _boLeft = Nothing
+    , _boRight = Nothing
+    , _boTop = Nothing
+    }
+
+-- | The bottom border of the cell.
+boBottom :: Lens' BOrders (Maybe BOrder)
+boBottom = lens _boBottom (\ s a -> s{_boBottom = a})
+
+-- | The left border of the cell.
+boLeft :: Lens' BOrders (Maybe BOrder)
+boLeft = lens _boLeft (\ s a -> s{_boLeft = a})
+
+-- | The right border of the cell.
+boRight :: Lens' BOrders (Maybe BOrder)
+boRight = lens _boRight (\ s a -> s{_boRight = a})
+
+-- | The top border of the cell.
+boTop :: Lens' BOrders (Maybe BOrder)
+boTop = lens _boTop (\ s a -> s{_boTop = a})
+
+instance FromJSON BOrders where
+        parseJSON
+          = withObject "BOrders"
+              (\ o ->
+                 BOrders' <$>
+                   (o .:? "bottom") <*> (o .:? "left") <*>
+                     (o .:? "right")
+                     <*> (o .:? "top"))
+
+instance ToJSON BOrders where
+        toJSON BOrders'{..}
+          = object
+              (catMaybes
+                 [("bottom" .=) <$> _boBottom,
+                  ("left" .=) <$> _boLeft, ("right" .=) <$> _boRight,
+                  ("top" .=) <$> _boTop])
+
+-- | A run of a text format. The format of this run continues until the start
+-- index of the next run. When updating, all fields must be set.
+--
+-- /See:/ 'textFormatRun' smart constructor.
+data TextFormatRun = TextFormatRun'
+    { _tfrFormat     :: !(Maybe TextFormat)
+    , _tfrStartIndex :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextFormatRun' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tfrFormat'
+--
+-- * 'tfrStartIndex'
+textFormatRun
+    :: TextFormatRun
+textFormatRun =
+    TextFormatRun'
+    { _tfrFormat = Nothing
+    , _tfrStartIndex = Nothing
+    }
+
+-- | The format of this run. Absent values inherit the cell\'s format.
+tfrFormat :: Lens' TextFormatRun (Maybe TextFormat)
+tfrFormat
+  = lens _tfrFormat (\ s a -> s{_tfrFormat = a})
+
+-- | The character index where this run starts.
+tfrStartIndex :: Lens' TextFormatRun (Maybe Int32)
+tfrStartIndex
+  = lens _tfrStartIndex
+      (\ s a -> s{_tfrStartIndex = a})
+      . mapping _Coerce
+
+instance FromJSON TextFormatRun where
+        parseJSON
+          = withObject "TextFormatRun"
+              (\ o ->
+                 TextFormatRun' <$>
+                   (o .:? "format") <*> (o .:? "startIndex"))
+
+instance ToJSON TextFormatRun where
+        toJSON TextFormatRun'{..}
+          = object
+              (catMaybes
+                 [("format" .=) <$> _tfrFormat,
+                  ("startIndex" .=) <$> _tfrStartIndex])
+
+-- | Adds a new sheet. When a sheet is added at a given index, all subsequent
+-- sheets\' indexes are incremented. To add an object sheet, use
+-- AddChartRequest instead and specify EmbeddedObjectPosition.sheetId or
+-- EmbeddedObjectPosition.newSheet.
+--
+-- /See:/ 'addSheetRequest' smart constructor.
+newtype AddSheetRequest = AddSheetRequest'
+    { _asrProperties :: Maybe SheetProperties
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddSheetRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'asrProperties'
+addSheetRequest
+    :: AddSheetRequest
+addSheetRequest =
+    AddSheetRequest'
+    { _asrProperties = Nothing
+    }
+
+-- | The properties the new sheet should have. All properties are optional.
+-- If a sheetId is specified, the sheet will use that ID. (It is an error
+-- to specify the ID of a sheet that already exists.)
+asrProperties :: Lens' AddSheetRequest (Maybe SheetProperties)
+asrProperties
+  = lens _asrProperties
+      (\ s a -> s{_asrProperties = a})
+
+instance FromJSON AddSheetRequest where
+        parseJSON
+          = withObject "AddSheetRequest"
+              (\ o -> AddSheetRequest' <$> (o .:? "properties"))
+
+instance ToJSON AddSheetRequest where
+        toJSON AddSheetRequest'{..}
+          = object
+              (catMaybes [("properties" .=) <$> _asrProperties])
+
+-- | A sort order associated with a specific column or row.
+--
+-- /See:/ 'sortSpec' smart constructor.
+data SortSpec = SortSpec'
+    { _ssSortOrder      :: !(Maybe SortSpecSortOrder)
+    , _ssDimensionIndex :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SortSpec' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssSortOrder'
+--
+-- * 'ssDimensionIndex'
+sortSpec
+    :: SortSpec
+sortSpec =
+    SortSpec'
+    { _ssSortOrder = Nothing
+    , _ssDimensionIndex = Nothing
+    }
+
+-- | The order data should be sorted.
+ssSortOrder :: Lens' SortSpec (Maybe SortSpecSortOrder)
+ssSortOrder
+  = lens _ssSortOrder (\ s a -> s{_ssSortOrder = a})
+
+-- | The dimension the sort should be applied to.
+ssDimensionIndex :: Lens' SortSpec (Maybe Int32)
+ssDimensionIndex
+  = lens _ssDimensionIndex
+      (\ s a -> s{_ssDimensionIndex = a})
+      . mapping _Coerce
+
+instance FromJSON SortSpec where
+        parseJSON
+          = withObject "SortSpec"
+              (\ o ->
+                 SortSpec' <$>
+                   (o .:? "sortOrder") <*> (o .:? "dimensionIndex"))
+
+instance ToJSON SortSpec where
+        toJSON SortSpec'{..}
+          = object
+              (catMaybes
+                 [("sortOrder" .=) <$> _ssSortOrder,
+                  ("dimensionIndex" .=) <$> _ssDimensionIndex])
+
+-- | Copies data from the source to the destination.
+--
+-- /See:/ 'copyPasteRequest' smart constructor.
+data CopyPasteRequest = CopyPasteRequest'
+    { _cprDestination      :: !(Maybe GridRange)
+    , _cprSource           :: !(Maybe GridRange)
+    , _cprPasteOrientation :: !(Maybe CopyPasteRequestPasteOrientation)
+    , _cprPasteType        :: !(Maybe CopyPasteRequestPasteType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CopyPasteRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cprDestination'
+--
+-- * 'cprSource'
+--
+-- * 'cprPasteOrientation'
+--
+-- * 'cprPasteType'
+copyPasteRequest
+    :: CopyPasteRequest
+copyPasteRequest =
+    CopyPasteRequest'
+    { _cprDestination = Nothing
+    , _cprSource = Nothing
+    , _cprPasteOrientation = Nothing
+    , _cprPasteType = Nothing
+    }
+
+-- | The location to paste to. If the range covers a span that\'s a multiple
+-- of the source\'s height or width, then the data will be repeated to fill
+-- in the destination range. If the range is smaller than the source range,
+-- the entire source data will still be copied (beyond the end of the
+-- destination range).
+cprDestination :: Lens' CopyPasteRequest (Maybe GridRange)
+cprDestination
+  = lens _cprDestination
+      (\ s a -> s{_cprDestination = a})
+
+-- | The source range to copy.
+cprSource :: Lens' CopyPasteRequest (Maybe GridRange)
+cprSource
+  = lens _cprSource (\ s a -> s{_cprSource = a})
+
+-- | How that data should be oriented when pasting.
+cprPasteOrientation :: Lens' CopyPasteRequest (Maybe CopyPasteRequestPasteOrientation)
+cprPasteOrientation
+  = lens _cprPasteOrientation
+      (\ s a -> s{_cprPasteOrientation = a})
+
+-- | What kind of data to paste.
+cprPasteType :: Lens' CopyPasteRequest (Maybe CopyPasteRequestPasteType)
+cprPasteType
+  = lens _cprPasteType (\ s a -> s{_cprPasteType = a})
+
+instance FromJSON CopyPasteRequest where
+        parseJSON
+          = withObject "CopyPasteRequest"
+              (\ o ->
+                 CopyPasteRequest' <$>
+                   (o .:? "destination") <*> (o .:? "source") <*>
+                     (o .:? "pasteOrientation")
+                     <*> (o .:? "pasteType"))
+
+instance ToJSON CopyPasteRequest where
+        toJSON CopyPasteRequest'{..}
+          = object
+              (catMaybes
+                 [("destination" .=) <$> _cprDestination,
+                  ("source" .=) <$> _cprSource,
+                  ("pasteOrientation" .=) <$> _cprPasteOrientation,
+                  ("pasteType" .=) <$> _cprPasteType])
+
+-- | A range on a sheet. All indexes are zero-based. Indexes are half open,
+-- e.g the start index is inclusive and the end index is exclusive --
+-- [start_index, end_index). Missing indexes indicate the range is
+-- unbounded on that side. For example, if \`\"Sheet1\"\` is sheet ID 0,
+-- then: \`Sheet1!A1:A1 == sheet_id: 0, start_row_index: 0, end_row_index:
+-- 1, start_column_index: 0, end_column_index: 1\` \`Sheet1!A3:B4 ==
+-- sheet_id: 0, start_row_index: 2, end_row_index: 4, start_column_index:
+-- 0, end_column_index: 2\` \`Sheet1!A:B == sheet_id: 0,
+-- start_column_index: 0, end_column_index: 2\` \`Sheet1!A5:B == sheet_id:
+-- 0, start_row_index: 4, start_column_index: 0, end_column_index: 2\`
+-- \`Sheet1 == sheet_id:0\` The start index must always be less than or
+-- equal to the end index. If the start index equals the end index, then
+-- the range is empty. Empty ranges are typically not meaningful and are
+-- usually rendered in the UI as \`#REF!\`.
+--
+-- /See:/ 'gridRange' smart constructor.
+data GridRange = GridRange'
+    { _grEndColumnIndex   :: !(Maybe (Textual Int32))
+    , _grStartColumnIndex :: !(Maybe (Textual Int32))
+    , _grEndRowIndex      :: !(Maybe (Textual Int32))
+    , _grStartRowIndex    :: !(Maybe (Textual Int32))
+    , _grSheetId          :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GridRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grEndColumnIndex'
+--
+-- * 'grStartColumnIndex'
+--
+-- * 'grEndRowIndex'
+--
+-- * 'grStartRowIndex'
+--
+-- * 'grSheetId'
+gridRange
+    :: GridRange
+gridRange =
+    GridRange'
+    { _grEndColumnIndex = Nothing
+    , _grStartColumnIndex = Nothing
+    , _grEndRowIndex = Nothing
+    , _grStartRowIndex = Nothing
+    , _grSheetId = Nothing
+    }
+
+-- | The end column (exclusive) of the range, or not set if unbounded.
+grEndColumnIndex :: Lens' GridRange (Maybe Int32)
+grEndColumnIndex
+  = lens _grEndColumnIndex
+      (\ s a -> s{_grEndColumnIndex = a})
+      . mapping _Coerce
+
+-- | The start column (inclusive) of the range, or not set if unbounded.
+grStartColumnIndex :: Lens' GridRange (Maybe Int32)
+grStartColumnIndex
+  = lens _grStartColumnIndex
+      (\ s a -> s{_grStartColumnIndex = a})
+      . mapping _Coerce
+
+-- | The end row (exclusive) of the range, or not set if unbounded.
+grEndRowIndex :: Lens' GridRange (Maybe Int32)
+grEndRowIndex
+  = lens _grEndRowIndex
+      (\ s a -> s{_grEndRowIndex = a})
+      . mapping _Coerce
+
+-- | The start row (inclusive) of the range, or not set if unbounded.
+grStartRowIndex :: Lens' GridRange (Maybe Int32)
+grStartRowIndex
+  = lens _grStartRowIndex
+      (\ s a -> s{_grStartRowIndex = a})
+      . mapping _Coerce
+
+-- | The sheet this range is on.
+grSheetId :: Lens' GridRange (Maybe Int32)
+grSheetId
+  = lens _grSheetId (\ s a -> s{_grSheetId = a}) .
+      mapping _Coerce
+
+instance FromJSON GridRange where
+        parseJSON
+          = withObject "GridRange"
+              (\ o ->
+                 GridRange' <$>
+                   (o .:? "endColumnIndex") <*>
+                     (o .:? "startColumnIndex")
+                     <*> (o .:? "endRowIndex")
+                     <*> (o .:? "startRowIndex")
+                     <*> (o .:? "sheetId"))
+
+instance ToJSON GridRange where
+        toJSON GridRange'{..}
+          = object
+              (catMaybes
+                 [("endColumnIndex" .=) <$> _grEndColumnIndex,
+                  ("startColumnIndex" .=) <$> _grStartColumnIndex,
+                  ("endRowIndex" .=) <$> _grEndRowIndex,
+                  ("startRowIndex" .=) <$> _grStartRowIndex,
+                  ("sheetId" .=) <$> _grSheetId])
+
+-- | The result of adding a filter view.
+--
+-- /See:/ 'addFilterViewResponse' smart constructor.
+newtype AddFilterViewResponse = AddFilterViewResponse'
+    { _afvrFilter :: Maybe FilterView
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddFilterViewResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'afvrFilter'
+addFilterViewResponse
+    :: AddFilterViewResponse
+addFilterViewResponse =
+    AddFilterViewResponse'
+    { _afvrFilter = Nothing
+    }
+
+-- | The newly added filter view.
+afvrFilter :: Lens' AddFilterViewResponse (Maybe FilterView)
+afvrFilter
+  = lens _afvrFilter (\ s a -> s{_afvrFilter = a})
+
+instance FromJSON AddFilterViewResponse where
+        parseJSON
+          = withObject "AddFilterViewResponse"
+              (\ o -> AddFilterViewResponse' <$> (o .:? "filter"))
+
+instance ToJSON AddFilterViewResponse where
+        toJSON AddFilterViewResponse'{..}
+          = object (catMaybes [("filter" .=) <$> _afvrFilter])
+
+-- | A condition that can evaluate to true or false. BooleanConditions are
+-- used by conditional formatting, data validation, and the criteria in
+-- filters.
+--
+-- /See:/ 'booleanCondition' smart constructor.
+data BooleanCondition = BooleanCondition'
+    { _bcValues :: !(Maybe [ConditionValue])
+    , _bcType   :: !(Maybe BooleanConditionType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BooleanCondition' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcValues'
+--
+-- * 'bcType'
+booleanCondition
+    :: BooleanCondition
+booleanCondition =
+    BooleanCondition'
+    { _bcValues = Nothing
+    , _bcType = Nothing
+    }
+
+-- | The values of the condition. The number of supported values depends on
+-- the condition type. Some support zero values, others one or two values,
+-- and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
+bcValues :: Lens' BooleanCondition [ConditionValue]
+bcValues
+  = lens _bcValues (\ s a -> s{_bcValues = a}) .
+      _Default
+      . _Coerce
+
+-- | The type of condition.
+bcType :: Lens' BooleanCondition (Maybe BooleanConditionType)
+bcType = lens _bcType (\ s a -> s{_bcType = a})
+
+instance FromJSON BooleanCondition where
+        parseJSON
+          = withObject "BooleanCondition"
+              (\ o ->
+                 BooleanCondition' <$>
+                   (o .:? "values" .!= mempty) <*> (o .:? "type"))
+
+instance ToJSON BooleanCondition where
+        toJSON BooleanCondition'{..}
+          = object
+              (catMaybes
+                 [("values" .=) <$> _bcValues,
+                  ("type" .=) <$> _bcType])
+
+-- | Automatically resizes one or more dimensions based on the contents of
+-- the cells in that dimension.
+--
+-- /See:/ 'autoResizeDimensionsRequest' smart constructor.
+newtype AutoResizeDimensionsRequest = AutoResizeDimensionsRequest'
+    { _ardrDimensions :: Maybe DimensionRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AutoResizeDimensionsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ardrDimensions'
+autoResizeDimensionsRequest
+    :: AutoResizeDimensionsRequest
+autoResizeDimensionsRequest =
+    AutoResizeDimensionsRequest'
+    { _ardrDimensions = Nothing
+    }
+
+-- | The dimensions to automatically resize. Only COLUMNS are supported.
+ardrDimensions :: Lens' AutoResizeDimensionsRequest (Maybe DimensionRange)
+ardrDimensions
+  = lens _ardrDimensions
+      (\ s a -> s{_ardrDimensions = a})
+
+instance FromJSON AutoResizeDimensionsRequest where
+        parseJSON
+          = withObject "AutoResizeDimensionsRequest"
+              (\ o ->
+                 AutoResizeDimensionsRequest' <$>
+                   (o .:? "dimensions"))
+
+instance ToJSON AutoResizeDimensionsRequest where
+        toJSON AutoResizeDimensionsRequest'{..}
+          = object
+              (catMaybes [("dimensions" .=) <$> _ardrDimensions])
+
+-- | A sheet in a spreadsheet.
+--
+-- /See:/ 'sheet' smart constructor.
+data Sheet = Sheet'
+    { _sData               :: !(Maybe [GridData])
+    , _sMerges             :: !(Maybe [GridRange])
+    , _sProtectedRanges    :: !(Maybe [ProtectedRange])
+    , _sCharts             :: !(Maybe [EmbeddedChart])
+    , _sBasicFilter        :: !(Maybe BasicFilter)
+    , _sConditionalFormats :: !(Maybe [ConditionalFormatRule])
+    , _sFilterViews        :: !(Maybe [FilterView])
+    , _sProperties         :: !(Maybe SheetProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Sheet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sData'
+--
+-- * 'sMerges'
+--
+-- * 'sProtectedRanges'
+--
+-- * 'sCharts'
+--
+-- * 'sBasicFilter'
+--
+-- * 'sConditionalFormats'
+--
+-- * 'sFilterViews'
+--
+-- * 'sProperties'
+sheet
+    :: Sheet
+sheet =
+    Sheet'
+    { _sData = Nothing
+    , _sMerges = Nothing
+    , _sProtectedRanges = Nothing
+    , _sCharts = Nothing
+    , _sBasicFilter = Nothing
+    , _sConditionalFormats = Nothing
+    , _sFilterViews = Nothing
+    , _sProperties = Nothing
+    }
+
+-- | Data in the grid, if this is a grid sheet. The number of GridData
+-- objects returned is dependent on the number of ranges requested on this
+-- sheet. For example, if this is representing \`Sheet1\`, and the
+-- spreadsheet was requested with ranges \`Sheet1!A1:C10\` and
+-- \`Sheet1!D15:E20\`, then the first GridData will have a
+-- startRow\/startColumn of \`0\`, while the second one will have
+-- \`startRow 14\` (zero-based row 15), and \`startColumn 3\` (zero-based
+-- column D).
+sData :: Lens' Sheet [GridData]
+sData
+  = lens _sData (\ s a -> s{_sData = a}) . _Default .
+      _Coerce
+
+-- | The ranges that are merged together.
+sMerges :: Lens' Sheet [GridRange]
+sMerges
+  = lens _sMerges (\ s a -> s{_sMerges = a}) . _Default
+      . _Coerce
+
+-- | The protected ranges in this sheet.
+sProtectedRanges :: Lens' Sheet [ProtectedRange]
+sProtectedRanges
+  = lens _sProtectedRanges
+      (\ s a -> s{_sProtectedRanges = a})
+      . _Default
+      . _Coerce
+
+-- | The specifications of every chart on this sheet.
+sCharts :: Lens' Sheet [EmbeddedChart]
+sCharts
+  = lens _sCharts (\ s a -> s{_sCharts = a}) . _Default
+      . _Coerce
+
+-- | The filter on this sheet, if any.
+sBasicFilter :: Lens' Sheet (Maybe BasicFilter)
+sBasicFilter
+  = lens _sBasicFilter (\ s a -> s{_sBasicFilter = a})
+
+-- | The conditional format rules in this sheet.
+sConditionalFormats :: Lens' Sheet [ConditionalFormatRule]
+sConditionalFormats
+  = lens _sConditionalFormats
+      (\ s a -> s{_sConditionalFormats = a})
+      . _Default
+      . _Coerce
+
+-- | The filter views in this sheet.
+sFilterViews :: Lens' Sheet [FilterView]
+sFilterViews
+  = lens _sFilterViews (\ s a -> s{_sFilterViews = a})
+      . _Default
+      . _Coerce
+
+-- | The properties of the sheet.
+sProperties :: Lens' Sheet (Maybe SheetProperties)
+sProperties
+  = lens _sProperties (\ s a -> s{_sProperties = a})
+
+instance FromJSON Sheet where
+        parseJSON
+          = withObject "Sheet"
+              (\ o ->
+                 Sheet' <$>
+                   (o .:? "data" .!= mempty) <*>
+                     (o .:? "merges" .!= mempty)
+                     <*> (o .:? "protectedRanges" .!= mempty)
+                     <*> (o .:? "charts" .!= mempty)
+                     <*> (o .:? "basicFilter")
+                     <*> (o .:? "conditionalFormats" .!= mempty)
+                     <*> (o .:? "filterViews" .!= mempty)
+                     <*> (o .:? "properties"))
+
+instance ToJSON Sheet where
+        toJSON Sheet'{..}
+          = object
+              (catMaybes
+                 [("data" .=) <$> _sData, ("merges" .=) <$> _sMerges,
+                  ("protectedRanges" .=) <$> _sProtectedRanges,
+                  ("charts" .=) <$> _sCharts,
+                  ("basicFilter" .=) <$> _sBasicFilter,
+                  ("conditionalFormats" .=) <$> _sConditionalFormats,
+                  ("filterViews" .=) <$> _sFilterViews,
+                  ("properties" .=) <$> _sProperties])
+
+-- | A coordinate in a sheet. All indexes are zero-based.
+--
+-- /See:/ 'gridCoordinate' smart constructor.
+data GridCoordinate = GridCoordinate'
+    { _gcColumnIndex :: !(Maybe (Textual Int32))
+    , _gcRowIndex    :: !(Maybe (Textual Int32))
+    , _gcSheetId     :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GridCoordinate' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gcColumnIndex'
+--
+-- * 'gcRowIndex'
+--
+-- * 'gcSheetId'
+gridCoordinate
+    :: GridCoordinate
+gridCoordinate =
+    GridCoordinate'
+    { _gcColumnIndex = Nothing
+    , _gcRowIndex = Nothing
+    , _gcSheetId = Nothing
+    }
+
+-- | The column index of the coordinate.
+gcColumnIndex :: Lens' GridCoordinate (Maybe Int32)
+gcColumnIndex
+  = lens _gcColumnIndex
+      (\ s a -> s{_gcColumnIndex = a})
+      . mapping _Coerce
+
+-- | The row index of the coordinate.
+gcRowIndex :: Lens' GridCoordinate (Maybe Int32)
+gcRowIndex
+  = lens _gcRowIndex (\ s a -> s{_gcRowIndex = a}) .
+      mapping _Coerce
+
+-- | The sheet this coordinate is on.
+gcSheetId :: Lens' GridCoordinate (Maybe Int32)
+gcSheetId
+  = lens _gcSheetId (\ s a -> s{_gcSheetId = a}) .
+      mapping _Coerce
+
+instance FromJSON GridCoordinate where
+        parseJSON
+          = withObject "GridCoordinate"
+              (\ o ->
+                 GridCoordinate' <$>
+                   (o .:? "columnIndex") <*> (o .:? "rowIndex") <*>
+                     (o .:? "sheetId"))
+
+instance ToJSON GridCoordinate where
+        toJSON GridCoordinate'{..}
+          = object
+              (catMaybes
+                 [("columnIndex" .=) <$> _gcColumnIndex,
+                  ("rowIndex" .=) <$> _gcRowIndex,
+                  ("sheetId" .=) <$> _gcSheetId])
+
+-- | Clears the basic filter, if any exists on the sheet.
+--
+-- /See:/ 'clearBasicFilterRequest' smart constructor.
+newtype ClearBasicFilterRequest = ClearBasicFilterRequest'
+    { _cbfrSheetId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ClearBasicFilterRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cbfrSheetId'
+clearBasicFilterRequest
+    :: ClearBasicFilterRequest
+clearBasicFilterRequest =
+    ClearBasicFilterRequest'
+    { _cbfrSheetId = Nothing
+    }
+
+-- | The sheet ID on which the basic filter should be cleared.
+cbfrSheetId :: Lens' ClearBasicFilterRequest (Maybe Int32)
+cbfrSheetId
+  = lens _cbfrSheetId (\ s a -> s{_cbfrSheetId = a}) .
+      mapping _Coerce
+
+instance FromJSON ClearBasicFilterRequest where
+        parseJSON
+          = withObject "ClearBasicFilterRequest"
+              (\ o ->
+                 ClearBasicFilterRequest' <$> (o .:? "sheetId"))
+
+instance ToJSON ClearBasicFilterRequest where
+        toJSON ClearBasicFilterRequest'{..}
+          = object
+              (catMaybes [("sheetId" .=) <$> _cbfrSheetId])
+
+-- | Update an embedded object\'s position (such as a moving or resizing a
+-- chart or image).
+--
+-- /See:/ 'updateEmbeddedObjectPositionRequest' smart constructor.
+data UpdateEmbeddedObjectPositionRequest = UpdateEmbeddedObjectPositionRequest'
+    { _ueoprNewPosition :: !(Maybe EmbeddedObjectPosition)
+    , _ueoprObjectId    :: !(Maybe (Textual Int32))
+    , _ueoprFields      :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEmbeddedObjectPositionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ueoprNewPosition'
+--
+-- * 'ueoprObjectId'
+--
+-- * 'ueoprFields'
+updateEmbeddedObjectPositionRequest
+    :: UpdateEmbeddedObjectPositionRequest
+updateEmbeddedObjectPositionRequest =
+    UpdateEmbeddedObjectPositionRequest'
+    { _ueoprNewPosition = Nothing
+    , _ueoprObjectId = Nothing
+    , _ueoprFields = Nothing
+    }
+
+-- | An explicit position to move the embedded object to. If
+-- newPosition.sheetId is set, a new sheet with that ID will be created. If
+-- newPosition.newSheet is set to true, a new sheet will be created with an
+-- ID that will be chosen for you.
+ueoprNewPosition :: Lens' UpdateEmbeddedObjectPositionRequest (Maybe EmbeddedObjectPosition)
+ueoprNewPosition
+  = lens _ueoprNewPosition
+      (\ s a -> s{_ueoprNewPosition = a})
+
+-- | The ID of the object to moved.
+ueoprObjectId :: Lens' UpdateEmbeddedObjectPositionRequest (Maybe Int32)
+ueoprObjectId
+  = lens _ueoprObjectId
+      (\ s a -> s{_ueoprObjectId = a})
+      . mapping _Coerce
+
+-- | The fields of OverlayPosition that should be updated when setting a new
+-- position. Used only if newPosition.overlayPosition is set, in which case
+-- at least one field must be specified. The root
+-- \`newPosition.overlayPosition\` is implied and should not be specified.
+-- A single \`\"*\"\` can be used as short-hand for listing every field.
+ueoprFields :: Lens' UpdateEmbeddedObjectPositionRequest (Maybe FieldMask)
+ueoprFields
+  = lens _ueoprFields (\ s a -> s{_ueoprFields = a})
+
+instance FromJSON UpdateEmbeddedObjectPositionRequest
+         where
+        parseJSON
+          = withObject "UpdateEmbeddedObjectPositionRequest"
+              (\ o ->
+                 UpdateEmbeddedObjectPositionRequest' <$>
+                   (o .:? "newPosition") <*> (o .:? "objectId") <*>
+                     (o .:? "fields"))
+
+instance ToJSON UpdateEmbeddedObjectPositionRequest
+         where
+        toJSON UpdateEmbeddedObjectPositionRequest'{..}
+          = object
+              (catMaybes
+                 [("newPosition" .=) <$> _ueoprNewPosition,
+                  ("objectId" .=) <$> _ueoprObjectId,
+                  ("fields" .=) <$> _ueoprFields])
+
+-- | A rule that may or may not match, depending on the condition.
+--
+-- /See:/ 'booleanRule' smart constructor.
+data BooleanRule = BooleanRule'
+    { _brFormat    :: !(Maybe CellFormat)
+    , _brCondition :: !(Maybe BooleanCondition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BooleanRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'brFormat'
+--
+-- * 'brCondition'
+booleanRule
+    :: BooleanRule
+booleanRule =
+    BooleanRule'
+    { _brFormat = Nothing
+    , _brCondition = Nothing
+    }
+
+-- | The format to apply. Conditional formatting can only apply a subset of
+-- formatting: bold, italic, strikethrough, foreground color & background
+-- color.
+brFormat :: Lens' BooleanRule (Maybe CellFormat)
+brFormat = lens _brFormat (\ s a -> s{_brFormat = a})
+
+-- | The condition of the rule. If the condition evaluates to true, the
+-- format will be applied.
+brCondition :: Lens' BooleanRule (Maybe BooleanCondition)
+brCondition
+  = lens _brCondition (\ s a -> s{_brCondition = a})
+
+instance FromJSON BooleanRule where
+        parseJSON
+          = withObject "BooleanRule"
+              (\ o ->
+                 BooleanRule' <$>
+                   (o .:? "format") <*> (o .:? "condition"))
+
+instance ToJSON BooleanRule where
+        toJSON BooleanRule'{..}
+          = object
+              (catMaybes
+                 [("format" .=) <$> _brFormat,
+                  ("condition" .=) <$> _brCondition])
+
+-- | A combination of a source range and how to extend that source.
+--
+-- /See:/ 'sourceAndDestination' smart constructor.
+data SourceAndDestination = SourceAndDestination'
+    { _sadDimension  :: !(Maybe SourceAndDestinationDimension)
+    , _sadSource     :: !(Maybe GridRange)
+    , _sadFillLength :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SourceAndDestination' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sadDimension'
+--
+-- * 'sadSource'
+--
+-- * 'sadFillLength'
+sourceAndDestination
+    :: SourceAndDestination
+sourceAndDestination =
+    SourceAndDestination'
+    { _sadDimension = Nothing
+    , _sadSource = Nothing
+    , _sadFillLength = Nothing
+    }
+
+-- | The dimension that data should be filled into.
+sadDimension :: Lens' SourceAndDestination (Maybe SourceAndDestinationDimension)
+sadDimension
+  = lens _sadDimension (\ s a -> s{_sadDimension = a})
+
+-- | The location of the data to use as the source of the autofill.
+sadSource :: Lens' SourceAndDestination (Maybe GridRange)
+sadSource
+  = lens _sadSource (\ s a -> s{_sadSource = a})
+
+-- | The number of rows or columns that data should be filled into. Positive
+-- numbers expand beyond the last row or last column of the source.
+-- Negative numbers expand before the first row or first column of the
+-- source.
+sadFillLength :: Lens' SourceAndDestination (Maybe Int32)
+sadFillLength
+  = lens _sadFillLength
+      (\ s a -> s{_sadFillLength = a})
+      . mapping _Coerce
+
+instance FromJSON SourceAndDestination where
+        parseJSON
+          = withObject "SourceAndDestination"
+              (\ o ->
+                 SourceAndDestination' <$>
+                   (o .:? "dimension") <*> (o .:? "source") <*>
+                     (o .:? "fillLength"))
+
+instance ToJSON SourceAndDestination where
+        toJSON SourceAndDestination'{..}
+          = object
+              (catMaybes
+                 [("dimension" .=) <$> _sadDimension,
+                  ("source" .=) <$> _sadSource,
+                  ("fillLength" .=) <$> _sadFillLength])
+
+-- | Inserts data into the spreadsheet starting at the specified coordinate.
+--
+-- /See:/ 'pasteDataRequest' smart constructor.
+data PasteDataRequest = PasteDataRequest'
+    { _pdrData       :: !(Maybe Text)
+    , _pdrCoordinate :: !(Maybe GridCoordinate)
+    , _pdrHTML       :: !(Maybe Bool)
+    , _pdrType       :: !(Maybe PasteDataRequestType)
+    , _pdrDelimiter  :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PasteDataRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pdrData'
+--
+-- * 'pdrCoordinate'
+--
+-- * 'pdrHTML'
+--
+-- * 'pdrType'
+--
+-- * 'pdrDelimiter'
+pasteDataRequest
+    :: PasteDataRequest
+pasteDataRequest =
+    PasteDataRequest'
+    { _pdrData = Nothing
+    , _pdrCoordinate = Nothing
+    , _pdrHTML = Nothing
+    , _pdrType = Nothing
+    , _pdrDelimiter = Nothing
+    }
+
+-- | The data to insert.
+pdrData :: Lens' PasteDataRequest (Maybe Text)
+pdrData = lens _pdrData (\ s a -> s{_pdrData = a})
+
+-- | The coordinate at which the data should start being inserted.
+pdrCoordinate :: Lens' PasteDataRequest (Maybe GridCoordinate)
+pdrCoordinate
+  = lens _pdrCoordinate
+      (\ s a -> s{_pdrCoordinate = a})
+
+-- | True if the data is HTML.
+pdrHTML :: Lens' PasteDataRequest (Maybe Bool)
+pdrHTML = lens _pdrHTML (\ s a -> s{_pdrHTML = a})
+
+-- | How the data should be pasted.
+pdrType :: Lens' PasteDataRequest (Maybe PasteDataRequestType)
+pdrType = lens _pdrType (\ s a -> s{_pdrType = a})
+
+-- | The delimiter in the data.
+pdrDelimiter :: Lens' PasteDataRequest (Maybe Text)
+pdrDelimiter
+  = lens _pdrDelimiter (\ s a -> s{_pdrDelimiter = a})
+
+instance FromJSON PasteDataRequest where
+        parseJSON
+          = withObject "PasteDataRequest"
+              (\ o ->
+                 PasteDataRequest' <$>
+                   (o .:? "data") <*> (o .:? "coordinate") <*>
+                     (o .:? "html")
+                     <*> (o .:? "type")
+                     <*> (o .:? "delimiter"))
+
+instance ToJSON PasteDataRequest where
+        toJSON PasteDataRequest'{..}
+          = object
+              (catMaybes
+                 [("data" .=) <$> _pdrData,
+                  ("coordinate" .=) <$> _pdrCoordinate,
+                  ("html" .=) <$> _pdrHTML, ("type" .=) <$> _pdrType,
+                  ("delimiter" .=) <$> _pdrDelimiter])
+
+-- | Adds new cells after the last row with data in a sheet, inserting new
+-- rows into the sheet if necessary.
+--
+-- /See:/ 'appendCellsRequest' smart constructor.
+data AppendCellsRequest = AppendCellsRequest'
+    { _acrRows    :: !(Maybe [RowData])
+    , _acrSheetId :: !(Maybe (Textual Int32))
+    , _acrFields  :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AppendCellsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acrRows'
+--
+-- * 'acrSheetId'
+--
+-- * 'acrFields'
+appendCellsRequest
+    :: AppendCellsRequest
+appendCellsRequest =
+    AppendCellsRequest'
+    { _acrRows = Nothing
+    , _acrSheetId = Nothing
+    , _acrFields = Nothing
+    }
+
+-- | The data to append.
+acrRows :: Lens' AppendCellsRequest [RowData]
+acrRows
+  = lens _acrRows (\ s a -> s{_acrRows = a}) . _Default
+      . _Coerce
+
+-- | The sheet ID to append the data to.
+acrSheetId :: Lens' AppendCellsRequest (Maybe Int32)
+acrSheetId
+  = lens _acrSheetId (\ s a -> s{_acrSheetId = a}) .
+      mapping _Coerce
+
+-- | The fields of CellData that should be updated. At least one field must
+-- be specified. The root is the CellData; \'row.values.\' should not be
+-- specified. A single \`\"*\"\` can be used as short-hand for listing
+-- every field.
+acrFields :: Lens' AppendCellsRequest (Maybe FieldMask)
+acrFields
+  = lens _acrFields (\ s a -> s{_acrFields = a})
+
+instance FromJSON AppendCellsRequest where
+        parseJSON
+          = withObject "AppendCellsRequest"
+              (\ o ->
+                 AppendCellsRequest' <$>
+                   (o .:? "rows" .!= mempty) <*> (o .:? "sheetId") <*>
+                     (o .:? "fields"))
+
+instance ToJSON AppendCellsRequest where
+        toJSON AppendCellsRequest'{..}
+          = object
+              (catMaybes
+                 [("rows" .=) <$> _acrRows,
+                  ("sheetId" .=) <$> _acrSheetId,
+                  ("fields" .=) <$> _acrFields])
+
+-- | The result of the find\/replace.
+--
+-- /See:/ 'findReplaceResponse' smart constructor.
+data FindReplaceResponse = FindReplaceResponse'
+    { _frrValuesChanged      :: !(Maybe (Textual Int32))
+    , _frrFormulasChanged    :: !(Maybe (Textual Int32))
+    , _frrRowsChanged        :: !(Maybe (Textual Int32))
+    , _frrSheetsChanged      :: !(Maybe (Textual Int32))
+    , _frrOccurrencesChanged :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FindReplaceResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'frrValuesChanged'
+--
+-- * 'frrFormulasChanged'
+--
+-- * 'frrRowsChanged'
+--
+-- * 'frrSheetsChanged'
+--
+-- * 'frrOccurrencesChanged'
+findReplaceResponse
+    :: FindReplaceResponse
+findReplaceResponse =
+    FindReplaceResponse'
+    { _frrValuesChanged = Nothing
+    , _frrFormulasChanged = Nothing
+    , _frrRowsChanged = Nothing
+    , _frrSheetsChanged = Nothing
+    , _frrOccurrencesChanged = Nothing
+    }
+
+-- | The number of non-formula cells changed.
+frrValuesChanged :: Lens' FindReplaceResponse (Maybe Int32)
+frrValuesChanged
+  = lens _frrValuesChanged
+      (\ s a -> s{_frrValuesChanged = a})
+      . mapping _Coerce
+
+-- | The number of formula cells changed.
+frrFormulasChanged :: Lens' FindReplaceResponse (Maybe Int32)
+frrFormulasChanged
+  = lens _frrFormulasChanged
+      (\ s a -> s{_frrFormulasChanged = a})
+      . mapping _Coerce
+
+-- | The number of rows changed.
+frrRowsChanged :: Lens' FindReplaceResponse (Maybe Int32)
+frrRowsChanged
+  = lens _frrRowsChanged
+      (\ s a -> s{_frrRowsChanged = a})
+      . mapping _Coerce
+
+-- | The number of sheets changed.
+frrSheetsChanged :: Lens' FindReplaceResponse (Maybe Int32)
+frrSheetsChanged
+  = lens _frrSheetsChanged
+      (\ s a -> s{_frrSheetsChanged = a})
+      . mapping _Coerce
+
+-- | The number of occurrences (possibly multiple within a cell) changed. For
+-- example, if replacing \`\"e\"\` with \`\"o\"\` in \`\"Google Sheets\"\`,
+-- this would be \`\"3\"\` because \`\"Google Sheets\"\` -> \`\"Googlo
+-- Shoots\"\`.
+frrOccurrencesChanged :: Lens' FindReplaceResponse (Maybe Int32)
+frrOccurrencesChanged
+  = lens _frrOccurrencesChanged
+      (\ s a -> s{_frrOccurrencesChanged = a})
+      . mapping _Coerce
+
+instance FromJSON FindReplaceResponse where
+        parseJSON
+          = withObject "FindReplaceResponse"
+              (\ o ->
+                 FindReplaceResponse' <$>
+                   (o .:? "valuesChanged") <*> (o .:? "formulasChanged")
+                     <*> (o .:? "rowsChanged")
+                     <*> (o .:? "sheetsChanged")
+                     <*> (o .:? "occurrencesChanged"))
+
+instance ToJSON FindReplaceResponse where
+        toJSON FindReplaceResponse'{..}
+          = object
+              (catMaybes
+                 [("valuesChanged" .=) <$> _frrValuesChanged,
+                  ("formulasChanged" .=) <$> _frrFormulasChanged,
+                  ("rowsChanged" .=) <$> _frrRowsChanged,
+                  ("sheetsChanged" .=) <$> _frrSheetsChanged,
+                  ("occurrencesChanged" .=) <$>
+                    _frrOccurrencesChanged])
+
+-- | A </chart/interactive/docs/gallery/piechart pie chart>.
+--
+-- /See:/ 'pieChartSpec' smart constructor.
+data PieChartSpec = PieChartSpec'
+    { _pcsPieHole          :: !(Maybe (Textual Double))
+    , _pcsLegendPosition   :: !(Maybe PieChartSpecLegendPosition)
+    , _pcsDomain           :: !(Maybe ChartData)
+    , _pcsSeries           :: !(Maybe ChartData)
+    , _pcsThreeDimensional :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PieChartSpec' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pcsPieHole'
+--
+-- * 'pcsLegendPosition'
+--
+-- * 'pcsDomain'
+--
+-- * 'pcsSeries'
+--
+-- * 'pcsThreeDimensional'
+pieChartSpec
+    :: PieChartSpec
+pieChartSpec =
+    PieChartSpec'
+    { _pcsPieHole = Nothing
+    , _pcsLegendPosition = Nothing
+    , _pcsDomain = Nothing
+    , _pcsSeries = Nothing
+    , _pcsThreeDimensional = Nothing
+    }
+
+-- | The size of the hole in the pie chart.
+pcsPieHole :: Lens' PieChartSpec (Maybe Double)
+pcsPieHole
+  = lens _pcsPieHole (\ s a -> s{_pcsPieHole = a}) .
+      mapping _Coerce
+
+-- | Where the legend of the pie chart should be drawn.
+pcsLegendPosition :: Lens' PieChartSpec (Maybe PieChartSpecLegendPosition)
+pcsLegendPosition
+  = lens _pcsLegendPosition
+      (\ s a -> s{_pcsLegendPosition = a})
+
+-- | The data that covers the domain of the pie chart.
+pcsDomain :: Lens' PieChartSpec (Maybe ChartData)
+pcsDomain
+  = lens _pcsDomain (\ s a -> s{_pcsDomain = a})
+
+-- | The data that covers the one and only series of the pie chart.
+pcsSeries :: Lens' PieChartSpec (Maybe ChartData)
+pcsSeries
+  = lens _pcsSeries (\ s a -> s{_pcsSeries = a})
+
+-- | True if the pie is three dimensional.
+pcsThreeDimensional :: Lens' PieChartSpec (Maybe Bool)
+pcsThreeDimensional
+  = lens _pcsThreeDimensional
+      (\ s a -> s{_pcsThreeDimensional = a})
+
+instance FromJSON PieChartSpec where
+        parseJSON
+          = withObject "PieChartSpec"
+              (\ o ->
+                 PieChartSpec' <$>
+                   (o .:? "pieHole") <*> (o .:? "legendPosition") <*>
+                     (o .:? "domain")
+                     <*> (o .:? "series")
+                     <*> (o .:? "threeDimensional"))
+
+instance ToJSON PieChartSpec where
+        toJSON PieChartSpec'{..}
+          = object
+              (catMaybes
+                 [("pieHole" .=) <$> _pcsPieHole,
+                  ("legendPosition" .=) <$> _pcsLegendPosition,
+                  ("domain" .=) <$> _pcsDomain,
+                  ("series" .=) <$> _pcsSeries,
+                  ("threeDimensional" .=) <$> _pcsThreeDimensional])
+
+-- | A data validation rule.
+--
+-- /See:/ 'dataValidationRule' smart constructor.
+data DataValidationRule = DataValidationRule'
+    { _dvrShowCustomUi :: !(Maybe Bool)
+    , _dvrInputMessage :: !(Maybe Text)
+    , _dvrStrict       :: !(Maybe Bool)
+    , _dvrCondition    :: !(Maybe BooleanCondition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DataValidationRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dvrShowCustomUi'
+--
+-- * 'dvrInputMessage'
+--
+-- * 'dvrStrict'
+--
+-- * 'dvrCondition'
+dataValidationRule
+    :: DataValidationRule
+dataValidationRule =
+    DataValidationRule'
+    { _dvrShowCustomUi = Nothing
+    , _dvrInputMessage = Nothing
+    , _dvrStrict = Nothing
+    , _dvrCondition = Nothing
+    }
+
+-- | True if the UI should be customized based on the kind of condition. If
+-- true, \"List\" conditions will show a dropdown.
+dvrShowCustomUi :: Lens' DataValidationRule (Maybe Bool)
+dvrShowCustomUi
+  = lens _dvrShowCustomUi
+      (\ s a -> s{_dvrShowCustomUi = a})
+
+-- | A message to show the user when adding data to the cell.
+dvrInputMessage :: Lens' DataValidationRule (Maybe Text)
+dvrInputMessage
+  = lens _dvrInputMessage
+      (\ s a -> s{_dvrInputMessage = a})
+
+-- | True if invalid data should be rejected.
+dvrStrict :: Lens' DataValidationRule (Maybe Bool)
+dvrStrict
+  = lens _dvrStrict (\ s a -> s{_dvrStrict = a})
+
+-- | The condition that data in the cell must match.
+dvrCondition :: Lens' DataValidationRule (Maybe BooleanCondition)
+dvrCondition
+  = lens _dvrCondition (\ s a -> s{_dvrCondition = a})
+
+instance FromJSON DataValidationRule where
+        parseJSON
+          = withObject "DataValidationRule"
+              (\ o ->
+                 DataValidationRule' <$>
+                   (o .:? "showCustomUi") <*> (o .:? "inputMessage") <*>
+                     (o .:? "strict")
+                     <*> (o .:? "condition"))
+
+instance ToJSON DataValidationRule where
+        toJSON DataValidationRule'{..}
+          = object
+              (catMaybes
+                 [("showCustomUi" .=) <$> _dvrShowCustomUi,
+                  ("inputMessage" .=) <$> _dvrInputMessage,
+                  ("strict" .=) <$> _dvrStrict,
+                  ("condition" .=) <$> _dvrCondition])
+
+-- | A filter view.
+--
+-- /See:/ 'filterView' smart constructor.
+data FilterView = FilterView'
+    { _fvSortSpecs    :: !(Maybe [SortSpec])
+    , _fvNamedRangeId :: !(Maybe Text)
+    , _fvRange        :: !(Maybe GridRange)
+    , _fvFilterViewId :: !(Maybe (Textual Int32))
+    , _fvTitle        :: !(Maybe Text)
+    , _fvCriteria     :: !(Maybe FilterViewCriteria)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FilterView' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fvSortSpecs'
+--
+-- * 'fvNamedRangeId'
+--
+-- * 'fvRange'
+--
+-- * 'fvFilterViewId'
+--
+-- * 'fvTitle'
+--
+-- * 'fvCriteria'
+filterView
+    :: FilterView
+filterView =
+    FilterView'
+    { _fvSortSpecs = Nothing
+    , _fvNamedRangeId = Nothing
+    , _fvRange = Nothing
+    , _fvFilterViewId = Nothing
+    , _fvTitle = Nothing
+    , _fvCriteria = Nothing
+    }
+
+-- | The sort order per column. Later specifications are used when values are
+-- equal in the earlier specifications.
+fvSortSpecs :: Lens' FilterView [SortSpec]
+fvSortSpecs
+  = lens _fvSortSpecs (\ s a -> s{_fvSortSpecs = a}) .
+      _Default
+      . _Coerce
+
+-- | The named range this filter view is backed by, if any. When writing,
+-- only one of range or named_range_id may be set.
+fvNamedRangeId :: Lens' FilterView (Maybe Text)
+fvNamedRangeId
+  = lens _fvNamedRangeId
+      (\ s a -> s{_fvNamedRangeId = a})
+
+-- | The range this filter view covers. When writing, only one of range or
+-- named_range_id may be set.
+fvRange :: Lens' FilterView (Maybe GridRange)
+fvRange = lens _fvRange (\ s a -> s{_fvRange = a})
+
+-- | The ID of the filter view.
+fvFilterViewId :: Lens' FilterView (Maybe Int32)
+fvFilterViewId
+  = lens _fvFilterViewId
+      (\ s a -> s{_fvFilterViewId = a})
+      . mapping _Coerce
+
+-- | The name of the filter view.
+fvTitle :: Lens' FilterView (Maybe Text)
+fvTitle = lens _fvTitle (\ s a -> s{_fvTitle = a})
+
+-- | The criteria for showing\/hiding values per column. The map\'s key is
+-- the column index, and the value is the criteria for that column.
+fvCriteria :: Lens' FilterView (Maybe FilterViewCriteria)
+fvCriteria
+  = lens _fvCriteria (\ s a -> s{_fvCriteria = a})
+
+instance FromJSON FilterView where
+        parseJSON
+          = withObject "FilterView"
+              (\ o ->
+                 FilterView' <$>
+                   (o .:? "sortSpecs" .!= mempty) <*>
+                     (o .:? "namedRangeId")
+                     <*> (o .:? "range")
+                     <*> (o .:? "filterViewId")
+                     <*> (o .:? "title")
+                     <*> (o .:? "criteria"))
+
+instance ToJSON FilterView where
+        toJSON FilterView'{..}
+          = object
+              (catMaybes
+                 [("sortSpecs" .=) <$> _fvSortSpecs,
+                  ("namedRangeId" .=) <$> _fvNamedRangeId,
+                  ("range" .=) <$> _fvRange,
+                  ("filterViewId" .=) <$> _fvFilterViewId,
+                  ("title" .=) <$> _fvTitle,
+                  ("criteria" .=) <$> _fvCriteria])
+
+-- | Represents a color in the RGBA color space. This representation is
+-- designed for simplicity of conversion to\/from color representations in
+-- various languages over compactness; for example, the fields of this
+-- representation can be trivially provided to the constructor of
+-- \"java.awt.Color\" in Java; it can also be trivially provided to
+-- UIColor\'s \"+colorWithRed:green:blue:alpha\" method in iOS; and, with
+-- just a little work, it can be easily formatted into a CSS \"rgba()\"
+-- string in JavaScript, as well. Here are some examples: Example (Java):
+-- import com.google.type.Color; \/\/ ... public static java.awt.Color
+-- fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ?
+-- protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color(
+-- protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(),
+-- alpha); } public static Color toProto(java.awt.Color color) { float red
+-- = (float) color.getRed(); float green = (float) color.getGreen(); float
+-- blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder
+-- resultBuilder = Color .newBuilder() .setRed(red \/ denominator)
+-- .setGreen(green \/ denominator) .setBlue(blue \/ denominator); int alpha
+-- = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue
+-- .newBuilder() .setValue(((float) alpha) \/ denominator) .build()); }
+-- return resultBuilder.build(); } \/\/ ... Example (iOS \/ Obj-C): \/\/
+-- ... static UIColor* fromProto(Color* protocolor) { float red =
+-- [protocolor red]; float green = [protocolor green]; float blue =
+-- [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float
+-- alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value];
+-- } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; }
+-- static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha;
+-- if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) { return
+-- nil; } Color* result = [Color alloc] init]; [result setRed:red]; [result
+-- setGreen:green]; [result setBlue:blue]; if (alpha \<= 0.9999) { [result
+-- setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return
+-- result; } \/\/ ... Example (JavaScript): \/\/ ... var protoToCssColor =
+-- function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac
+-- = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red
+-- = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255);
+-- var blue = Math.floor(blueFrac * 255); if (!(\'alpha\' in rgb_color)) {
+-- return rgbToCssColor_(red, green, blue); } var alphaFrac =
+-- rgb_color.alpha.value || 0.0; var rgbParams = [red, green,
+-- blue].join(\',\'); return [\'rgba(\', rgbParams, \',\', alphaFrac,
+-- \')\'].join(\'\'); }; var rgbToCssColor_ = function(red, green, blue) {
+-- var rgbNumber = new Number((red \<\< 16) | (green \<\< 8) | blue); var
+-- hexString = rgbNumber.toString(16); var missingZeros = 6 -
+-- hexString.length; var resultBuilder = [\'#\']; for (var i = 0; i \<
+-- missingZeros; i++) { resultBuilder.push(\'0\'); }
+-- resultBuilder.push(hexString); return resultBuilder.join(\'\'); }; \/\/
+-- ...
+--
+-- /See:/ 'color' smart constructor.
+data Color = Color'
+    { _cRed   :: !(Maybe (Textual Double))
+    , _cAlpha :: !(Maybe (Textual Double))
+    , _cGreen :: !(Maybe (Textual Double))
+    , _cBlue  :: !(Maybe (Textual Double))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Color' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cRed'
+--
+-- * 'cAlpha'
+--
+-- * 'cGreen'
+--
+-- * 'cBlue'
+color
+    :: Color
+color =
+    Color'
+    { _cRed = Nothing
+    , _cAlpha = Nothing
+    , _cGreen = Nothing
+    , _cBlue = Nothing
+    }
+
+-- | The amount of red in the color as a value in the interval [0, 1].
+cRed :: Lens' Color (Maybe Double)
+cRed
+  = lens _cRed (\ s a -> s{_cRed = a}) .
+      mapping _Coerce
+
+-- | The fraction of this color that should be applied to the pixel. That is,
+-- the final pixel color is defined by the equation: pixel color = alpha *
+-- (this color) + (1.0 - alpha) * (background color) This means that a
+-- value of 1.0 corresponds to a solid color, whereas a value of 0.0
+-- corresponds to a completely transparent color. This uses a wrapper
+-- message rather than a simple float scalar so that it is possible to
+-- distinguish between a default value and the value being unset. If
+-- omitted, this color object is to be rendered as a solid color (as if the
+-- alpha value had been explicitly given with a value of 1.0).
+cAlpha :: Lens' Color (Maybe Double)
+cAlpha
+  = lens _cAlpha (\ s a -> s{_cAlpha = a}) .
+      mapping _Coerce
+
+-- | The amount of green in the color as a value in the interval [0, 1].
+cGreen :: Lens' Color (Maybe Double)
+cGreen
+  = lens _cGreen (\ s a -> s{_cGreen = a}) .
+      mapping _Coerce
+
+-- | The amount of blue in the color as a value in the interval [0, 1].
+cBlue :: Lens' Color (Maybe Double)
+cBlue
+  = lens _cBlue (\ s a -> s{_cBlue = a}) .
+      mapping _Coerce
+
+instance FromJSON Color where
+        parseJSON
+          = withObject "Color"
+              (\ o ->
+                 Color' <$>
+                   (o .:? "red") <*> (o .:? "alpha") <*> (o .:? "green")
+                     <*> (o .:? "blue"))
+
+instance ToJSON Color where
+        toJSON Color'{..}
+          = object
+              (catMaybes
+                 [("red" .=) <$> _cRed, ("alpha" .=) <$> _cAlpha,
+                  ("green" .=) <$> _cGreen, ("blue" .=) <$> _cBlue])
+
+-- | Deletes a particular filter view.
+--
+-- /See:/ 'deleteFilterViewRequest' smart constructor.
+newtype DeleteFilterViewRequest = DeleteFilterViewRequest'
+    { _dfvrFilterId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteFilterViewRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfvrFilterId'
+deleteFilterViewRequest
+    :: DeleteFilterViewRequest
+deleteFilterViewRequest =
+    DeleteFilterViewRequest'
+    { _dfvrFilterId = Nothing
+    }
+
+-- | The ID of the filter to delete.
+dfvrFilterId :: Lens' DeleteFilterViewRequest (Maybe Int32)
+dfvrFilterId
+  = lens _dfvrFilterId (\ s a -> s{_dfvrFilterId = a})
+      . mapping _Coerce
+
+instance FromJSON DeleteFilterViewRequest where
+        parseJSON
+          = withObject "DeleteFilterViewRequest"
+              (\ o ->
+                 DeleteFilterViewRequest' <$> (o .:? "filterId"))
+
+instance ToJSON DeleteFilterViewRequest where
+        toJSON DeleteFilterViewRequest'{..}
+          = object
+              (catMaybes [("filterId" .=) <$> _dfvrFilterId])
+
+-- | Updates properties of the filter view.
+--
+-- /See:/ 'updateFilterViewRequest' smart constructor.
+data UpdateFilterViewRequest = UpdateFilterViewRequest'
+    { _ufvrFilter :: !(Maybe FilterView)
+    , _ufvrFields :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateFilterViewRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ufvrFilter'
+--
+-- * 'ufvrFields'
+updateFilterViewRequest
+    :: UpdateFilterViewRequest
+updateFilterViewRequest =
+    UpdateFilterViewRequest'
+    { _ufvrFilter = Nothing
+    , _ufvrFields = Nothing
+    }
+
+-- | The new properties of the filter view.
+ufvrFilter :: Lens' UpdateFilterViewRequest (Maybe FilterView)
+ufvrFilter
+  = lens _ufvrFilter (\ s a -> s{_ufvrFilter = a})
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`filter\` is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+ufvrFields :: Lens' UpdateFilterViewRequest (Maybe FieldMask)
+ufvrFields
+  = lens _ufvrFields (\ s a -> s{_ufvrFields = a})
+
+instance FromJSON UpdateFilterViewRequest where
+        parseJSON
+          = withObject "UpdateFilterViewRequest"
+              (\ o ->
+                 UpdateFilterViewRequest' <$>
+                   (o .:? "filter") <*> (o .:? "fields"))
+
+instance ToJSON UpdateFilterViewRequest where
+        toJSON UpdateFilterViewRequest'{..}
+          = object
+              (catMaybes
+                 [("filter" .=) <$> _ufvrFilter,
+                  ("fields" .=) <$> _ufvrFields])
+
+-- | A single series of data in a chart. For example, if charting stock
+-- prices over time, multiple series may exist, one for the \"Open Price\",
+-- \"High Price\", \"Low Price\" and \"Close Price\".
+--
+-- /See:/ 'basicChartSeries' smart constructor.
+data BasicChartSeries = BasicChartSeries'
+    { _bcsTargetAxis :: !(Maybe BasicChartSeriesTargetAxis)
+    , _bcsSeries     :: !(Maybe ChartData)
+    , _bcsType       :: !(Maybe BasicChartSeriesType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicChartSeries' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcsTargetAxis'
+--
+-- * 'bcsSeries'
+--
+-- * 'bcsType'
+basicChartSeries
+    :: BasicChartSeries
+basicChartSeries =
+    BasicChartSeries'
+    { _bcsTargetAxis = Nothing
+    , _bcsSeries = Nothing
+    , _bcsType = Nothing
+    }
+
+-- | The minor axis that will specify the range of values for this series.
+-- For example, if charting stocks over time, the \"Volume\" series may
+-- want to be pinned to the right with the prices pinned to the left,
+-- because the scale of trading volume is different than the scale of
+-- prices. It is an error to specify an axis that isn\'t a valid minor axis
+-- for the chart\'s type.
+bcsTargetAxis :: Lens' BasicChartSeries (Maybe BasicChartSeriesTargetAxis)
+bcsTargetAxis
+  = lens _bcsTargetAxis
+      (\ s a -> s{_bcsTargetAxis = a})
+
+-- | The data being visualized in this chart series.
+bcsSeries :: Lens' BasicChartSeries (Maybe ChartData)
+bcsSeries
+  = lens _bcsSeries (\ s a -> s{_bcsSeries = a})
+
+-- | The type of this series. Valid only if the chartType is COMBO. Different
+-- types will change the way the series is visualized. Only LINE, AREA, and
+-- COLUMN are supported.
+bcsType :: Lens' BasicChartSeries (Maybe BasicChartSeriesType)
+bcsType = lens _bcsType (\ s a -> s{_bcsType = a})
+
+instance FromJSON BasicChartSeries where
+        parseJSON
+          = withObject "BasicChartSeries"
+              (\ o ->
+                 BasicChartSeries' <$>
+                   (o .:? "targetAxis") <*> (o .:? "series") <*>
+                     (o .:? "type"))
+
+instance ToJSON BasicChartSeries where
+        toJSON BasicChartSeries'{..}
+          = object
+              (catMaybes
+                 [("targetAxis" .=) <$> _bcsTargetAxis,
+                  ("series" .=) <$> _bcsSeries,
+                  ("type" .=) <$> _bcsType])
+
+-- | Adds a new protected range.
+--
+-- /See:/ 'addProtectedRangeRequest' smart constructor.
+newtype AddProtectedRangeRequest = AddProtectedRangeRequest'
+    { _aprrProtectedRange :: Maybe ProtectedRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddProtectedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aprrProtectedRange'
+addProtectedRangeRequest
+    :: AddProtectedRangeRequest
+addProtectedRangeRequest =
+    AddProtectedRangeRequest'
+    { _aprrProtectedRange = Nothing
+    }
+
+-- | The protected range to be added.
+aprrProtectedRange :: Lens' AddProtectedRangeRequest (Maybe ProtectedRange)
+aprrProtectedRange
+  = lens _aprrProtectedRange
+      (\ s a -> s{_aprrProtectedRange = a})
+
+instance FromJSON AddProtectedRangeRequest where
+        parseJSON
+          = withObject "AddProtectedRangeRequest"
+              (\ o ->
+                 AddProtectedRangeRequest' <$>
+                   (o .:? "protectedRange"))
+
+instance ToJSON AddProtectedRangeRequest where
+        toJSON AddProtectedRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("protectedRange" .=) <$> _aprrProtectedRange])
+
+-- | Updates all cells in the range to the values in the given Cell object.
+-- Only the fields listed in the fields field are updated; others are
+-- unchanged. If writing a cell with a formula, the formula\'s ranges will
+-- automatically increment for each field in the range. For example, if
+-- writing a cell with formula \`=A1\` into range B2:C4, B2 would be
+-- \`=A1\`, B3 would be \`=A2\`, B4 would be \`=A3\`, C2 would be \`=B1\`,
+-- C3 would be \`=B2\`, C4 would be \`=B3\`. To keep the formula\'s ranges
+-- static, use the \`$\` indicator. For example, use the formula \`=$A$1\`
+-- to prevent both the row and the column from incrementing.
+--
+-- /See:/ 'repeatCellRequest' smart constructor.
+data RepeatCellRequest = RepeatCellRequest'
+    { _rcrCell   :: !(Maybe CellData)
+    , _rcrRange  :: !(Maybe GridRange)
+    , _rcrFields :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RepeatCellRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcrCell'
+--
+-- * 'rcrRange'
+--
+-- * 'rcrFields'
+repeatCellRequest
+    :: RepeatCellRequest
+repeatCellRequest =
+    RepeatCellRequest'
+    { _rcrCell = Nothing
+    , _rcrRange = Nothing
+    , _rcrFields = Nothing
+    }
+
+-- | The data to write.
+rcrCell :: Lens' RepeatCellRequest (Maybe CellData)
+rcrCell = lens _rcrCell (\ s a -> s{_rcrCell = a})
+
+-- | The range to repeat the cell in.
+rcrRange :: Lens' RepeatCellRequest (Maybe GridRange)
+rcrRange = lens _rcrRange (\ s a -> s{_rcrRange = a})
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`cell\` is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+rcrFields :: Lens' RepeatCellRequest (Maybe FieldMask)
+rcrFields
+  = lens _rcrFields (\ s a -> s{_rcrFields = a})
+
+instance FromJSON RepeatCellRequest where
+        parseJSON
+          = withObject "RepeatCellRequest"
+              (\ o ->
+                 RepeatCellRequest' <$>
+                   (o .:? "cell") <*> (o .:? "range") <*>
+                     (o .:? "fields"))
+
+instance ToJSON RepeatCellRequest where
+        toJSON RepeatCellRequest'{..}
+          = object
+              (catMaybes
+                 [("cell" .=) <$> _rcrCell,
+                  ("range" .=) <$> _rcrRange,
+                  ("fields" .=) <$> _rcrFields])
+
+-- | The value of the condition.
+--
+-- /See:/ 'conditionValue' smart constructor.
+data ConditionValue = ConditionValue'
+    { _cvRelativeDate     :: !(Maybe ConditionValueRelativeDate)
+    , _cvUserEnteredValue :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ConditionValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cvRelativeDate'
+--
+-- * 'cvUserEnteredValue'
+conditionValue
+    :: ConditionValue
+conditionValue =
+    ConditionValue'
+    { _cvRelativeDate = Nothing
+    , _cvUserEnteredValue = Nothing
+    }
+
+-- | A relative date (based on the current date). Valid only if the type is
+-- DATE_BEFORE, DATE_AFTER, DATE_ON_OR_BEFORE or DATE_ON_OR_AFTER. Relative
+-- dates are not supported in data validation. They are supported only in
+-- conditional formatting and conditional filters.
+cvRelativeDate :: Lens' ConditionValue (Maybe ConditionValueRelativeDate)
+cvRelativeDate
+  = lens _cvRelativeDate
+      (\ s a -> s{_cvRelativeDate = a})
+
+-- | A value the condition is based on. The value will be parsed as if the
+-- user typed into a cell. Formulas are supported (and must begin with an
+-- \`=\`).
+cvUserEnteredValue :: Lens' ConditionValue (Maybe Text)
+cvUserEnteredValue
+  = lens _cvUserEnteredValue
+      (\ s a -> s{_cvUserEnteredValue = a})
+
+instance FromJSON ConditionValue where
+        parseJSON
+          = withObject "ConditionValue"
+              (\ o ->
+                 ConditionValue' <$>
+                   (o .:? "relativeDate") <*>
+                     (o .:? "userEnteredValue"))
+
+instance ToJSON ConditionValue where
+        toJSON ConditionValue'{..}
+          = object
+              (catMaybes
+                 [("relativeDate" .=) <$> _cvRelativeDate,
+                  ("userEnteredValue" .=) <$> _cvUserEnteredValue])
+
+-- | Deletes the dimensions from the sheet.
+--
+-- /See:/ 'deleteDimensionRequest' smart constructor.
+newtype DeleteDimensionRequest = DeleteDimensionRequest'
+    { _ddrRange :: Maybe DimensionRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteDimensionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ddrRange'
+deleteDimensionRequest
+    :: DeleteDimensionRequest
+deleteDimensionRequest =
+    DeleteDimensionRequest'
+    { _ddrRange = Nothing
+    }
+
+-- | The dimensions to delete from the sheet.
+ddrRange :: Lens' DeleteDimensionRequest (Maybe DimensionRange)
+ddrRange = lens _ddrRange (\ s a -> s{_ddrRange = a})
+
+instance FromJSON DeleteDimensionRequest where
+        parseJSON
+          = withObject "DeleteDimensionRequest"
+              (\ o -> DeleteDimensionRequest' <$> (o .:? "range"))
+
+instance ToJSON DeleteDimensionRequest where
+        toJSON DeleteDimensionRequest'{..}
+          = object (catMaybes [("range" .=) <$> _ddrRange])
+
+-- | Finds and replaces data in cells over a range, sheet, or all sheets.
+--
+-- /See:/ 'findReplaceRequest' smart constructor.
+data FindReplaceRequest = FindReplaceRequest'
+    { _frrMatchCase       :: !(Maybe Bool)
+    , _frrAllSheets       :: !(Maybe Bool)
+    , _frrIncludeFormulas :: !(Maybe Bool)
+    , _frrMatchEntireCell :: !(Maybe Bool)
+    , _frrRange           :: !(Maybe GridRange)
+    , _frrSheetId         :: !(Maybe (Textual Int32))
+    , _frrFind            :: !(Maybe Text)
+    , _frrSearchByRegex   :: !(Maybe Bool)
+    , _frrReplacement     :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FindReplaceRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'frrMatchCase'
+--
+-- * 'frrAllSheets'
+--
+-- * 'frrIncludeFormulas'
+--
+-- * 'frrMatchEntireCell'
+--
+-- * 'frrRange'
+--
+-- * 'frrSheetId'
+--
+-- * 'frrFind'
+--
+-- * 'frrSearchByRegex'
+--
+-- * 'frrReplacement'
+findReplaceRequest
+    :: FindReplaceRequest
+findReplaceRequest =
+    FindReplaceRequest'
+    { _frrMatchCase = Nothing
+    , _frrAllSheets = Nothing
+    , _frrIncludeFormulas = Nothing
+    , _frrMatchEntireCell = Nothing
+    , _frrRange = Nothing
+    , _frrSheetId = Nothing
+    , _frrFind = Nothing
+    , _frrSearchByRegex = Nothing
+    , _frrReplacement = Nothing
+    }
+
+-- | True if the search is case sensitive.
+frrMatchCase :: Lens' FindReplaceRequest (Maybe Bool)
+frrMatchCase
+  = lens _frrMatchCase (\ s a -> s{_frrMatchCase = a})
+
+-- | True to find\/replace over all sheets.
+frrAllSheets :: Lens' FindReplaceRequest (Maybe Bool)
+frrAllSheets
+  = lens _frrAllSheets (\ s a -> s{_frrAllSheets = a})
+
+-- | True if the search should include cells with formulas. False to skip
+-- cells with formulas.
+frrIncludeFormulas :: Lens' FindReplaceRequest (Maybe Bool)
+frrIncludeFormulas
+  = lens _frrIncludeFormulas
+      (\ s a -> s{_frrIncludeFormulas = a})
+
+-- | True if the find value should match the entire cell.
+frrMatchEntireCell :: Lens' FindReplaceRequest (Maybe Bool)
+frrMatchEntireCell
+  = lens _frrMatchEntireCell
+      (\ s a -> s{_frrMatchEntireCell = a})
+
+-- | The range to find\/replace over.
+frrRange :: Lens' FindReplaceRequest (Maybe GridRange)
+frrRange = lens _frrRange (\ s a -> s{_frrRange = a})
+
+-- | The sheet to find\/replace over.
+frrSheetId :: Lens' FindReplaceRequest (Maybe Int32)
+frrSheetId
+  = lens _frrSheetId (\ s a -> s{_frrSheetId = a}) .
+      mapping _Coerce
+
+-- | The value to search.
+frrFind :: Lens' FindReplaceRequest (Maybe Text)
+frrFind = lens _frrFind (\ s a -> s{_frrFind = a})
+
+-- | True if the find value is a regex. The regular expression and
+-- replacement should follow Java regex rules at
+-- https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/regex\/Pattern.html.
+-- The replacement string is allowed to refer to capturing groups. For
+-- example, if one cell has the contents \`\"Google Sheets\"\` and another
+-- has \`\"Google Docs\"\`, then searching for \`\"o.* (.*)\"\` with a
+-- replacement of \`\"$1 Rocks\"\` would change the contents of the cells
+-- to \`\"GSheets Rocks\"\` and \`\"GDocs Rocks\"\` respectively.
+frrSearchByRegex :: Lens' FindReplaceRequest (Maybe Bool)
+frrSearchByRegex
+  = lens _frrSearchByRegex
+      (\ s a -> s{_frrSearchByRegex = a})
+
+-- | The value to use as the replacement.
+frrReplacement :: Lens' FindReplaceRequest (Maybe Text)
+frrReplacement
+  = lens _frrReplacement
+      (\ s a -> s{_frrReplacement = a})
+
+instance FromJSON FindReplaceRequest where
+        parseJSON
+          = withObject "FindReplaceRequest"
+              (\ o ->
+                 FindReplaceRequest' <$>
+                   (o .:? "matchCase") <*> (o .:? "allSheets") <*>
+                     (o .:? "includeFormulas")
+                     <*> (o .:? "matchEntireCell")
+                     <*> (o .:? "range")
+                     <*> (o .:? "sheetId")
+                     <*> (o .:? "find")
+                     <*> (o .:? "searchByRegex")
+                     <*> (o .:? "replacement"))
+
+instance ToJSON FindReplaceRequest where
+        toJSON FindReplaceRequest'{..}
+          = object
+              (catMaybes
+                 [("matchCase" .=) <$> _frrMatchCase,
+                  ("allSheets" .=) <$> _frrAllSheets,
+                  ("includeFormulas" .=) <$> _frrIncludeFormulas,
+                  ("matchEntireCell" .=) <$> _frrMatchEntireCell,
+                  ("range" .=) <$> _frrRange,
+                  ("sheetId" .=) <$> _frrSheetId,
+                  ("find" .=) <$> _frrFind,
+                  ("searchByRegex" .=) <$> _frrSearchByRegex,
+                  ("replacement" .=) <$> _frrReplacement])
+
+-- | Moves one or more rows or columns.
+--
+-- /See:/ 'moveDimensionRequest' smart constructor.
+data MoveDimensionRequest = MoveDimensionRequest'
+    { _mdrDestinationIndex :: !(Maybe (Textual Int32))
+    , _mdrSource           :: !(Maybe DimensionRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MoveDimensionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mdrDestinationIndex'
+--
+-- * 'mdrSource'
+moveDimensionRequest
+    :: MoveDimensionRequest
+moveDimensionRequest =
+    MoveDimensionRequest'
+    { _mdrDestinationIndex = Nothing
+    , _mdrSource = Nothing
+    }
+
+-- | The zero-based start index of where to move the source data to, based on
+-- the coordinates *before* the source data is removed from the grid.
+-- Existing data will be shifted down or right (depending on the dimension)
+-- to make room for the moved dimensions. The source dimensions are removed
+-- from the grid, so the the data may end up in a different index than
+-- specified. For example, given \`A1..A5\` of \`0, 1, 2, 3, 4\` and
+-- wanting to move \`\"1\"\` and \`\"2\"\` to between \`\"3\"\` and
+-- \`\"4\"\`, the source would be \`ROWS [1..3)\`,and the destination index
+-- would be \`\"4\"\` (the zero-based index of row 5). The end result would
+-- be \`A1..A5\` of \`0, 3, 1, 2, 4\`.
+mdrDestinationIndex :: Lens' MoveDimensionRequest (Maybe Int32)
+mdrDestinationIndex
+  = lens _mdrDestinationIndex
+      (\ s a -> s{_mdrDestinationIndex = a})
+      . mapping _Coerce
+
+-- | The source dimensions to move.
+mdrSource :: Lens' MoveDimensionRequest (Maybe DimensionRange)
+mdrSource
+  = lens _mdrSource (\ s a -> s{_mdrSource = a})
+
+instance FromJSON MoveDimensionRequest where
+        parseJSON
+          = withObject "MoveDimensionRequest"
+              (\ o ->
+                 MoveDimensionRequest' <$>
+                   (o .:? "destinationIndex") <*> (o .:? "source"))
+
+instance ToJSON MoveDimensionRequest where
+        toJSON MoveDimensionRequest'{..}
+          = object
+              (catMaybes
+                 [("destinationIndex" .=) <$> _mdrDestinationIndex,
+                  ("source" .=) <$> _mdrSource])
+
+-- | A rule that applies a gradient color scale format, based on the
+-- interpolation points listed. The format of a cell will vary based on its
+-- contents as compared to the values of the interpolation points.
+--
+-- /See:/ 'gradientRule' smart constructor.
+data GradientRule = GradientRule'
+    { _grMidpoint :: !(Maybe InterpolationPoint)
+    , _grMaxpoint :: !(Maybe InterpolationPoint)
+    , _grMinpoint :: !(Maybe InterpolationPoint)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GradientRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'grMidpoint'
+--
+-- * 'grMaxpoint'
+--
+-- * 'grMinpoint'
+gradientRule
+    :: GradientRule
+gradientRule =
+    GradientRule'
+    { _grMidpoint = Nothing
+    , _grMaxpoint = Nothing
+    , _grMinpoint = Nothing
+    }
+
+-- | An optional midway interpolation point.
+grMidpoint :: Lens' GradientRule (Maybe InterpolationPoint)
+grMidpoint
+  = lens _grMidpoint (\ s a -> s{_grMidpoint = a})
+
+-- | The final interpolation point.
+grMaxpoint :: Lens' GradientRule (Maybe InterpolationPoint)
+grMaxpoint
+  = lens _grMaxpoint (\ s a -> s{_grMaxpoint = a})
+
+-- | The starting interpolation point.
+grMinpoint :: Lens' GradientRule (Maybe InterpolationPoint)
+grMinpoint
+  = lens _grMinpoint (\ s a -> s{_grMinpoint = a})
+
+instance FromJSON GradientRule where
+        parseJSON
+          = withObject "GradientRule"
+              (\ o ->
+                 GradientRule' <$>
+                   (o .:? "midpoint") <*> (o .:? "maxpoint") <*>
+                     (o .:? "minpoint"))
+
+instance ToJSON GradientRule where
+        toJSON GradientRule'{..}
+          = object
+              (catMaybes
+                 [("midpoint" .=) <$> _grMidpoint,
+                  ("maxpoint" .=) <$> _grMaxpoint,
+                  ("minpoint" .=) <$> _grMinpoint])
+
+-- | Moves data from the source to the destination.
+--
+-- /See:/ 'cutPasteRequest' smart constructor.
+data CutPasteRequest = CutPasteRequest'
+    { _cDestination :: !(Maybe GridCoordinate)
+    , _cSource      :: !(Maybe GridRange)
+    , _cPasteType   :: !(Maybe CutPasteRequestPasteType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CutPasteRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cDestination'
+--
+-- * 'cSource'
+--
+-- * 'cPasteType'
+cutPasteRequest
+    :: CutPasteRequest
+cutPasteRequest =
+    CutPasteRequest'
+    { _cDestination = Nothing
+    , _cSource = Nothing
+    , _cPasteType = Nothing
+    }
+
+-- | The top-left coordinate where the data should be pasted.
+cDestination :: Lens' CutPasteRequest (Maybe GridCoordinate)
+cDestination
+  = lens _cDestination (\ s a -> s{_cDestination = a})
+
+-- | The source data to cut.
+cSource :: Lens' CutPasteRequest (Maybe GridRange)
+cSource = lens _cSource (\ s a -> s{_cSource = a})
+
+-- | What kind of data to paste. All the source data will be cut, regardless
+-- of what is pasted.
+cPasteType :: Lens' CutPasteRequest (Maybe CutPasteRequestPasteType)
+cPasteType
+  = lens _cPasteType (\ s a -> s{_cPasteType = a})
+
+instance FromJSON CutPasteRequest where
+        parseJSON
+          = withObject "CutPasteRequest"
+              (\ o ->
+                 CutPasteRequest' <$>
+                   (o .:? "destination") <*> (o .:? "source") <*>
+                     (o .:? "pasteType"))
+
+instance ToJSON CutPasteRequest where
+        toJSON CutPasteRequest'{..}
+          = object
+              (catMaybes
+                 [("destination" .=) <$> _cDestination,
+                  ("source" .=) <$> _cSource,
+                  ("pasteType" .=) <$> _cPasteType])
+
+-- | The result of updating an embedded object\'s position.
+--
+-- /See:/ 'updateEmbeddedObjectPositionResponse' smart constructor.
+newtype UpdateEmbeddedObjectPositionResponse = UpdateEmbeddedObjectPositionResponse'
+    { _ueoprPosition :: Maybe EmbeddedObjectPosition
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateEmbeddedObjectPositionResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ueoprPosition'
+updateEmbeddedObjectPositionResponse
+    :: UpdateEmbeddedObjectPositionResponse
+updateEmbeddedObjectPositionResponse =
+    UpdateEmbeddedObjectPositionResponse'
+    { _ueoprPosition = Nothing
+    }
+
+-- | The new position of the embedded object.
+ueoprPosition :: Lens' UpdateEmbeddedObjectPositionResponse (Maybe EmbeddedObjectPosition)
+ueoprPosition
+  = lens _ueoprPosition
+      (\ s a -> s{_ueoprPosition = a})
+
+instance FromJSON
+         UpdateEmbeddedObjectPositionResponse where
+        parseJSON
+          = withObject "UpdateEmbeddedObjectPositionResponse"
+              (\ o ->
+                 UpdateEmbeddedObjectPositionResponse' <$>
+                   (o .:? "position"))
+
+instance ToJSON UpdateEmbeddedObjectPositionResponse
+         where
+        toJSON UpdateEmbeddedObjectPositionResponse'{..}
+          = object
+              (catMaybes [("position" .=) <$> _ueoprPosition])
+
+-- | A single response from an update.
+--
+-- /See:/ 'response' smart constructor.
+data Response = Response'
+    { _rAddFilterView                :: !(Maybe AddFilterViewResponse)
+    , _rDuplicateFilterView          :: !(Maybe DuplicateFilterViewResponse)
+    , _rUpdateEmbeddedObjectPosition :: !(Maybe UpdateEmbeddedObjectPositionResponse)
+    , _rAddSheet                     :: !(Maybe AddSheetResponse)
+    , _rFindReplace                  :: !(Maybe FindReplaceResponse)
+    , _rAddProtectedRange            :: !(Maybe AddProtectedRangeResponse)
+    , _rDeleteConditionalFormatRule  :: !(Maybe DeleteConditionalFormatRuleResponse)
+    , _rUpdateConditionalFormatRule  :: !(Maybe UpdateConditionalFormatRuleResponse)
+    , _rAddNamedRange                :: !(Maybe AddNamedRangeResponse)
+    , _rAddChart                     :: !(Maybe AddChartResponse)
+    , _rDuplicateSheet               :: !(Maybe DuplicateSheetResponse)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Response' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rAddFilterView'
+--
+-- * 'rDuplicateFilterView'
+--
+-- * 'rUpdateEmbeddedObjectPosition'
+--
+-- * 'rAddSheet'
+--
+-- * 'rFindReplace'
+--
+-- * 'rAddProtectedRange'
+--
+-- * 'rDeleteConditionalFormatRule'
+--
+-- * 'rUpdateConditionalFormatRule'
+--
+-- * 'rAddNamedRange'
+--
+-- * 'rAddChart'
+--
+-- * 'rDuplicateSheet'
+response
+    :: Response
+response =
+    Response'
+    { _rAddFilterView = Nothing
+    , _rDuplicateFilterView = Nothing
+    , _rUpdateEmbeddedObjectPosition = Nothing
+    , _rAddSheet = Nothing
+    , _rFindReplace = Nothing
+    , _rAddProtectedRange = Nothing
+    , _rDeleteConditionalFormatRule = Nothing
+    , _rUpdateConditionalFormatRule = Nothing
+    , _rAddNamedRange = Nothing
+    , _rAddChart = Nothing
+    , _rDuplicateSheet = Nothing
+    }
+
+-- | A reply from adding a filter view.
+rAddFilterView :: Lens' Response (Maybe AddFilterViewResponse)
+rAddFilterView
+  = lens _rAddFilterView
+      (\ s a -> s{_rAddFilterView = a})
+
+-- | A reply from duplicating a filter view.
+rDuplicateFilterView :: Lens' Response (Maybe DuplicateFilterViewResponse)
+rDuplicateFilterView
+  = lens _rDuplicateFilterView
+      (\ s a -> s{_rDuplicateFilterView = a})
+
+-- | A reply from updating an embedded object\'s position.
+rUpdateEmbeddedObjectPosition :: Lens' Response (Maybe UpdateEmbeddedObjectPositionResponse)
+rUpdateEmbeddedObjectPosition
+  = lens _rUpdateEmbeddedObjectPosition
+      (\ s a -> s{_rUpdateEmbeddedObjectPosition = a})
+
+-- | A reply from adding a sheet.
+rAddSheet :: Lens' Response (Maybe AddSheetResponse)
+rAddSheet
+  = lens _rAddSheet (\ s a -> s{_rAddSheet = a})
+
+-- | A reply from doing a find\/replace.
+rFindReplace :: Lens' Response (Maybe FindReplaceResponse)
+rFindReplace
+  = lens _rFindReplace (\ s a -> s{_rFindReplace = a})
+
+-- | A reply from adding a protected range.
+rAddProtectedRange :: Lens' Response (Maybe AddProtectedRangeResponse)
+rAddProtectedRange
+  = lens _rAddProtectedRange
+      (\ s a -> s{_rAddProtectedRange = a})
+
+-- | A reply from deleting a conditional format rule.
+rDeleteConditionalFormatRule :: Lens' Response (Maybe DeleteConditionalFormatRuleResponse)
+rDeleteConditionalFormatRule
+  = lens _rDeleteConditionalFormatRule
+      (\ s a -> s{_rDeleteConditionalFormatRule = a})
+
+-- | A reply from updating a conditional format rule.
+rUpdateConditionalFormatRule :: Lens' Response (Maybe UpdateConditionalFormatRuleResponse)
+rUpdateConditionalFormatRule
+  = lens _rUpdateConditionalFormatRule
+      (\ s a -> s{_rUpdateConditionalFormatRule = a})
+
+-- | A reply from adding a named range.
+rAddNamedRange :: Lens' Response (Maybe AddNamedRangeResponse)
+rAddNamedRange
+  = lens _rAddNamedRange
+      (\ s a -> s{_rAddNamedRange = a})
+
+-- | A reply from adding a chart.
+rAddChart :: Lens' Response (Maybe AddChartResponse)
+rAddChart
+  = lens _rAddChart (\ s a -> s{_rAddChart = a})
+
+-- | A reply from duplicating a sheet.
+rDuplicateSheet :: Lens' Response (Maybe DuplicateSheetResponse)
+rDuplicateSheet
+  = lens _rDuplicateSheet
+      (\ s a -> s{_rDuplicateSheet = a})
+
+instance FromJSON Response where
+        parseJSON
+          = withObject "Response"
+              (\ o ->
+                 Response' <$>
+                   (o .:? "addFilterView") <*>
+                     (o .:? "duplicateFilterView")
+                     <*> (o .:? "updateEmbeddedObjectPosition")
+                     <*> (o .:? "addSheet")
+                     <*> (o .:? "findReplace")
+                     <*> (o .:? "addProtectedRange")
+                     <*> (o .:? "deleteConditionalFormatRule")
+                     <*> (o .:? "updateConditionalFormatRule")
+                     <*> (o .:? "addNamedRange")
+                     <*> (o .:? "addChart")
+                     <*> (o .:? "duplicateSheet"))
+
+instance ToJSON Response where
+        toJSON Response'{..}
+          = object
+              (catMaybes
+                 [("addFilterView" .=) <$> _rAddFilterView,
+                  ("duplicateFilterView" .=) <$> _rDuplicateFilterView,
+                  ("updateEmbeddedObjectPosition" .=) <$>
+                    _rUpdateEmbeddedObjectPosition,
+                  ("addSheet" .=) <$> _rAddSheet,
+                  ("findReplace" .=) <$> _rFindReplace,
+                  ("addProtectedRange" .=) <$> _rAddProtectedRange,
+                  ("deleteConditionalFormatRule" .=) <$>
+                    _rDeleteConditionalFormatRule,
+                  ("updateConditionalFormatRule" .=) <$>
+                    _rUpdateConditionalFormatRule,
+                  ("addNamedRange" .=) <$> _rAddNamedRange,
+                  ("addChart" .=) <$> _rAddChart,
+                  ("duplicateSheet" .=) <$> _rDuplicateSheet])
+
+-- | Criteria for showing\/hiding rows in a filter or filter view.
+--
+-- /See:/ 'filterCriteria' smart constructor.
+data FilterCriteria = FilterCriteria'
+    { _fcHiddenValues :: !(Maybe [Text])
+    , _fcCondition    :: !(Maybe BooleanCondition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FilterCriteria' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fcHiddenValues'
+--
+-- * 'fcCondition'
+filterCriteria
+    :: FilterCriteria
+filterCriteria =
+    FilterCriteria'
+    { _fcHiddenValues = Nothing
+    , _fcCondition = Nothing
+    }
+
+-- | Values that should be hidden.
+fcHiddenValues :: Lens' FilterCriteria [Text]
+fcHiddenValues
+  = lens _fcHiddenValues
+      (\ s a -> s{_fcHiddenValues = a})
+      . _Default
+      . _Coerce
+
+-- | A condition that must be true for values to be shown. (This does not
+-- override hiddenValues -- if a value is listed there, it will still be
+-- hidden.)
+fcCondition :: Lens' FilterCriteria (Maybe BooleanCondition)
+fcCondition
+  = lens _fcCondition (\ s a -> s{_fcCondition = a})
+
+instance FromJSON FilterCriteria where
+        parseJSON
+          = withObject "FilterCriteria"
+              (\ o ->
+                 FilterCriteria' <$>
+                   (o .:? "hiddenValues" .!= mempty) <*>
+                     (o .:? "condition"))
+
+instance ToJSON FilterCriteria where
+        toJSON FilterCriteria'{..}
+          = object
+              (catMaybes
+                 [("hiddenValues" .=) <$> _fcHiddenValues,
+                  ("condition" .=) <$> _fcCondition])
+
+-- | An error in a cell.
+--
+-- /See:/ 'errorValue' smart constructor.
+data ErrorValue = ErrorValue'
+    { _evType    :: !(Maybe ErrorValueType)
+    , _evMessage :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ErrorValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'evType'
+--
+-- * 'evMessage'
+errorValue
+    :: ErrorValue
+errorValue =
+    ErrorValue'
+    { _evType = Nothing
+    , _evMessage = Nothing
+    }
+
+-- | The type of error.
+evType :: Lens' ErrorValue (Maybe ErrorValueType)
+evType = lens _evType (\ s a -> s{_evType = a})
+
+-- | A message with more information about the error (in the spreadsheet\'s
+-- locale).
+evMessage :: Lens' ErrorValue (Maybe Text)
+evMessage
+  = lens _evMessage (\ s a -> s{_evMessage = a})
+
+instance FromJSON ErrorValue where
+        parseJSON
+          = withObject "ErrorValue"
+              (\ o ->
+                 ErrorValue' <$> (o .:? "type") <*> (o .:? "message"))
+
+instance ToJSON ErrorValue where
+        toJSON ErrorValue'{..}
+          = object
+              (catMaybes
+                 [("type" .=) <$> _evType,
+                  ("message" .=) <$> _evMessage])
+
+-- | Updates a conditional format rule at the given index, or moves a
+-- conditional format rule to another index.
+--
+-- /See:/ 'updateConditionalFormatRuleRequest' smart constructor.
+data UpdateConditionalFormatRuleRequest = UpdateConditionalFormatRuleRequest'
+    { _ucfrrRule     :: !(Maybe ConditionalFormatRule)
+    , _ucfrrNewIndex :: !(Maybe (Textual Int32))
+    , _ucfrrSheetId  :: !(Maybe (Textual Int32))
+    , _ucfrrIndex    :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateConditionalFormatRuleRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucfrrRule'
+--
+-- * 'ucfrrNewIndex'
+--
+-- * 'ucfrrSheetId'
+--
+-- * 'ucfrrIndex'
+updateConditionalFormatRuleRequest
+    :: UpdateConditionalFormatRuleRequest
+updateConditionalFormatRuleRequest =
+    UpdateConditionalFormatRuleRequest'
+    { _ucfrrRule = Nothing
+    , _ucfrrNewIndex = Nothing
+    , _ucfrrSheetId = Nothing
+    , _ucfrrIndex = Nothing
+    }
+
+-- | The rule that should replace the rule at the given index.
+ucfrrRule :: Lens' UpdateConditionalFormatRuleRequest (Maybe ConditionalFormatRule)
+ucfrrRule
+  = lens _ucfrrRule (\ s a -> s{_ucfrrRule = a})
+
+-- | The zero-based new index the rule should end up at.
+ucfrrNewIndex :: Lens' UpdateConditionalFormatRuleRequest (Maybe Int32)
+ucfrrNewIndex
+  = lens _ucfrrNewIndex
+      (\ s a -> s{_ucfrrNewIndex = a})
+      . mapping _Coerce
+
+-- | The sheet of the rule to move. Required if new_index is set, unused
+-- otherwise.
+ucfrrSheetId :: Lens' UpdateConditionalFormatRuleRequest (Maybe Int32)
+ucfrrSheetId
+  = lens _ucfrrSheetId (\ s a -> s{_ucfrrSheetId = a})
+      . mapping _Coerce
+
+-- | The zero-based index of the rule that should be replaced or moved.
+ucfrrIndex :: Lens' UpdateConditionalFormatRuleRequest (Maybe Int32)
+ucfrrIndex
+  = lens _ucfrrIndex (\ s a -> s{_ucfrrIndex = a}) .
+      mapping _Coerce
+
+instance FromJSON UpdateConditionalFormatRuleRequest
+         where
+        parseJSON
+          = withObject "UpdateConditionalFormatRuleRequest"
+              (\ o ->
+                 UpdateConditionalFormatRuleRequest' <$>
+                   (o .:? "rule") <*> (o .:? "newIndex") <*>
+                     (o .:? "sheetId")
+                     <*> (o .:? "index"))
+
+instance ToJSON UpdateConditionalFormatRuleRequest
+         where
+        toJSON UpdateConditionalFormatRuleRequest'{..}
+          = object
+              (catMaybes
+                 [("rule" .=) <$> _ucfrrRule,
+                  ("newIndex" .=) <$> _ucfrrNewIndex,
+                  ("sheetId" .=) <$> _ucfrrSheetId,
+                  ("index" .=) <$> _ucfrrIndex])
+
+-- | Deletes a conditional format rule at the given index. All subsequent
+-- rules\' indexes are decremented.
+--
+-- /See:/ 'deleteConditionalFormatRuleRequest' smart constructor.
+data DeleteConditionalFormatRuleRequest = DeleteConditionalFormatRuleRequest'
+    { _dcfrrSheetId :: !(Maybe (Textual Int32))
+    , _dcfrrIndex   :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteConditionalFormatRuleRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcfrrSheetId'
+--
+-- * 'dcfrrIndex'
+deleteConditionalFormatRuleRequest
+    :: DeleteConditionalFormatRuleRequest
+deleteConditionalFormatRuleRequest =
+    DeleteConditionalFormatRuleRequest'
+    { _dcfrrSheetId = Nothing
+    , _dcfrrIndex = Nothing
+    }
+
+-- | The sheet the rule is being deleted from.
+dcfrrSheetId :: Lens' DeleteConditionalFormatRuleRequest (Maybe Int32)
+dcfrrSheetId
+  = lens _dcfrrSheetId (\ s a -> s{_dcfrrSheetId = a})
+      . mapping _Coerce
+
+-- | The zero-based index of the rule to be deleted.
+dcfrrIndex :: Lens' DeleteConditionalFormatRuleRequest (Maybe Int32)
+dcfrrIndex
+  = lens _dcfrrIndex (\ s a -> s{_dcfrrIndex = a}) .
+      mapping _Coerce
+
+instance FromJSON DeleteConditionalFormatRuleRequest
+         where
+        parseJSON
+          = withObject "DeleteConditionalFormatRuleRequest"
+              (\ o ->
+                 DeleteConditionalFormatRuleRequest' <$>
+                   (o .:? "sheetId") <*> (o .:? "index"))
+
+instance ToJSON DeleteConditionalFormatRuleRequest
+         where
+        toJSON DeleteConditionalFormatRuleRequest'{..}
+          = object
+              (catMaybes
+                 [("sheetId" .=) <$> _dcfrrSheetId,
+                  ("index" .=) <$> _dcfrrIndex])
+
+-- | The location an object is overlaid on top of a grid.
+--
+-- /See:/ 'overlayPosition' smart constructor.
+data OverlayPosition = OverlayPosition'
+    { _opHeightPixels  :: !(Maybe (Textual Int32))
+    , _opOffSetYPixels :: !(Maybe (Textual Int32))
+    , _opAnchorCell    :: !(Maybe GridCoordinate)
+    , _opWidthPixels   :: !(Maybe (Textual Int32))
+    , _opOffSetXPixels :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'OverlayPosition' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'opHeightPixels'
+--
+-- * 'opOffSetYPixels'
+--
+-- * 'opAnchorCell'
+--
+-- * 'opWidthPixels'
+--
+-- * 'opOffSetXPixels'
+overlayPosition
+    :: OverlayPosition
+overlayPosition =
+    OverlayPosition'
+    { _opHeightPixels = Nothing
+    , _opOffSetYPixels = Nothing
+    , _opAnchorCell = Nothing
+    , _opWidthPixels = Nothing
+    , _opOffSetXPixels = Nothing
+    }
+
+-- | The height of the object, in pixels. Defaults to 371.
+opHeightPixels :: Lens' OverlayPosition (Maybe Int32)
+opHeightPixels
+  = lens _opHeightPixels
+      (\ s a -> s{_opHeightPixels = a})
+      . mapping _Coerce
+
+-- | The vertical offset, in pixels, that the object is offset from the
+-- anchor cell.
+opOffSetYPixels :: Lens' OverlayPosition (Maybe Int32)
+opOffSetYPixels
+  = lens _opOffSetYPixels
+      (\ s a -> s{_opOffSetYPixels = a})
+      . mapping _Coerce
+
+-- | The cell the object is anchored to.
+opAnchorCell :: Lens' OverlayPosition (Maybe GridCoordinate)
+opAnchorCell
+  = lens _opAnchorCell (\ s a -> s{_opAnchorCell = a})
+
+-- | The width of the object, in pixels. Defaults to 600.
+opWidthPixels :: Lens' OverlayPosition (Maybe Int32)
+opWidthPixels
+  = lens _opWidthPixels
+      (\ s a -> s{_opWidthPixels = a})
+      . mapping _Coerce
+
+-- | The horizontal offset, in pixels, that the object is offset from the
+-- anchor cell.
+opOffSetXPixels :: Lens' OverlayPosition (Maybe Int32)
+opOffSetXPixels
+  = lens _opOffSetXPixels
+      (\ s a -> s{_opOffSetXPixels = a})
+      . mapping _Coerce
+
+instance FromJSON OverlayPosition where
+        parseJSON
+          = withObject "OverlayPosition"
+              (\ o ->
+                 OverlayPosition' <$>
+                   (o .:? "heightPixels") <*> (o .:? "offsetYPixels")
+                     <*> (o .:? "anchorCell")
+                     <*> (o .:? "widthPixels")
+                     <*> (o .:? "offsetXPixels"))
+
+instance ToJSON OverlayPosition where
+        toJSON OverlayPosition'{..}
+          = object
+              (catMaybes
+                 [("heightPixels" .=) <$> _opHeightPixels,
+                  ("offsetYPixels" .=) <$> _opOffSetYPixels,
+                  ("anchorCell" .=) <$> _opAnchorCell,
+                  ("widthPixels" .=) <$> _opWidthPixels,
+                  ("offsetXPixels" .=) <$> _opOffSetXPixels])
+
+-- | Deletes the embedded object with the given ID.
+--
+-- /See:/ 'deleteEmbeddedObjectRequest' smart constructor.
+newtype DeleteEmbeddedObjectRequest = DeleteEmbeddedObjectRequest'
+    { _deorObjectId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteEmbeddedObjectRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'deorObjectId'
+deleteEmbeddedObjectRequest
+    :: DeleteEmbeddedObjectRequest
+deleteEmbeddedObjectRequest =
+    DeleteEmbeddedObjectRequest'
+    { _deorObjectId = Nothing
+    }
+
+-- | The ID of the embedded object to delete.
+deorObjectId :: Lens' DeleteEmbeddedObjectRequest (Maybe Int32)
+deorObjectId
+  = lens _deorObjectId (\ s a -> s{_deorObjectId = a})
+      . mapping _Coerce
+
+instance FromJSON DeleteEmbeddedObjectRequest where
+        parseJSON
+          = withObject "DeleteEmbeddedObjectRequest"
+              (\ o ->
+                 DeleteEmbeddedObjectRequest' <$> (o .:? "objectId"))
+
+instance ToJSON DeleteEmbeddedObjectRequest where
+        toJSON DeleteEmbeddedObjectRequest'{..}
+          = object
+              (catMaybes [("objectId" .=) <$> _deorObjectId])
+
+-- | Properties of a sheet.
+--
+-- /See:/ 'sheetProperties' smart constructor.
+data SheetProperties = SheetProperties'
+    { _sTabColor       :: !(Maybe Color)
+    , _sGridProperties :: !(Maybe GridProperties)
+    , _sSheetType      :: !(Maybe SheetPropertiesSheetType)
+    , _sHidden         :: !(Maybe Bool)
+    , _sSheetId        :: !(Maybe (Textual Int32))
+    , _sTitle          :: !(Maybe Text)
+    , _sRightToLeft    :: !(Maybe Bool)
+    , _sIndex          :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SheetProperties' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sTabColor'
+--
+-- * 'sGridProperties'
+--
+-- * 'sSheetType'
+--
+-- * 'sHidden'
+--
+-- * 'sSheetId'
+--
+-- * 'sTitle'
+--
+-- * 'sRightToLeft'
+--
+-- * 'sIndex'
+sheetProperties
+    :: SheetProperties
+sheetProperties =
+    SheetProperties'
+    { _sTabColor = Nothing
+    , _sGridProperties = Nothing
+    , _sSheetType = Nothing
+    , _sHidden = Nothing
+    , _sSheetId = Nothing
+    , _sTitle = Nothing
+    , _sRightToLeft = Nothing
+    , _sIndex = Nothing
+    }
+
+-- | The color of the tab in the UI.
+sTabColor :: Lens' SheetProperties (Maybe Color)
+sTabColor
+  = lens _sTabColor (\ s a -> s{_sTabColor = a})
+
+-- | Additional properties of the sheet if this sheet is a grid. (If the
+-- sheet is an object sheet, containing a chart or image, then this field
+-- will be absent.) When writing it is an error to set any grid properties
+-- on non-grid sheets.
+sGridProperties :: Lens' SheetProperties (Maybe GridProperties)
+sGridProperties
+  = lens _sGridProperties
+      (\ s a -> s{_sGridProperties = a})
+
+-- | The type of sheet. Defaults to GRID. This field cannot be changed once
+-- set.
+sSheetType :: Lens' SheetProperties (Maybe SheetPropertiesSheetType)
+sSheetType
+  = lens _sSheetType (\ s a -> s{_sSheetType = a})
+
+-- | True if the sheet is hidden in the UI, false if it\'s visible.
+sHidden :: Lens' SheetProperties (Maybe Bool)
+sHidden = lens _sHidden (\ s a -> s{_sHidden = a})
+
+-- | The ID of the sheet. Must be non-negative. This field cannot be changed
+-- once set.
+sSheetId :: Lens' SheetProperties (Maybe Int32)
+sSheetId
+  = lens _sSheetId (\ s a -> s{_sSheetId = a}) .
+      mapping _Coerce
+
+-- | The name of the sheet.
+sTitle :: Lens' SheetProperties (Maybe Text)
+sTitle = lens _sTitle (\ s a -> s{_sTitle = a})
+
+-- | True if the sheet is an RTL sheet instead of an LTR sheet.
+sRightToLeft :: Lens' SheetProperties (Maybe Bool)
+sRightToLeft
+  = lens _sRightToLeft (\ s a -> s{_sRightToLeft = a})
+
+-- | The index of the sheet within the spreadsheet. When adding or updating
+-- sheet properties, if this field is excluded then the sheet will be added
+-- or moved to the end of the sheet list.
+sIndex :: Lens' SheetProperties (Maybe Int32)
+sIndex
+  = lens _sIndex (\ s a -> s{_sIndex = a}) .
+      mapping _Coerce
+
+instance FromJSON SheetProperties where
+        parseJSON
+          = withObject "SheetProperties"
+              (\ o ->
+                 SheetProperties' <$>
+                   (o .:? "tabColor") <*> (o .:? "gridProperties") <*>
+                     (o .:? "sheetType")
+                     <*> (o .:? "hidden")
+                     <*> (o .:? "sheetId")
+                     <*> (o .:? "title")
+                     <*> (o .:? "rightToLeft")
+                     <*> (o .:? "index"))
+
+instance ToJSON SheetProperties where
+        toJSON SheetProperties'{..}
+          = object
+              (catMaybes
+                 [("tabColor" .=) <$> _sTabColor,
+                  ("gridProperties" .=) <$> _sGridProperties,
+                  ("sheetType" .=) <$> _sSheetType,
+                  ("hidden" .=) <$> _sHidden,
+                  ("sheetId" .=) <$> _sSheetId,
+                  ("title" .=) <$> _sTitle,
+                  ("rightToLeft" .=) <$> _sRightToLeft,
+                  ("index" .=) <$> _sIndex])
+
+-- | The criteria for showing\/hiding values per column. The map\'s key is
+-- the column index, and the value is the criteria for that column.
+--
+-- /See:/ 'filterViewCriteria' smart constructor.
+newtype FilterViewCriteria = FilterViewCriteria'
+    { _fvcAddtional :: HashMap Text FilterCriteria
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FilterViewCriteria' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fvcAddtional'
+filterViewCriteria
+    :: HashMap Text FilterCriteria -- ^ 'fvcAddtional'
+    -> FilterViewCriteria
+filterViewCriteria pFvcAddtional_ =
+    FilterViewCriteria'
+    { _fvcAddtional = _Coerce # pFvcAddtional_
+    }
+
+fvcAddtional :: Lens' FilterViewCriteria (HashMap Text FilterCriteria)
+fvcAddtional
+  = lens _fvcAddtional (\ s a -> s{_fvcAddtional = a})
+      . _Coerce
+
+instance FromJSON FilterViewCriteria where
+        parseJSON
+          = withObject "FilterViewCriteria"
+              (\ o -> FilterViewCriteria' <$> (parseJSONObject o))
+
+instance ToJSON FilterViewCriteria where
+        toJSON = toJSON . _fvcAddtional
+
+-- | The response when updating a range of values in a spreadsheet.
+--
+-- /See:/ 'batchUpdateValuesResponse' smart constructor.
+data BatchUpdateValuesResponse = BatchUpdateValuesResponse'
+    { _buvrTotalUpdatedColumns :: !(Maybe (Textual Int32))
+    , _buvrResponses           :: !(Maybe [UpdateValuesResponse])
+    , _buvrSpreadsheetId       :: !(Maybe Text)
+    , _buvrTotalUpdatedSheets  :: !(Maybe (Textual Int32))
+    , _buvrTotalUpdatedCells   :: !(Maybe (Textual Int32))
+    , _buvrTotalUpdatedRows    :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchUpdateValuesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'buvrTotalUpdatedColumns'
+--
+-- * 'buvrResponses'
+--
+-- * 'buvrSpreadsheetId'
+--
+-- * 'buvrTotalUpdatedSheets'
+--
+-- * 'buvrTotalUpdatedCells'
+--
+-- * 'buvrTotalUpdatedRows'
+batchUpdateValuesResponse
+    :: BatchUpdateValuesResponse
+batchUpdateValuesResponse =
+    BatchUpdateValuesResponse'
+    { _buvrTotalUpdatedColumns = Nothing
+    , _buvrResponses = Nothing
+    , _buvrSpreadsheetId = Nothing
+    , _buvrTotalUpdatedSheets = Nothing
+    , _buvrTotalUpdatedCells = Nothing
+    , _buvrTotalUpdatedRows = Nothing
+    }
+
+-- | The total number of columns where at least one cell in the column was
+-- updated.
+buvrTotalUpdatedColumns :: Lens' BatchUpdateValuesResponse (Maybe Int32)
+buvrTotalUpdatedColumns
+  = lens _buvrTotalUpdatedColumns
+      (\ s a -> s{_buvrTotalUpdatedColumns = a})
+      . mapping _Coerce
+
+-- | One UpdateValuesResponse per requested range, in the same order as the
+-- requests appeared.
+buvrResponses :: Lens' BatchUpdateValuesResponse [UpdateValuesResponse]
+buvrResponses
+  = lens _buvrResponses
+      (\ s a -> s{_buvrResponses = a})
+      . _Default
+      . _Coerce
+
+-- | The spreadsheet the updates were applied to.
+buvrSpreadsheetId :: Lens' BatchUpdateValuesResponse (Maybe Text)
+buvrSpreadsheetId
+  = lens _buvrSpreadsheetId
+      (\ s a -> s{_buvrSpreadsheetId = a})
+
+-- | The total number of sheets where at least one cell in the sheet was
+-- updated.
+buvrTotalUpdatedSheets :: Lens' BatchUpdateValuesResponse (Maybe Int32)
+buvrTotalUpdatedSheets
+  = lens _buvrTotalUpdatedSheets
+      (\ s a -> s{_buvrTotalUpdatedSheets = a})
+      . mapping _Coerce
+
+-- | The total number of cells updated.
+buvrTotalUpdatedCells :: Lens' BatchUpdateValuesResponse (Maybe Int32)
+buvrTotalUpdatedCells
+  = lens _buvrTotalUpdatedCells
+      (\ s a -> s{_buvrTotalUpdatedCells = a})
+      . mapping _Coerce
+
+-- | The total number of rows where at least one cell in the row was updated.
+buvrTotalUpdatedRows :: Lens' BatchUpdateValuesResponse (Maybe Int32)
+buvrTotalUpdatedRows
+  = lens _buvrTotalUpdatedRows
+      (\ s a -> s{_buvrTotalUpdatedRows = a})
+      . mapping _Coerce
+
+instance FromJSON BatchUpdateValuesResponse where
+        parseJSON
+          = withObject "BatchUpdateValuesResponse"
+              (\ o ->
+                 BatchUpdateValuesResponse' <$>
+                   (o .:? "totalUpdatedColumns") <*>
+                     (o .:? "responses" .!= mempty)
+                     <*> (o .:? "spreadsheetId")
+                     <*> (o .:? "totalUpdatedSheets")
+                     <*> (o .:? "totalUpdatedCells")
+                     <*> (o .:? "totalUpdatedRows"))
+
+instance ToJSON BatchUpdateValuesResponse where
+        toJSON BatchUpdateValuesResponse'{..}
+          = object
+              (catMaybes
+                 [("totalUpdatedColumns" .=) <$>
+                    _buvrTotalUpdatedColumns,
+                  ("responses" .=) <$> _buvrResponses,
+                  ("spreadsheetId" .=) <$> _buvrSpreadsheetId,
+                  ("totalUpdatedSheets" .=) <$>
+                    _buvrTotalUpdatedSheets,
+                  ("totalUpdatedCells" .=) <$> _buvrTotalUpdatedCells,
+                  ("totalUpdatedRows" .=) <$> _buvrTotalUpdatedRows])
+
+-- | Updates properties of the sheet with the specified sheetId.
+--
+-- /See:/ 'updateSheetPropertiesRequest' smart constructor.
+data UpdateSheetPropertiesRequest = UpdateSheetPropertiesRequest'
+    { _usprFields     :: !(Maybe FieldMask)
+    , _usprProperties :: !(Maybe SheetProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateSheetPropertiesRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'usprFields'
+--
+-- * 'usprProperties'
+updateSheetPropertiesRequest
+    :: UpdateSheetPropertiesRequest
+updateSheetPropertiesRequest =
+    UpdateSheetPropertiesRequest'
+    { _usprFields = Nothing
+    , _usprProperties = Nothing
+    }
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`properties\` is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+usprFields :: Lens' UpdateSheetPropertiesRequest (Maybe FieldMask)
+usprFields
+  = lens _usprFields (\ s a -> s{_usprFields = a})
+
+-- | The properties to update.
+usprProperties :: Lens' UpdateSheetPropertiesRequest (Maybe SheetProperties)
+usprProperties
+  = lens _usprProperties
+      (\ s a -> s{_usprProperties = a})
+
+instance FromJSON UpdateSheetPropertiesRequest where
+        parseJSON
+          = withObject "UpdateSheetPropertiesRequest"
+              (\ o ->
+                 UpdateSheetPropertiesRequest' <$>
+                   (o .:? "fields") <*> (o .:? "properties"))
+
+instance ToJSON UpdateSheetPropertiesRequest where
+        toJSON UpdateSheetPropertiesRequest'{..}
+          = object
+              (catMaybes
+                 [("fields" .=) <$> _usprFields,
+                  ("properties" .=) <$> _usprProperties])
+
+-- | Resource that represents a spreadsheet.
+--
+-- /See:/ 'spreadsheet' smart constructor.
+data Spreadsheet = Spreadsheet'
+    { _sprSheets        :: !(Maybe [Sheet])
+    , _sprNamedRanges   :: !(Maybe [NamedRange])
+    , _sprSpreadsheetId :: !(Maybe Text)
+    , _sprProperties    :: !(Maybe SpreadsheetProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Spreadsheet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sprSheets'
+--
+-- * 'sprNamedRanges'
+--
+-- * 'sprSpreadsheetId'
+--
+-- * 'sprProperties'
+spreadsheet
+    :: Spreadsheet
+spreadsheet =
+    Spreadsheet'
+    { _sprSheets = Nothing
+    , _sprNamedRanges = Nothing
+    , _sprSpreadsheetId = Nothing
+    , _sprProperties = Nothing
+    }
+
+-- | The sheets that are part of a spreadsheet.
+sprSheets :: Lens' Spreadsheet [Sheet]
+sprSheets
+  = lens _sprSheets (\ s a -> s{_sprSheets = a}) .
+      _Default
+      . _Coerce
+
+-- | The named ranges defined in a spreadsheet.
+sprNamedRanges :: Lens' Spreadsheet [NamedRange]
+sprNamedRanges
+  = lens _sprNamedRanges
+      (\ s a -> s{_sprNamedRanges = a})
+      . _Default
+      . _Coerce
+
+-- | The ID of the spreadsheet. This field is read-only.
+sprSpreadsheetId :: Lens' Spreadsheet (Maybe Text)
+sprSpreadsheetId
+  = lens _sprSpreadsheetId
+      (\ s a -> s{_sprSpreadsheetId = a})
+
+-- | Overall properties of a spreadsheet.
+sprProperties :: Lens' Spreadsheet (Maybe SpreadsheetProperties)
+sprProperties
+  = lens _sprProperties
+      (\ s a -> s{_sprProperties = a})
+
+instance FromJSON Spreadsheet where
+        parseJSON
+          = withObject "Spreadsheet"
+              (\ o ->
+                 Spreadsheet' <$>
+                   (o .:? "sheets" .!= mempty) <*>
+                     (o .:? "namedRanges" .!= mempty)
+                     <*> (o .:? "spreadsheetId")
+                     <*> (o .:? "properties"))
+
+instance ToJSON Spreadsheet where
+        toJSON Spreadsheet'{..}
+          = object
+              (catMaybes
+                 [("sheets" .=) <$> _sprSheets,
+                  ("namedRanges" .=) <$> _sprNamedRanges,
+                  ("spreadsheetId" .=) <$> _sprSpreadsheetId,
+                  ("properties" .=) <$> _sprProperties])
+
+-- | Inserts rows or columns in a sheet at a particular index.
+--
+-- /See:/ 'insertDimensionRequest' smart constructor.
+data InsertDimensionRequest = InsertDimensionRequest'
+    { _idrRange             :: !(Maybe DimensionRange)
+    , _idrInheritFromBefore :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InsertDimensionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'idrRange'
+--
+-- * 'idrInheritFromBefore'
+insertDimensionRequest
+    :: InsertDimensionRequest
+insertDimensionRequest =
+    InsertDimensionRequest'
+    { _idrRange = Nothing
+    , _idrInheritFromBefore = Nothing
+    }
+
+-- | The dimensions to insert. Both the start and end indexes must be
+-- bounded.
+idrRange :: Lens' InsertDimensionRequest (Maybe DimensionRange)
+idrRange = lens _idrRange (\ s a -> s{_idrRange = a})
+
+-- | Whether dimension properties should be extended from the dimensions
+-- before or after the newly inserted dimensions. True to inherit from the
+-- dimensions before (in which case the start index must be greater than
+-- 0), and false to inherit from the dimensions after. For example, if row
+-- index 0 has red background and row index 1 has a green background, then
+-- inserting 2 rows at index 1 can inherit either the green or red
+-- background. If \`inheritFromBefore\` is true, the two new rows will be
+-- red (because the row before the insertion point was red), whereas if
+-- \`inheritFromBefore\` is false, the two new rows will be green (because
+-- the row after the insertion point was green).
+idrInheritFromBefore :: Lens' InsertDimensionRequest (Maybe Bool)
+idrInheritFromBefore
+  = lens _idrInheritFromBefore
+      (\ s a -> s{_idrInheritFromBefore = a})
+
+instance FromJSON InsertDimensionRequest where
+        parseJSON
+          = withObject "InsertDimensionRequest"
+              (\ o ->
+                 InsertDimensionRequest' <$>
+                   (o .:? "range") <*> (o .:? "inheritFromBefore"))
+
+instance ToJSON InsertDimensionRequest where
+        toJSON InsertDimensionRequest'{..}
+          = object
+              (catMaybes
+                 [("range" .=) <$> _idrRange,
+                  ("inheritFromBefore" .=) <$> _idrInheritFromBefore])
+
+-- | A single interpolation point on a gradient conditional format. These pin
+-- the gradient color scale according to the color, type and value chosen.
+--
+-- /See:/ 'interpolationPoint' smart constructor.
+data InterpolationPoint = InterpolationPoint'
+    { _ipColor :: !(Maybe Color)
+    , _ipValue :: !(Maybe Text)
+    , _ipType  :: !(Maybe InterpolationPointType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InterpolationPoint' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ipColor'
+--
+-- * 'ipValue'
+--
+-- * 'ipType'
+interpolationPoint
+    :: InterpolationPoint
+interpolationPoint =
+    InterpolationPoint'
+    { _ipColor = Nothing
+    , _ipValue = Nothing
+    , _ipType = Nothing
+    }
+
+-- | The color this interpolation point should use.
+ipColor :: Lens' InterpolationPoint (Maybe Color)
+ipColor = lens _ipColor (\ s a -> s{_ipColor = a})
+
+-- | The value this interpolation point uses. May be a formula. Unused if
+-- type is MIN or MAX.
+ipValue :: Lens' InterpolationPoint (Maybe Text)
+ipValue = lens _ipValue (\ s a -> s{_ipValue = a})
+
+-- | How the value should be interpreted.
+ipType :: Lens' InterpolationPoint (Maybe InterpolationPointType)
+ipType = lens _ipType (\ s a -> s{_ipType = a})
+
+instance FromJSON InterpolationPoint where
+        parseJSON
+          = withObject "InterpolationPoint"
+              (\ o ->
+                 InterpolationPoint' <$>
+                   (o .:? "color") <*> (o .:? "value") <*>
+                     (o .:? "type"))
+
+instance ToJSON InterpolationPoint where
+        toJSON InterpolationPoint'{..}
+          = object
+              (catMaybes
+                 [("color" .=) <$> _ipColor,
+                  ("value" .=) <$> _ipValue, ("type" .=) <$> _ipType])
+
+-- | Data about a specific cell.
+--
+-- /See:/ 'cellData' smart constructor.
+data CellData = CellData'
+    { _cdTextFormatRuns    :: !(Maybe [TextFormatRun])
+    , _cdNote              :: !(Maybe Text)
+    , _cdUserEnteredValue  :: !(Maybe ExtendedValue)
+    , _cdUserEnteredFormat :: !(Maybe CellFormat)
+    , _cdEffectiveFormat   :: !(Maybe CellFormat)
+    , _cdPivotTable        :: !(Maybe PivotTable)
+    , _cdFormattedValue    :: !(Maybe Text)
+    , _cdDataValidation    :: !(Maybe DataValidationRule)
+    , _cdHyperlink         :: !(Maybe Text)
+    , _cdEffectiveValue    :: !(Maybe ExtendedValue)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CellData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cdTextFormatRuns'
+--
+-- * 'cdNote'
+--
+-- * 'cdUserEnteredValue'
+--
+-- * 'cdUserEnteredFormat'
+--
+-- * 'cdEffectiveFormat'
+--
+-- * 'cdPivotTable'
+--
+-- * 'cdFormattedValue'
+--
+-- * 'cdDataValidation'
+--
+-- * 'cdHyperlink'
+--
+-- * 'cdEffectiveValue'
+cellData
+    :: CellData
+cellData =
+    CellData'
+    { _cdTextFormatRuns = Nothing
+    , _cdNote = Nothing
+    , _cdUserEnteredValue = Nothing
+    , _cdUserEnteredFormat = Nothing
+    , _cdEffectiveFormat = Nothing
+    , _cdPivotTable = Nothing
+    , _cdFormattedValue = Nothing
+    , _cdDataValidation = Nothing
+    , _cdHyperlink = Nothing
+    , _cdEffectiveValue = Nothing
+    }
+
+-- | Runs of rich text applied to subsections of the cell. Runs are only
+-- valid on user entered strings, not formulas, bools, or numbers. Runs
+-- start at specific indexes in the text and continue until the next run.
+-- Properties of a run will continue unless explicitly changed in a
+-- subsequent run (and properties of the first run will continue the
+-- properties of the cell unless explicitly changed). When writing, the new
+-- runs will overwrite any prior runs. When writing a new
+-- user_entered_value, previous runs will be erased.
+cdTextFormatRuns :: Lens' CellData [TextFormatRun]
+cdTextFormatRuns
+  = lens _cdTextFormatRuns
+      (\ s a -> s{_cdTextFormatRuns = a})
+      . _Default
+      . _Coerce
+
+-- | Any note on the cell.
+cdNote :: Lens' CellData (Maybe Text)
+cdNote = lens _cdNote (\ s a -> s{_cdNote = a})
+
+-- | The value the user entered in the cell. e.g, \`1234\`, \`\'Hello\'\`, or
+-- \`=NOW()\` Note: Dates, Times and DateTimes are represented as doubles
+-- in serial number format.
+cdUserEnteredValue :: Lens' CellData (Maybe ExtendedValue)
+cdUserEnteredValue
+  = lens _cdUserEnteredValue
+      (\ s a -> s{_cdUserEnteredValue = a})
+
+-- | The format the user entered for the cell. When writing, the new format
+-- will be merged with the existing format.
+cdUserEnteredFormat :: Lens' CellData (Maybe CellFormat)
+cdUserEnteredFormat
+  = lens _cdUserEnteredFormat
+      (\ s a -> s{_cdUserEnteredFormat = a})
+
+-- | The effective format being used by the cell. This includes the results
+-- of applying any conditional formatting and, if the cell contains a
+-- formula, the computed number format. If the effective format is the
+-- default format, effective format will not be written. This field is
+-- read-only.
+cdEffectiveFormat :: Lens' CellData (Maybe CellFormat)
+cdEffectiveFormat
+  = lens _cdEffectiveFormat
+      (\ s a -> s{_cdEffectiveFormat = a})
+
+-- | A pivot table anchored at this cell. The size of pivot table itself is
+-- computed dynamically based on its data, grouping, filters, values, etc.
+-- Only the top-left cell of the pivot table contains the pivot table
+-- definition. The other cells will contain the calculated values of the
+-- results of the pivot in their effective_value fields.
+cdPivotTable :: Lens' CellData (Maybe PivotTable)
+cdPivotTable
+  = lens _cdPivotTable (\ s a -> s{_cdPivotTable = a})
+
+-- | The formatted value of the cell. This is the value as it\'s shown to the
+-- user. This field is read-only.
+cdFormattedValue :: Lens' CellData (Maybe Text)
+cdFormattedValue
+  = lens _cdFormattedValue
+      (\ s a -> s{_cdFormattedValue = a})
+
+-- | A data validation rule on the cell, if any. When writing, the new data
+-- validation rule will overwrite any prior rule.
+cdDataValidation :: Lens' CellData (Maybe DataValidationRule)
+cdDataValidation
+  = lens _cdDataValidation
+      (\ s a -> s{_cdDataValidation = a})
+
+-- | A hyperlink this cell points to, if any. This field is read-only. (To
+-- set it, use a \`=HYPERLINK\` formula.)
+cdHyperlink :: Lens' CellData (Maybe Text)
+cdHyperlink
+  = lens _cdHyperlink (\ s a -> s{_cdHyperlink = a})
+
+-- | The effective value of the cell. For cells with formulas, this will be
+-- the calculated value. For cells with literals, this will be the same as
+-- the user_entered_value. This field is read-only.
+cdEffectiveValue :: Lens' CellData (Maybe ExtendedValue)
+cdEffectiveValue
+  = lens _cdEffectiveValue
+      (\ s a -> s{_cdEffectiveValue = a})
+
+instance FromJSON CellData where
+        parseJSON
+          = withObject "CellData"
+              (\ o ->
+                 CellData' <$>
+                   (o .:? "textFormatRuns" .!= mempty) <*>
+                     (o .:? "note")
+                     <*> (o .:? "userEnteredValue")
+                     <*> (o .:? "userEnteredFormat")
+                     <*> (o .:? "effectiveFormat")
+                     <*> (o .:? "pivotTable")
+                     <*> (o .:? "formattedValue")
+                     <*> (o .:? "dataValidation")
+                     <*> (o .:? "hyperlink")
+                     <*> (o .:? "effectiveValue"))
+
+instance ToJSON CellData where
+        toJSON CellData'{..}
+          = object
+              (catMaybes
+                 [("textFormatRuns" .=) <$> _cdTextFormatRuns,
+                  ("note" .=) <$> _cdNote,
+                  ("userEnteredValue" .=) <$> _cdUserEnteredValue,
+                  ("userEnteredFormat" .=) <$> _cdUserEnteredFormat,
+                  ("effectiveFormat" .=) <$> _cdEffectiveFormat,
+                  ("pivotTable" .=) <$> _cdPivotTable,
+                  ("formattedValue" .=) <$> _cdFormattedValue,
+                  ("dataValidation" .=) <$> _cdDataValidation,
+                  ("hyperlink" .=) <$> _cdHyperlink,
+                  ("effectiveValue" .=) <$> _cdEffectiveValue])
+
+-- | Source ranges for a chart.
+--
+-- /See:/ 'chartSourceRange' smart constructor.
+newtype ChartSourceRange = ChartSourceRange'
+    { _csrSources :: Maybe [GridRange]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ChartSourceRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csrSources'
+chartSourceRange
+    :: ChartSourceRange
+chartSourceRange =
+    ChartSourceRange'
+    { _csrSources = Nothing
+    }
+
+-- | The ranges of data for a series or domain. Exactly one dimension must
+-- have a length of 1, and all sources in the list must have the same
+-- dimension with length 1. The domain (if it exists) & all series must
+-- have the same number of source ranges. If using more than one source
+-- range, then the source range at a given offset must be contiguous across
+-- the domain and series. For example, these are valid configurations:
+-- domain sources: A1:A5 series1 sources: B1:B5 series2 sources: D6:D10
+-- domain sources: A1:A5, C10:C12 series1 sources: B1:B5, D10:D12 series2
+-- sources: C1:C5, E10:E12
+csrSources :: Lens' ChartSourceRange [GridRange]
+csrSources
+  = lens _csrSources (\ s a -> s{_csrSources = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON ChartSourceRange where
+        parseJSON
+          = withObject "ChartSourceRange"
+              (\ o ->
+                 ChartSourceRange' <$> (o .:? "sources" .!= mempty))
+
+instance ToJSON ChartSourceRange where
+        toJSON ChartSourceRange'{..}
+          = object (catMaybes [("sources" .=) <$> _csrSources])
+
+-- | The result of adding a named range.
+--
+-- /See:/ 'addNamedRangeResponse' smart constructor.
+newtype AddNamedRangeResponse = AddNamedRangeResponse'
+    { _anrrNamedRange :: Maybe NamedRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddNamedRangeResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'anrrNamedRange'
+addNamedRangeResponse
+    :: AddNamedRangeResponse
+addNamedRangeResponse =
+    AddNamedRangeResponse'
+    { _anrrNamedRange = Nothing
+    }
+
+-- | The named range to add.
+anrrNamedRange :: Lens' AddNamedRangeResponse (Maybe NamedRange)
+anrrNamedRange
+  = lens _anrrNamedRange
+      (\ s a -> s{_anrrNamedRange = a})
+
+instance FromJSON AddNamedRangeResponse where
+        parseJSON
+          = withObject "AddNamedRangeResponse"
+              (\ o ->
+                 AddNamedRangeResponse' <$> (o .:? "namedRange"))
+
+instance ToJSON AddNamedRangeResponse where
+        toJSON AddNamedRangeResponse'{..}
+          = object
+              (catMaybes [("namedRange" .=) <$> _anrrNamedRange])
+
+-- | The result of adding a chart to a spreadsheet.
+--
+-- /See:/ 'addChartResponse' smart constructor.
+newtype AddChartResponse = AddChartResponse'
+    { _acrChart :: Maybe EmbeddedChart
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddChartResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acrChart'
+addChartResponse
+    :: AddChartResponse
+addChartResponse =
+    AddChartResponse'
+    { _acrChart = Nothing
+    }
+
+-- | The newly added chart.
+acrChart :: Lens' AddChartResponse (Maybe EmbeddedChart)
+acrChart = lens _acrChart (\ s a -> s{_acrChart = a})
+
+instance FromJSON AddChartResponse where
+        parseJSON
+          = withObject "AddChartResponse"
+              (\ o -> AddChartResponse' <$> (o .:? "chart"))
+
+instance ToJSON AddChartResponse where
+        toJSON AddChartResponse'{..}
+          = object (catMaybes [("chart" .=) <$> _acrChart])
+
+-- | Updates a chart\'s specifications. (This does not move or resize a
+-- chart. To move or resize a chart, use
+-- UpdateEmbeddedObjectPositionRequest.)
+--
+-- /See:/ 'updateChartSpecRequest' smart constructor.
+data UpdateChartSpecRequest = UpdateChartSpecRequest'
+    { _ucsrSpec    :: !(Maybe ChartSpec)
+    , _ucsrChartId :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateChartSpecRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucsrSpec'
+--
+-- * 'ucsrChartId'
+updateChartSpecRequest
+    :: UpdateChartSpecRequest
+updateChartSpecRequest =
+    UpdateChartSpecRequest'
+    { _ucsrSpec = Nothing
+    , _ucsrChartId = Nothing
+    }
+
+-- | The specification to apply to the chart.
+ucsrSpec :: Lens' UpdateChartSpecRequest (Maybe ChartSpec)
+ucsrSpec = lens _ucsrSpec (\ s a -> s{_ucsrSpec = a})
+
+-- | The ID of the chart to update.
+ucsrChartId :: Lens' UpdateChartSpecRequest (Maybe Int32)
+ucsrChartId
+  = lens _ucsrChartId (\ s a -> s{_ucsrChartId = a}) .
+      mapping _Coerce
+
+instance FromJSON UpdateChartSpecRequest where
+        parseJSON
+          = withObject "UpdateChartSpecRequest"
+              (\ o ->
+                 UpdateChartSpecRequest' <$>
+                   (o .:? "spec") <*> (o .:? "chartId"))
+
+instance ToJSON UpdateChartSpecRequest where
+        toJSON UpdateChartSpecRequest'{..}
+          = object
+              (catMaybes
+                 [("spec" .=) <$> _ucsrSpec,
+                  ("chartId" .=) <$> _ucsrChartId])
+
+-- | Sets the basic filter associated with a sheet.
+--
+-- /See:/ 'setBasicFilterRequest' smart constructor.
+newtype SetBasicFilterRequest = SetBasicFilterRequest'
+    { _sbfrFilter :: Maybe BasicFilter
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetBasicFilterRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sbfrFilter'
+setBasicFilterRequest
+    :: SetBasicFilterRequest
+setBasicFilterRequest =
+    SetBasicFilterRequest'
+    { _sbfrFilter = Nothing
+    }
+
+-- | The filter to set.
+sbfrFilter :: Lens' SetBasicFilterRequest (Maybe BasicFilter)
+sbfrFilter
+  = lens _sbfrFilter (\ s a -> s{_sbfrFilter = a})
+
+instance FromJSON SetBasicFilterRequest where
+        parseJSON
+          = withObject "SetBasicFilterRequest"
+              (\ o -> SetBasicFilterRequest' <$> (o .:? "filter"))
+
+instance ToJSON SetBasicFilterRequest where
+        toJSON SetBasicFilterRequest'{..}
+          = object (catMaybes [("filter" .=) <$> _sbfrFilter])
+
+-- | Properties of a grid.
+--
+-- /See:/ 'gridProperties' smart constructor.
+data GridProperties = GridProperties'
+    { _gpFrozenColumnCount :: !(Maybe (Textual Int32))
+    , _gpColumnCount       :: !(Maybe (Textual Int32))
+    , _gpHideGridlines     :: !(Maybe Bool)
+    , _gpFrozenRowCount    :: !(Maybe (Textual Int32))
+    , _gpRowCount          :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GridProperties' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gpFrozenColumnCount'
+--
+-- * 'gpColumnCount'
+--
+-- * 'gpHideGridlines'
+--
+-- * 'gpFrozenRowCount'
+--
+-- * 'gpRowCount'
+gridProperties
+    :: GridProperties
+gridProperties =
+    GridProperties'
+    { _gpFrozenColumnCount = Nothing
+    , _gpColumnCount = Nothing
+    , _gpHideGridlines = Nothing
+    , _gpFrozenRowCount = Nothing
+    , _gpRowCount = Nothing
+    }
+
+-- | The number of columns that are frozen in the grid.
+gpFrozenColumnCount :: Lens' GridProperties (Maybe Int32)
+gpFrozenColumnCount
+  = lens _gpFrozenColumnCount
+      (\ s a -> s{_gpFrozenColumnCount = a})
+      . mapping _Coerce
+
+-- | The number of columns in the grid.
+gpColumnCount :: Lens' GridProperties (Maybe Int32)
+gpColumnCount
+  = lens _gpColumnCount
+      (\ s a -> s{_gpColumnCount = a})
+      . mapping _Coerce
+
+-- | True if the grid isn\'t showing gridlines in the UI.
+gpHideGridlines :: Lens' GridProperties (Maybe Bool)
+gpHideGridlines
+  = lens _gpHideGridlines
+      (\ s a -> s{_gpHideGridlines = a})
+
+-- | The number of rows that are frozen in the grid.
+gpFrozenRowCount :: Lens' GridProperties (Maybe Int32)
+gpFrozenRowCount
+  = lens _gpFrozenRowCount
+      (\ s a -> s{_gpFrozenRowCount = a})
+      . mapping _Coerce
+
+-- | The number of rows in the grid.
+gpRowCount :: Lens' GridProperties (Maybe Int32)
+gpRowCount
+  = lens _gpRowCount (\ s a -> s{_gpRowCount = a}) .
+      mapping _Coerce
+
+instance FromJSON GridProperties where
+        parseJSON
+          = withObject "GridProperties"
+              (\ o ->
+                 GridProperties' <$>
+                   (o .:? "frozenColumnCount") <*> (o .:? "columnCount")
+                     <*> (o .:? "hideGridlines")
+                     <*> (o .:? "frozenRowCount")
+                     <*> (o .:? "rowCount"))
+
+instance ToJSON GridProperties where
+        toJSON GridProperties'{..}
+          = object
+              (catMaybes
+                 [("frozenColumnCount" .=) <$> _gpFrozenColumnCount,
+                  ("columnCount" .=) <$> _gpColumnCount,
+                  ("hideGridlines" .=) <$> _gpHideGridlines,
+                  ("frozenRowCount" .=) <$> _gpFrozenRowCount,
+                  ("rowCount" .=) <$> _gpRowCount])
+
+-- | The criteria for showing\/hiding values per column. The map\'s key is
+-- the column index, and the value is the criteria for that column.
+--
+-- /See:/ 'basicFilterCriteria' smart constructor.
+newtype BasicFilterCriteria = BasicFilterCriteria'
+    { _bfcAddtional :: HashMap Text FilterCriteria
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicFilterCriteria' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bfcAddtional'
+basicFilterCriteria
+    :: HashMap Text FilterCriteria -- ^ 'bfcAddtional'
+    -> BasicFilterCriteria
+basicFilterCriteria pBfcAddtional_ =
+    BasicFilterCriteria'
+    { _bfcAddtional = _Coerce # pBfcAddtional_
+    }
+
+bfcAddtional :: Lens' BasicFilterCriteria (HashMap Text FilterCriteria)
+bfcAddtional
+  = lens _bfcAddtional (\ s a -> s{_bfcAddtional = a})
+      . _Coerce
+
+instance FromJSON BasicFilterCriteria where
+        parseJSON
+          = withObject "BasicFilterCriteria"
+              (\ o -> BasicFilterCriteria' <$> (parseJSONObject o))
+
+instance ToJSON BasicFilterCriteria where
+        toJSON = toJSON . _bfcAddtional
+
+-- | Updates properties of dimensions within the specified range.
+--
+-- /See:/ 'updateDimensionPropertiesRequest' smart constructor.
+data UpdateDimensionPropertiesRequest = UpdateDimensionPropertiesRequest'
+    { _udprRange      :: !(Maybe DimensionRange)
+    , _udprFields     :: !(Maybe FieldMask)
+    , _udprProperties :: !(Maybe DimensionProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateDimensionPropertiesRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'udprRange'
+--
+-- * 'udprFields'
+--
+-- * 'udprProperties'
+updateDimensionPropertiesRequest
+    :: UpdateDimensionPropertiesRequest
+updateDimensionPropertiesRequest =
+    UpdateDimensionPropertiesRequest'
+    { _udprRange = Nothing
+    , _udprFields = Nothing
+    , _udprProperties = Nothing
+    }
+
+-- | The rows or columns to update.
+udprRange :: Lens' UpdateDimensionPropertiesRequest (Maybe DimensionRange)
+udprRange
+  = lens _udprRange (\ s a -> s{_udprRange = a})
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`properties\` is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+udprFields :: Lens' UpdateDimensionPropertiesRequest (Maybe FieldMask)
+udprFields
+  = lens _udprFields (\ s a -> s{_udprFields = a})
+
+-- | Properties to update.
+udprProperties :: Lens' UpdateDimensionPropertiesRequest (Maybe DimensionProperties)
+udprProperties
+  = lens _udprProperties
+      (\ s a -> s{_udprProperties = a})
+
+instance FromJSON UpdateDimensionPropertiesRequest
+         where
+        parseJSON
+          = withObject "UpdateDimensionPropertiesRequest"
+              (\ o ->
+                 UpdateDimensionPropertiesRequest' <$>
+                   (o .:? "range") <*> (o .:? "fields") <*>
+                     (o .:? "properties"))
+
+instance ToJSON UpdateDimensionPropertiesRequest
+         where
+        toJSON UpdateDimensionPropertiesRequest'{..}
+          = object
+              (catMaybes
+                 [("range" .=) <$> _udprRange,
+                  ("fields" .=) <$> _udprFields,
+                  ("properties" .=) <$> _udprProperties])
+
+-- | An optional mapping of filters per source column offset. The filters
+-- will be applied before aggregating data into the pivot table. The map\'s
+-- key is the column offset of the source range that you want to filter,
+-- and the value is the criteria for that column. For example, if the
+-- source was \`C10:E15\`, a key of \`0\` will have the filter for column
+-- \`C\`, whereas the key \`1\` is for column \`D\`.
+--
+-- /See:/ 'pivotTableCriteria' smart constructor.
+newtype PivotTableCriteria = PivotTableCriteria'
+    { _ptcAddtional :: HashMap Text PivotFilterCriteria
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotTableCriteria' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ptcAddtional'
+pivotTableCriteria
+    :: HashMap Text PivotFilterCriteria -- ^ 'ptcAddtional'
+    -> PivotTableCriteria
+pivotTableCriteria pPtcAddtional_ =
+    PivotTableCriteria'
+    { _ptcAddtional = _Coerce # pPtcAddtional_
+    }
+
+ptcAddtional :: Lens' PivotTableCriteria (HashMap Text PivotFilterCriteria)
+ptcAddtional
+  = lens _ptcAddtional (\ s a -> s{_ptcAddtional = a})
+      . _Coerce
+
+instance FromJSON PivotTableCriteria where
+        parseJSON
+          = withObject "PivotTableCriteria"
+              (\ o -> PivotTableCriteria' <$> (parseJSONObject o))
+
+instance ToJSON PivotTableCriteria where
+        toJSON = toJSON . _ptcAddtional
+
+-- | Fills in more data based on existing data.
+--
+-- /See:/ 'autoFillRequest' smart constructor.
+data AutoFillRequest = AutoFillRequest'
+    { _afrSourceAndDestination :: !(Maybe SourceAndDestination)
+    , _afrUseAlternateSeries   :: !(Maybe Bool)
+    , _afrRange                :: !(Maybe GridRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AutoFillRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'afrSourceAndDestination'
+--
+-- * 'afrUseAlternateSeries'
+--
+-- * 'afrRange'
+autoFillRequest
+    :: AutoFillRequest
+autoFillRequest =
+    AutoFillRequest'
+    { _afrSourceAndDestination = Nothing
+    , _afrUseAlternateSeries = Nothing
+    , _afrRange = Nothing
+    }
+
+-- | The source and destination areas to autofill. This explicitly lists the
+-- source of the autofill and where to extend that data.
+afrSourceAndDestination :: Lens' AutoFillRequest (Maybe SourceAndDestination)
+afrSourceAndDestination
+  = lens _afrSourceAndDestination
+      (\ s a -> s{_afrSourceAndDestination = a})
+
+-- | True if we should generate data with the \"alternate\" series. This
+-- differs based on the type and amount of source data.
+afrUseAlternateSeries :: Lens' AutoFillRequest (Maybe Bool)
+afrUseAlternateSeries
+  = lens _afrUseAlternateSeries
+      (\ s a -> s{_afrUseAlternateSeries = a})
+
+-- | The range to autofill. This will examine the range and detect the
+-- location that has data and automatically fill that data in to the rest
+-- of the range.
+afrRange :: Lens' AutoFillRequest (Maybe GridRange)
+afrRange = lens _afrRange (\ s a -> s{_afrRange = a})
+
+instance FromJSON AutoFillRequest where
+        parseJSON
+          = withObject "AutoFillRequest"
+              (\ o ->
+                 AutoFillRequest' <$>
+                   (o .:? "sourceAndDestination") <*>
+                     (o .:? "useAlternateSeries")
+                     <*> (o .:? "range"))
+
+instance ToJSON AutoFillRequest where
+        toJSON AutoFillRequest'{..}
+          = object
+              (catMaybes
+                 [("sourceAndDestination" .=) <$>
+                    _afrSourceAndDestination,
+                  ("useAlternateSeries" .=) <$> _afrUseAlternateSeries,
+                  ("range" .=) <$> _afrRange])
+
+-- | Duplicates the contents of a sheet.
+--
+-- /See:/ 'duplicateSheetRequest' smart constructor.
+data DuplicateSheetRequest = DuplicateSheetRequest'
+    { _dsrNewSheetName     :: !(Maybe Text)
+    , _dsrInsertSheetIndex :: !(Maybe (Textual Int32))
+    , _dsrSourceSheetId    :: !(Maybe (Textual Int32))
+    , _dsrNewSheetId       :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DuplicateSheetRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrNewSheetName'
+--
+-- * 'dsrInsertSheetIndex'
+--
+-- * 'dsrSourceSheetId'
+--
+-- * 'dsrNewSheetId'
+duplicateSheetRequest
+    :: DuplicateSheetRequest
+duplicateSheetRequest =
+    DuplicateSheetRequest'
+    { _dsrNewSheetName = Nothing
+    , _dsrInsertSheetIndex = Nothing
+    , _dsrSourceSheetId = Nothing
+    , _dsrNewSheetId = Nothing
+    }
+
+-- | The name of the new sheet. If empty, a new name is chosen for you.
+dsrNewSheetName :: Lens' DuplicateSheetRequest (Maybe Text)
+dsrNewSheetName
+  = lens _dsrNewSheetName
+      (\ s a -> s{_dsrNewSheetName = a})
+
+-- | The zero-based index where the new sheet should be inserted. The index
+-- of all sheets after this are incremented.
+dsrInsertSheetIndex :: Lens' DuplicateSheetRequest (Maybe Int32)
+dsrInsertSheetIndex
+  = lens _dsrInsertSheetIndex
+      (\ s a -> s{_dsrInsertSheetIndex = a})
+      . mapping _Coerce
+
+-- | The sheet to duplicate.
+dsrSourceSheetId :: Lens' DuplicateSheetRequest (Maybe Int32)
+dsrSourceSheetId
+  = lens _dsrSourceSheetId
+      (\ s a -> s{_dsrSourceSheetId = a})
+      . mapping _Coerce
+
+-- | If set, the ID of the new sheet. If not set, an ID is chosen. If set,
+-- the ID must not conflict with any existing sheet ID. If set, it must be
+-- non-negative.
+dsrNewSheetId :: Lens' DuplicateSheetRequest (Maybe Int32)
+dsrNewSheetId
+  = lens _dsrNewSheetId
+      (\ s a -> s{_dsrNewSheetId = a})
+      . mapping _Coerce
+
+instance FromJSON DuplicateSheetRequest where
+        parseJSON
+          = withObject "DuplicateSheetRequest"
+              (\ o ->
+                 DuplicateSheetRequest' <$>
+                   (o .:? "newSheetName") <*> (o .:? "insertSheetIndex")
+                     <*> (o .:? "sourceSheetId")
+                     <*> (o .:? "newSheetId"))
+
+instance ToJSON DuplicateSheetRequest where
+        toJSON DuplicateSheetRequest'{..}
+          = object
+              (catMaybes
+                 [("newSheetName" .=) <$> _dsrNewSheetName,
+                  ("insertSheetIndex" .=) <$> _dsrInsertSheetIndex,
+                  ("sourceSheetId" .=) <$> _dsrSourceSheetId,
+                  ("newSheetId" .=) <$> _dsrNewSheetId])
+
+-- | The result of a filter view being duplicated.
+--
+-- /See:/ 'duplicateFilterViewResponse' smart constructor.
+newtype DuplicateFilterViewResponse = DuplicateFilterViewResponse'
+    { _dfvrFilter :: Maybe FilterView
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DuplicateFilterViewResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dfvrFilter'
+duplicateFilterViewResponse
+    :: DuplicateFilterViewResponse
+duplicateFilterViewResponse =
+    DuplicateFilterViewResponse'
+    { _dfvrFilter = Nothing
+    }
+
+-- | The newly created filter.
+dfvrFilter :: Lens' DuplicateFilterViewResponse (Maybe FilterView)
+dfvrFilter
+  = lens _dfvrFilter (\ s a -> s{_dfvrFilter = a})
+
+instance FromJSON DuplicateFilterViewResponse where
+        parseJSON
+          = withObject "DuplicateFilterViewResponse"
+              (\ o ->
+                 DuplicateFilterViewResponse' <$> (o .:? "filter"))
+
+instance ToJSON DuplicateFilterViewResponse where
+        toJSON DuplicateFilterViewResponse'{..}
+          = object (catMaybes [("filter" .=) <$> _dfvrFilter])
+
+-- | The request for updating more than one range of values in a spreadsheet.
+--
+-- /See:/ 'batchUpdateValuesRequest' smart constructor.
+data BatchUpdateValuesRequest = BatchUpdateValuesRequest'
+    { _buvrData             :: !(Maybe [ValueRange])
+    , _buvrValueInputOption :: !(Maybe BatchUpdateValuesRequestValueInputOption)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchUpdateValuesRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'buvrData'
+--
+-- * 'buvrValueInputOption'
+batchUpdateValuesRequest
+    :: BatchUpdateValuesRequest
+batchUpdateValuesRequest =
+    BatchUpdateValuesRequest'
+    { _buvrData = Nothing
+    , _buvrValueInputOption = Nothing
+    }
+
+-- | The new values to apply to the spreadsheet.
+buvrData :: Lens' BatchUpdateValuesRequest [ValueRange]
+buvrData
+  = lens _buvrData (\ s a -> s{_buvrData = a}) .
+      _Default
+      . _Coerce
+
+-- | How the input data should be interpreted.
+buvrValueInputOption :: Lens' BatchUpdateValuesRequest (Maybe BatchUpdateValuesRequestValueInputOption)
+buvrValueInputOption
+  = lens _buvrValueInputOption
+      (\ s a -> s{_buvrValueInputOption = a})
+
+instance FromJSON BatchUpdateValuesRequest where
+        parseJSON
+          = withObject "BatchUpdateValuesRequest"
+              (\ o ->
+                 BatchUpdateValuesRequest' <$>
+                   (o .:? "data" .!= mempty) <*>
+                     (o .:? "valueInputOption"))
+
+instance ToJSON BatchUpdateValuesRequest where
+        toJSON BatchUpdateValuesRequest'{..}
+          = object
+              (catMaybes
+                 [("data" .=) <$> _buvrData,
+                  ("valueInputOption" .=) <$> _buvrValueInputOption])
+
+-- | Adds a chart to a sheet in the spreadsheet.
+--
+-- /See:/ 'addChartRequest' smart constructor.
+newtype AddChartRequest = AddChartRequest'
+    { _aChart :: Maybe EmbeddedChart
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddChartRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aChart'
+addChartRequest
+    :: AddChartRequest
+addChartRequest =
+    AddChartRequest'
+    { _aChart = Nothing
+    }
+
+-- | The chart that should be added to the spreadsheet, including the
+-- position where it should be placed.
+aChart :: Lens' AddChartRequest (Maybe EmbeddedChart)
+aChart = lens _aChart (\ s a -> s{_aChart = a})
+
+instance FromJSON AddChartRequest where
+        parseJSON
+          = withObject "AddChartRequest"
+              (\ o -> AddChartRequest' <$> (o .:? "chart"))
+
+instance ToJSON AddChartRequest where
+        toJSON AddChartRequest'{..}
+          = object (catMaybes [("chart" .=) <$> _aChart])
+
+-- | A named range.
+--
+-- /See:/ 'namedRange' smart constructor.
+data NamedRange = NamedRange'
+    { _nrNamedRangeId :: !(Maybe Text)
+    , _nrName         :: !(Maybe Text)
+    , _nrRange        :: !(Maybe GridRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NamedRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'nrNamedRangeId'
+--
+-- * 'nrName'
+--
+-- * 'nrRange'
+namedRange
+    :: NamedRange
+namedRange =
+    NamedRange'
+    { _nrNamedRangeId = Nothing
+    , _nrName = Nothing
+    , _nrRange = Nothing
+    }
+
+-- | The ID of the named range.
+nrNamedRangeId :: Lens' NamedRange (Maybe Text)
+nrNamedRangeId
+  = lens _nrNamedRangeId
+      (\ s a -> s{_nrNamedRangeId = a})
+
+-- | The name of the named range.
+nrName :: Lens' NamedRange (Maybe Text)
+nrName = lens _nrName (\ s a -> s{_nrName = a})
+
+-- | The range this represents.
+nrRange :: Lens' NamedRange (Maybe GridRange)
+nrRange = lens _nrRange (\ s a -> s{_nrRange = a})
+
+instance FromJSON NamedRange where
+        parseJSON
+          = withObject "NamedRange"
+              (\ o ->
+                 NamedRange' <$>
+                   (o .:? "namedRangeId") <*> (o .:? "name") <*>
+                     (o .:? "range"))
+
+instance ToJSON NamedRange where
+        toJSON NamedRange'{..}
+          = object
+              (catMaybes
+                 [("namedRangeId" .=) <$> _nrNamedRangeId,
+                  ("name" .=) <$> _nrName, ("range" .=) <$> _nrRange])
+
+-- | Merges all cells in the range.
+--
+-- /See:/ 'mergeCellsRequest' smart constructor.
+data MergeCellsRequest = MergeCellsRequest'
+    { _mcrMergeType :: !(Maybe MergeCellsRequestMergeType)
+    , _mcrRange     :: !(Maybe GridRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'MergeCellsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mcrMergeType'
+--
+-- * 'mcrRange'
+mergeCellsRequest
+    :: MergeCellsRequest
+mergeCellsRequest =
+    MergeCellsRequest'
+    { _mcrMergeType = Nothing
+    , _mcrRange = Nothing
+    }
+
+-- | How the cells should be merged.
+mcrMergeType :: Lens' MergeCellsRequest (Maybe MergeCellsRequestMergeType)
+mcrMergeType
+  = lens _mcrMergeType (\ s a -> s{_mcrMergeType = a})
+
+-- | The range of cells to merge.
+mcrRange :: Lens' MergeCellsRequest (Maybe GridRange)
+mcrRange = lens _mcrRange (\ s a -> s{_mcrRange = a})
+
+instance FromJSON MergeCellsRequest where
+        parseJSON
+          = withObject "MergeCellsRequest"
+              (\ o ->
+                 MergeCellsRequest' <$>
+                   (o .:? "mergeType") <*> (o .:? "range"))
+
+instance ToJSON MergeCellsRequest where
+        toJSON MergeCellsRequest'{..}
+          = object
+              (catMaybes
+                 [("mergeType" .=) <$> _mcrMergeType,
+                  ("range" .=) <$> _mcrRange])
+
+-- | A border along a cell.
+--
+-- /See:/ 'bOrder' smart constructor.
+data BOrder = BOrder'
+    { _boStyle :: !(Maybe BOrderStyle)
+    , _boColor :: !(Maybe Color)
+    , _boWidth :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BOrder' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'boStyle'
+--
+-- * 'boColor'
+--
+-- * 'boWidth'
+bOrder
+    :: BOrder
+bOrder =
+    BOrder'
+    { _boStyle = Nothing
+    , _boColor = Nothing
+    , _boWidth = Nothing
+    }
+
+-- | The style of the border.
+boStyle :: Lens' BOrder (Maybe BOrderStyle)
+boStyle = lens _boStyle (\ s a -> s{_boStyle = a})
+
+-- | The color of the border.
+boColor :: Lens' BOrder (Maybe Color)
+boColor = lens _boColor (\ s a -> s{_boColor = a})
+
+-- | The width of the border, in pixels. Border widths must be between 0 and
+-- 3 pixels, inclusive.
+boWidth :: Lens' BOrder (Maybe Int32)
+boWidth
+  = lens _boWidth (\ s a -> s{_boWidth = a}) .
+      mapping _Coerce
+
+instance FromJSON BOrder where
+        parseJSON
+          = withObject "BOrder"
+              (\ o ->
+                 BOrder' <$>
+                   (o .:? "style") <*> (o .:? "color") <*>
+                     (o .:? "width"))
+
+instance ToJSON BOrder where
+        toJSON BOrder'{..}
+          = object
+              (catMaybes
+                 [("style" .=) <$> _boStyle,
+                  ("color" .=) <$> _boColor,
+                  ("width" .=) <$> _boWidth])
+
+-- | The kinds of value that a cell in a spreadsheet can have.
+--
+-- /See:/ 'extendedValue' smart constructor.
+data ExtendedValue = ExtendedValue'
+    { _evBoolValue    :: !(Maybe Bool)
+    , _evNumberValue  :: !(Maybe (Textual Double))
+    , _evErrorValue   :: !(Maybe ErrorValue)
+    , _evStringValue  :: !(Maybe Text)
+    , _evFormulaValue :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ExtendedValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'evBoolValue'
+--
+-- * 'evNumberValue'
+--
+-- * 'evErrorValue'
+--
+-- * 'evStringValue'
+--
+-- * 'evFormulaValue'
+extendedValue
+    :: ExtendedValue
+extendedValue =
+    ExtendedValue'
+    { _evBoolValue = Nothing
+    , _evNumberValue = Nothing
+    , _evErrorValue = Nothing
+    , _evStringValue = Nothing
+    , _evFormulaValue = Nothing
+    }
+
+-- | Represents a boolean value.
+evBoolValue :: Lens' ExtendedValue (Maybe Bool)
+evBoolValue
+  = lens _evBoolValue (\ s a -> s{_evBoolValue = a})
+
+-- | Represents a double value. Note: Dates, Times and DateTimes are
+-- represented as doubles in \"serial number\" format.
+evNumberValue :: Lens' ExtendedValue (Maybe Double)
+evNumberValue
+  = lens _evNumberValue
+      (\ s a -> s{_evNumberValue = a})
+      . mapping _Coerce
+
+-- | Represents an error. This field is read-only.
+evErrorValue :: Lens' ExtendedValue (Maybe ErrorValue)
+evErrorValue
+  = lens _evErrorValue (\ s a -> s{_evErrorValue = a})
+
+-- | Represents a string value. Leading single quotes are not included. For
+-- example, if the user typed \`\'123\` into the UI, this would be
+-- represented as a \`stringValue\` of \`\"123\"\`.
+evStringValue :: Lens' ExtendedValue (Maybe Text)
+evStringValue
+  = lens _evStringValue
+      (\ s a -> s{_evStringValue = a})
+
+-- | Represents a formula.
+evFormulaValue :: Lens' ExtendedValue (Maybe Text)
+evFormulaValue
+  = lens _evFormulaValue
+      (\ s a -> s{_evFormulaValue = a})
+
+instance FromJSON ExtendedValue where
+        parseJSON
+          = withObject "ExtendedValue"
+              (\ o ->
+                 ExtendedValue' <$>
+                   (o .:? "boolValue") <*> (o .:? "numberValue") <*>
+                     (o .:? "errorValue")
+                     <*> (o .:? "stringValue")
+                     <*> (o .:? "formulaValue"))
+
+instance ToJSON ExtendedValue where
+        toJSON ExtendedValue'{..}
+          = object
+              (catMaybes
+                 [("boolValue" .=) <$> _evBoolValue,
+                  ("numberValue" .=) <$> _evNumberValue,
+                  ("errorValue" .=) <$> _evErrorValue,
+                  ("stringValue" .=) <$> _evStringValue,
+                  ("formulaValue" .=) <$> _evFormulaValue])
+
+-- | Adds a named range to the spreadsheet.
+--
+-- /See:/ 'addNamedRangeRequest' smart constructor.
+newtype AddNamedRangeRequest = AddNamedRangeRequest'
+    { _aNamedRange :: Maybe NamedRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddNamedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aNamedRange'
+addNamedRangeRequest
+    :: AddNamedRangeRequest
+addNamedRangeRequest =
+    AddNamedRangeRequest'
+    { _aNamedRange = Nothing
+    }
+
+-- | The named range to add. If a non-empty namedRangeId is specified, the
+-- named range will use that ID. (It is an error to specify the ID of a
+-- named range that already exists.)
+aNamedRange :: Lens' AddNamedRangeRequest (Maybe NamedRange)
+aNamedRange
+  = lens _aNamedRange (\ s a -> s{_aNamedRange = a})
+
+instance FromJSON AddNamedRangeRequest where
+        parseJSON
+          = withObject "AddNamedRangeRequest"
+              (\ o ->
+                 AddNamedRangeRequest' <$> (o .:? "namedRange"))
+
+instance ToJSON AddNamedRangeRequest where
+        toJSON AddNamedRangeRequest'{..}
+          = object
+              (catMaybes [("namedRange" .=) <$> _aNamedRange])
+
+-- | Criteria for showing\/hiding rows in a pivot table.
+--
+-- /See:/ 'pivotFilterCriteria' smart constructor.
+newtype PivotFilterCriteria = PivotFilterCriteria'
+    { _pfcVisibleValues :: Maybe [Text]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotFilterCriteria' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pfcVisibleValues'
+pivotFilterCriteria
+    :: PivotFilterCriteria
+pivotFilterCriteria =
+    PivotFilterCriteria'
+    { _pfcVisibleValues = Nothing
+    }
+
+-- | Values that should be included. Values not listed here are excluded.
+pfcVisibleValues :: Lens' PivotFilterCriteria [Text]
+pfcVisibleValues
+  = lens _pfcVisibleValues
+      (\ s a -> s{_pfcVisibleValues = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON PivotFilterCriteria where
+        parseJSON
+          = withObject "PivotFilterCriteria"
+              (\ o ->
+                 PivotFilterCriteria' <$>
+                   (o .:? "visibleValues" .!= mempty))
+
+instance ToJSON PivotFilterCriteria where
+        toJSON PivotFilterCriteria'{..}
+          = object
+              (catMaybes
+                 [("visibleValues" .=) <$> _pfcVisibleValues])
+
+-- | A range along a single dimension on a sheet. All indexes are zero-based.
+-- Indexes are half open: the start index is inclusive and the end index is
+-- exclusive. Missing indexes indicate the range is unbounded on that side.
+--
+-- /See:/ 'dimensionRange' smart constructor.
+data DimensionRange = DimensionRange'
+    { _drDimension  :: !(Maybe DimensionRangeDimension)
+    , _drEndIndex   :: !(Maybe (Textual Int32))
+    , _drSheetId    :: !(Maybe (Textual Int32))
+    , _drStartIndex :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DimensionRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drDimension'
+--
+-- * 'drEndIndex'
+--
+-- * 'drSheetId'
+--
+-- * 'drStartIndex'
+dimensionRange
+    :: DimensionRange
+dimensionRange =
+    DimensionRange'
+    { _drDimension = Nothing
+    , _drEndIndex = Nothing
+    , _drSheetId = Nothing
+    , _drStartIndex = Nothing
+    }
+
+-- | The dimension of the span.
+drDimension :: Lens' DimensionRange (Maybe DimensionRangeDimension)
+drDimension
+  = lens _drDimension (\ s a -> s{_drDimension = a})
+
+-- | The end (exclusive) of the span, or not set if unbounded.
+drEndIndex :: Lens' DimensionRange (Maybe Int32)
+drEndIndex
+  = lens _drEndIndex (\ s a -> s{_drEndIndex = a}) .
+      mapping _Coerce
+
+-- | The sheet this span is on.
+drSheetId :: Lens' DimensionRange (Maybe Int32)
+drSheetId
+  = lens _drSheetId (\ s a -> s{_drSheetId = a}) .
+      mapping _Coerce
+
+-- | The start (inclusive) of the span, or not set if unbounded.
+drStartIndex :: Lens' DimensionRange (Maybe Int32)
+drStartIndex
+  = lens _drStartIndex (\ s a -> s{_drStartIndex = a})
+      . mapping _Coerce
+
+instance FromJSON DimensionRange where
+        parseJSON
+          = withObject "DimensionRange"
+              (\ o ->
+                 DimensionRange' <$>
+                   (o .:? "dimension") <*> (o .:? "endIndex") <*>
+                     (o .:? "sheetId")
+                     <*> (o .:? "startIndex"))
+
+instance ToJSON DimensionRange where
+        toJSON DimensionRange'{..}
+          = object
+              (catMaybes
+                 [("dimension" .=) <$> _drDimension,
+                  ("endIndex" .=) <$> _drEndIndex,
+                  ("sheetId" .=) <$> _drSheetId,
+                  ("startIndex" .=) <$> _drStartIndex])
+
+-- | Updates properties of a spreadsheet.
+--
+-- /See:/ 'updateSpreadsheetPropertiesRequest' smart constructor.
+data UpdateSpreadsheetPropertiesRequest = UpdateSpreadsheetPropertiesRequest'
+    { _uFields     :: !(Maybe FieldMask)
+    , _uProperties :: !(Maybe SpreadsheetProperties)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateSpreadsheetPropertiesRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uFields'
+--
+-- * 'uProperties'
+updateSpreadsheetPropertiesRequest
+    :: UpdateSpreadsheetPropertiesRequest
+updateSpreadsheetPropertiesRequest =
+    UpdateSpreadsheetPropertiesRequest'
+    { _uFields = Nothing
+    , _uProperties = Nothing
+    }
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \'properties\' is implied and should not be specified. A single
+-- \`\"*\"\` can be used as short-hand for listing every field.
+uFields :: Lens' UpdateSpreadsheetPropertiesRequest (Maybe FieldMask)
+uFields = lens _uFields (\ s a -> s{_uFields = a})
+
+-- | The properties to update.
+uProperties :: Lens' UpdateSpreadsheetPropertiesRequest (Maybe SpreadsheetProperties)
+uProperties
+  = lens _uProperties (\ s a -> s{_uProperties = a})
+
+instance FromJSON UpdateSpreadsheetPropertiesRequest
+         where
+        parseJSON
+          = withObject "UpdateSpreadsheetPropertiesRequest"
+              (\ o ->
+                 UpdateSpreadsheetPropertiesRequest' <$>
+                   (o .:? "fields") <*> (o .:? "properties"))
+
+instance ToJSON UpdateSpreadsheetPropertiesRequest
+         where
+        toJSON UpdateSpreadsheetPropertiesRequest'{..}
+          = object
+              (catMaybes
+                 [("fields" .=) <$> _uFields,
+                  ("properties" .=) <$> _uProperties])
+
+-- | The result of adding a new protected range.
+--
+-- /See:/ 'addProtectedRangeResponse' smart constructor.
+newtype AddProtectedRangeResponse = AddProtectedRangeResponse'
+    { _aProtectedRange :: Maybe ProtectedRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddProtectedRangeResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aProtectedRange'
+addProtectedRangeResponse
+    :: AddProtectedRangeResponse
+addProtectedRangeResponse =
+    AddProtectedRangeResponse'
+    { _aProtectedRange = Nothing
+    }
+
+-- | The newly added protected range.
+aProtectedRange :: Lens' AddProtectedRangeResponse (Maybe ProtectedRange)
+aProtectedRange
+  = lens _aProtectedRange
+      (\ s a -> s{_aProtectedRange = a})
+
+instance FromJSON AddProtectedRangeResponse where
+        parseJSON
+          = withObject "AddProtectedRangeResponse"
+              (\ o ->
+                 AddProtectedRangeResponse' <$>
+                   (o .:? "protectedRange"))
+
+instance ToJSON AddProtectedRangeResponse where
+        toJSON AddProtectedRangeResponse'{..}
+          = object
+              (catMaybes
+                 [("protectedRange" .=) <$> _aProtectedRange])
+
+-- | Appends rows or columns to the end of a sheet.
+--
+-- /See:/ 'appendDimensionRequest' smart constructor.
+data AppendDimensionRequest = AppendDimensionRequest'
+    { _adrLength    :: !(Maybe (Textual Int32))
+    , _adrDimension :: !(Maybe AppendDimensionRequestDimension)
+    , _adrSheetId   :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AppendDimensionRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'adrLength'
+--
+-- * 'adrDimension'
+--
+-- * 'adrSheetId'
+appendDimensionRequest
+    :: AppendDimensionRequest
+appendDimensionRequest =
+    AppendDimensionRequest'
+    { _adrLength = Nothing
+    , _adrDimension = Nothing
+    , _adrSheetId = Nothing
+    }
+
+-- | The number of rows or columns to append.
+adrLength :: Lens' AppendDimensionRequest (Maybe Int32)
+adrLength
+  = lens _adrLength (\ s a -> s{_adrLength = a}) .
+      mapping _Coerce
+
+-- | Whether rows or columns should be appended.
+adrDimension :: Lens' AppendDimensionRequest (Maybe AppendDimensionRequestDimension)
+adrDimension
+  = lens _adrDimension (\ s a -> s{_adrDimension = a})
+
+-- | The sheet to append rows or columns to.
+adrSheetId :: Lens' AppendDimensionRequest (Maybe Int32)
+adrSheetId
+  = lens _adrSheetId (\ s a -> s{_adrSheetId = a}) .
+      mapping _Coerce
+
+instance FromJSON AppendDimensionRequest where
+        parseJSON
+          = withObject "AppendDimensionRequest"
+              (\ o ->
+                 AppendDimensionRequest' <$>
+                   (o .:? "length") <*> (o .:? "dimension") <*>
+                     (o .:? "sheetId"))
+
+instance ToJSON AppendDimensionRequest where
+        toJSON AppendDimensionRequest'{..}
+          = object
+              (catMaybes
+                 [("length" .=) <$> _adrLength,
+                  ("dimension" .=) <$> _adrDimension,
+                  ("sheetId" .=) <$> _adrSheetId])
+
+-- | The definition of how a value in a pivot table should be calculated.
+--
+-- /See:/ 'pivotValue' smart constructor.
+data PivotValue = PivotValue'
+    { _pvSourceColumnOffSet :: !(Maybe (Textual Int32))
+    , _pvFormula            :: !(Maybe Text)
+    , _pvName               :: !(Maybe Text)
+    , _pvSummarizeFunction  :: !(Maybe PivotValueSummarizeFunction)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pvSourceColumnOffSet'
+--
+-- * 'pvFormula'
+--
+-- * 'pvName'
+--
+-- * 'pvSummarizeFunction'
+pivotValue
+    :: PivotValue
+pivotValue =
+    PivotValue'
+    { _pvSourceColumnOffSet = Nothing
+    , _pvFormula = Nothing
+    , _pvName = Nothing
+    , _pvSummarizeFunction = Nothing
+    }
+
+-- | The column offset of the source range that this value reads from. For
+-- example, if the source was \`C10:E15\`, a \`sourceColumnOffset\` of
+-- \`0\` means this value refers to column \`C\`, whereas the offset \`1\`
+-- would refer to column \`D\`.
+pvSourceColumnOffSet :: Lens' PivotValue (Maybe Int32)
+pvSourceColumnOffSet
+  = lens _pvSourceColumnOffSet
+      (\ s a -> s{_pvSourceColumnOffSet = a})
+      . mapping _Coerce
+
+-- | A custom formula to calculate the value. The formula must start with an
+-- \`=\` character.
+pvFormula :: Lens' PivotValue (Maybe Text)
+pvFormula
+  = lens _pvFormula (\ s a -> s{_pvFormula = a})
+
+-- | A name to use for the value. This is only used if formula was set.
+-- Otherwise, the column name is used.
+pvName :: Lens' PivotValue (Maybe Text)
+pvName = lens _pvName (\ s a -> s{_pvName = a})
+
+-- | A function to summarize the value. If formula is set, the only supported
+-- values are SUM and CUSTOM. If sourceColumnOffset is set, then \`CUSTOM\`
+-- is not supported.
+pvSummarizeFunction :: Lens' PivotValue (Maybe PivotValueSummarizeFunction)
+pvSummarizeFunction
+  = lens _pvSummarizeFunction
+      (\ s a -> s{_pvSummarizeFunction = a})
+
+instance FromJSON PivotValue where
+        parseJSON
+          = withObject "PivotValue"
+              (\ o ->
+                 PivotValue' <$>
+                   (o .:? "sourceColumnOffset") <*> (o .:? "formula")
+                     <*> (o .:? "name")
+                     <*> (o .:? "summarizeFunction"))
+
+instance ToJSON PivotValue where
+        toJSON PivotValue'{..}
+          = object
+              (catMaybes
+                 [("sourceColumnOffset" .=) <$> _pvSourceColumnOffSet,
+                  ("formula" .=) <$> _pvFormula,
+                  ("name" .=) <$> _pvName,
+                  ("summarizeFunction" .=) <$> _pvSummarizeFunction])
+
+-- | Unmerges cells in the given range.
+--
+-- /See:/ 'unmergeCellsRequest' smart constructor.
+newtype UnmergeCellsRequest = UnmergeCellsRequest'
+    { _ucrRange :: Maybe GridRange
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UnmergeCellsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ucrRange'
+unmergeCellsRequest
+    :: UnmergeCellsRequest
+unmergeCellsRequest =
+    UnmergeCellsRequest'
+    { _ucrRange = Nothing
+    }
+
+-- | The range within which all cells should be unmerged. If the range spans
+-- multiple merges, all will be unmerged. The range must not partially span
+-- any merge.
+ucrRange :: Lens' UnmergeCellsRequest (Maybe GridRange)
+ucrRange = lens _ucrRange (\ s a -> s{_ucrRange = a})
+
+instance FromJSON UnmergeCellsRequest where
+        parseJSON
+          = withObject "UnmergeCellsRequest"
+              (\ o -> UnmergeCellsRequest' <$> (o .:? "range"))
+
+instance ToJSON UnmergeCellsRequest where
+        toJSON UnmergeCellsRequest'{..}
+          = object (catMaybes [("range" .=) <$> _ucrRange])
+
+-- | Deletes the requested sheet.
+--
+-- /See:/ 'deleteSheetRequest' smart constructor.
+newtype DeleteSheetRequest = DeleteSheetRequest'
+    { _dsrSheetId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSheetRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrSheetId'
+deleteSheetRequest
+    :: DeleteSheetRequest
+deleteSheetRequest =
+    DeleteSheetRequest'
+    { _dsrSheetId = Nothing
+    }
+
+-- | The ID of the sheet to delete.
+dsrSheetId :: Lens' DeleteSheetRequest (Maybe Int32)
+dsrSheetId
+  = lens _dsrSheetId (\ s a -> s{_dsrSheetId = a}) .
+      mapping _Coerce
+
+instance FromJSON DeleteSheetRequest where
+        parseJSON
+          = withObject "DeleteSheetRequest"
+              (\ o -> DeleteSheetRequest' <$> (o .:? "sheetId"))
+
+instance ToJSON DeleteSheetRequest where
+        toJSON DeleteSheetRequest'{..}
+          = object (catMaybes [("sheetId" .=) <$> _dsrSheetId])
+
+-- | Updates the borders of a range. If a field is not set in the request,
+-- that means the border remains as-is. For example, with two subsequent
+-- UpdateBordersRequest: 1. range: A1:A5 \`{ top: RED, bottom: WHITE }\` 2.
+-- range: A1:A5 \`{ left: BLUE }\` That would result in A1:A5 having a
+-- borders of \`{ top: RED, bottom: WHITE, left: BLUE }\`. If you want to
+-- clear a border, explicitly set the style to NONE.
+--
+-- /See:/ 'updateBOrdersRequest' smart constructor.
+data UpdateBOrdersRequest = UpdateBOrdersRequest'
+    { _uborBottom          :: !(Maybe BOrder)
+    , _uborInnerHorizontal :: !(Maybe BOrder)
+    , _uborLeft            :: !(Maybe BOrder)
+    , _uborInnerVertical   :: !(Maybe BOrder)
+    , _uborRange           :: !(Maybe GridRange)
+    , _uborRight           :: !(Maybe BOrder)
+    , _uborTop             :: !(Maybe BOrder)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateBOrdersRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uborBottom'
+--
+-- * 'uborInnerHorizontal'
+--
+-- * 'uborLeft'
+--
+-- * 'uborInnerVertical'
+--
+-- * 'uborRange'
+--
+-- * 'uborRight'
+--
+-- * 'uborTop'
+updateBOrdersRequest
+    :: UpdateBOrdersRequest
+updateBOrdersRequest =
+    UpdateBOrdersRequest'
+    { _uborBottom = Nothing
+    , _uborInnerHorizontal = Nothing
+    , _uborLeft = Nothing
+    , _uborInnerVertical = Nothing
+    , _uborRange = Nothing
+    , _uborRight = Nothing
+    , _uborTop = Nothing
+    }
+
+-- | The border to put at the bottom of the range.
+uborBottom :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborBottom
+  = lens _uborBottom (\ s a -> s{_uborBottom = a})
+
+-- | The horizontal border to put within the range.
+uborInnerHorizontal :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborInnerHorizontal
+  = lens _uborInnerHorizontal
+      (\ s a -> s{_uborInnerHorizontal = a})
+
+-- | The border to put at the left of the range.
+uborLeft :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborLeft = lens _uborLeft (\ s a -> s{_uborLeft = a})
+
+-- | The vertical border to put within the range.
+uborInnerVertical :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborInnerVertical
+  = lens _uborInnerVertical
+      (\ s a -> s{_uborInnerVertical = a})
+
+-- | The range whose borders should be updated.
+uborRange :: Lens' UpdateBOrdersRequest (Maybe GridRange)
+uborRange
+  = lens _uborRange (\ s a -> s{_uborRange = a})
+
+-- | The border to put at the right of the range.
+uborRight :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborRight
+  = lens _uborRight (\ s a -> s{_uborRight = a})
+
+-- | The border to put at the top of the range.
+uborTop :: Lens' UpdateBOrdersRequest (Maybe BOrder)
+uborTop = lens _uborTop (\ s a -> s{_uborTop = a})
+
+instance FromJSON UpdateBOrdersRequest where
+        parseJSON
+          = withObject "UpdateBOrdersRequest"
+              (\ o ->
+                 UpdateBOrdersRequest' <$>
+                   (o .:? "bottom") <*> (o .:? "innerHorizontal") <*>
+                     (o .:? "left")
+                     <*> (o .:? "innerVertical")
+                     <*> (o .:? "range")
+                     <*> (o .:? "right")
+                     <*> (o .:? "top"))
+
+instance ToJSON UpdateBOrdersRequest where
+        toJSON UpdateBOrdersRequest'{..}
+          = object
+              (catMaybes
+                 [("bottom" .=) <$> _uborBottom,
+                  ("innerHorizontal" .=) <$> _uborInnerHorizontal,
+                  ("left" .=) <$> _uborLeft,
+                  ("innerVertical" .=) <$> _uborInnerVertical,
+                  ("range" .=) <$> _uborRange,
+                  ("right" .=) <$> _uborRight,
+                  ("top" .=) <$> _uborTop])
+
+-- | A chart embedded in a sheet.
+--
+-- /See:/ 'embeddedChart' smart constructor.
+data EmbeddedChart = EmbeddedChart'
+    { _ecSpec     :: !(Maybe ChartSpec)
+    , _ecPosition :: !(Maybe EmbeddedObjectPosition)
+    , _ecChartId  :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EmbeddedChart' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ecSpec'
+--
+-- * 'ecPosition'
+--
+-- * 'ecChartId'
+embeddedChart
+    :: EmbeddedChart
+embeddedChart =
+    EmbeddedChart'
+    { _ecSpec = Nothing
+    , _ecPosition = Nothing
+    , _ecChartId = Nothing
+    }
+
+-- | The specification of the chart.
+ecSpec :: Lens' EmbeddedChart (Maybe ChartSpec)
+ecSpec = lens _ecSpec (\ s a -> s{_ecSpec = a})
+
+-- | The position of the chart.
+ecPosition :: Lens' EmbeddedChart (Maybe EmbeddedObjectPosition)
+ecPosition
+  = lens _ecPosition (\ s a -> s{_ecPosition = a})
+
+-- | The ID of the chart.
+ecChartId :: Lens' EmbeddedChart (Maybe Int32)
+ecChartId
+  = lens _ecChartId (\ s a -> s{_ecChartId = a}) .
+      mapping _Coerce
+
+instance FromJSON EmbeddedChart where
+        parseJSON
+          = withObject "EmbeddedChart"
+              (\ o ->
+                 EmbeddedChart' <$>
+                   (o .:? "spec") <*> (o .:? "position") <*>
+                     (o .:? "chartId"))
+
+instance ToJSON EmbeddedChart where
+        toJSON EmbeddedChart'{..}
+          = object
+              (catMaybes
+                 [("spec" .=) <$> _ecSpec,
+                  ("position" .=) <$> _ecPosition,
+                  ("chartId" .=) <$> _ecChartId])
+
+-- | Data about each cell in a row.
+--
+-- /See:/ 'rowData' smart constructor.
+newtype RowData = RowData'
+    { _rdValues :: Maybe [CellData]
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RowData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rdValues'
+rowData
+    :: RowData
+rowData =
+    RowData'
+    { _rdValues = Nothing
+    }
+
+-- | The values in the row, one per column.
+rdValues :: Lens' RowData [CellData]
+rdValues
+  = lens _rdValues (\ s a -> s{_rdValues = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON RowData where
+        parseJSON
+          = withObject "RowData"
+              (\ o -> RowData' <$> (o .:? "values" .!= mempty))
+
+instance ToJSON RowData where
+        toJSON RowData'{..}
+          = object (catMaybes [("values" .=) <$> _rdValues])
+
+-- | The editors of a protected range.
+--
+-- /See:/ 'editors' smart constructor.
+data Editors = Editors'
+    { _eGroups             :: !(Maybe [Text])
+    , _eUsers              :: !(Maybe [Text])
+    , _eDomainUsersCanEdit :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Editors' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eGroups'
+--
+-- * 'eUsers'
+--
+-- * 'eDomainUsersCanEdit'
+editors
+    :: Editors
+editors =
+    Editors'
+    { _eGroups = Nothing
+    , _eUsers = Nothing
+    , _eDomainUsersCanEdit = Nothing
+    }
+
+-- | The email addresses of groups with edit access to the protected range.
+eGroups :: Lens' Editors [Text]
+eGroups
+  = lens _eGroups (\ s a -> s{_eGroups = a}) . _Default
+      . _Coerce
+
+-- | The email addresses of users with edit access to the protected range.
+eUsers :: Lens' Editors [Text]
+eUsers
+  = lens _eUsers (\ s a -> s{_eUsers = a}) . _Default .
+      _Coerce
+
+-- | True if anyone in the document\'s domain has edit access to the
+-- protected range. Domain protection is only supported on documents within
+-- a domain.
+eDomainUsersCanEdit :: Lens' Editors (Maybe Bool)
+eDomainUsersCanEdit
+  = lens _eDomainUsersCanEdit
+      (\ s a -> s{_eDomainUsersCanEdit = a})
+
+instance FromJSON Editors where
+        parseJSON
+          = withObject "Editors"
+              (\ o ->
+                 Editors' <$>
+                   (o .:? "groups" .!= mempty) <*>
+                     (o .:? "users" .!= mempty)
+                     <*> (o .:? "domainUsersCanEdit"))
+
+instance ToJSON Editors where
+        toJSON Editors'{..}
+          = object
+              (catMaybes
+                 [("groups" .=) <$> _eGroups,
+                  ("users" .=) <$> _eUsers,
+                  ("domainUsersCanEdit" .=) <$> _eDomainUsersCanEdit])
+
+-- | A pivot table.
+--
+-- /See:/ 'pivotTable' smart constructor.
+data PivotTable = PivotTable'
+    { _ptValues      :: !(Maybe [PivotValue])
+    , _ptValueLayout :: !(Maybe PivotTableValueLayout)
+    , _ptRows        :: !(Maybe [PivotGroup])
+    , _ptSource      :: !(Maybe GridRange)
+    , _ptColumns     :: !(Maybe [PivotGroup])
+    , _ptCriteria    :: !(Maybe PivotTableCriteria)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotTable' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ptValues'
+--
+-- * 'ptValueLayout'
+--
+-- * 'ptRows'
+--
+-- * 'ptSource'
+--
+-- * 'ptColumns'
+--
+-- * 'ptCriteria'
+pivotTable
+    :: PivotTable
+pivotTable =
+    PivotTable'
+    { _ptValues = Nothing
+    , _ptValueLayout = Nothing
+    , _ptRows = Nothing
+    , _ptSource = Nothing
+    , _ptColumns = Nothing
+    , _ptCriteria = Nothing
+    }
+
+-- | A list of values to include in the pivot table.
+ptValues :: Lens' PivotTable [PivotValue]
+ptValues
+  = lens _ptValues (\ s a -> s{_ptValues = a}) .
+      _Default
+      . _Coerce
+
+-- | Whether values should be listed horizontally (as columns) or vertically
+-- (as rows).
+ptValueLayout :: Lens' PivotTable (Maybe PivotTableValueLayout)
+ptValueLayout
+  = lens _ptValueLayout
+      (\ s a -> s{_ptValueLayout = a})
+
+-- | Each row grouping in the pivot table.
+ptRows :: Lens' PivotTable [PivotGroup]
+ptRows
+  = lens _ptRows (\ s a -> s{_ptRows = a}) . _Default .
+      _Coerce
+
+-- | The range the pivot table is reading data from.
+ptSource :: Lens' PivotTable (Maybe GridRange)
+ptSource = lens _ptSource (\ s a -> s{_ptSource = a})
+
+-- | Each column grouping in the pivot table.
+ptColumns :: Lens' PivotTable [PivotGroup]
+ptColumns
+  = lens _ptColumns (\ s a -> s{_ptColumns = a}) .
+      _Default
+      . _Coerce
+
+-- | An optional mapping of filters per source column offset. The filters
+-- will be applied before aggregating data into the pivot table. The map\'s
+-- key is the column offset of the source range that you want to filter,
+-- and the value is the criteria for that column. For example, if the
+-- source was \`C10:E15\`, a key of \`0\` will have the filter for column
+-- \`C\`, whereas the key \`1\` is for column \`D\`.
+ptCriteria :: Lens' PivotTable (Maybe PivotTableCriteria)
+ptCriteria
+  = lens _ptCriteria (\ s a -> s{_ptCriteria = a})
+
+instance FromJSON PivotTable where
+        parseJSON
+          = withObject "PivotTable"
+              (\ o ->
+                 PivotTable' <$>
+                   (o .:? "values" .!= mempty) <*> (o .:? "valueLayout")
+                     <*> (o .:? "rows" .!= mempty)
+                     <*> (o .:? "source")
+                     <*> (o .:? "columns" .!= mempty)
+                     <*> (o .:? "criteria"))
+
+instance ToJSON PivotTable where
+        toJSON PivotTable'{..}
+          = object
+              (catMaybes
+                 [("values" .=) <$> _ptValues,
+                  ("valueLayout" .=) <$> _ptValueLayout,
+                  ("rows" .=) <$> _ptRows, ("source" .=) <$> _ptSource,
+                  ("columns" .=) <$> _ptColumns,
+                  ("criteria" .=) <$> _ptCriteria])
+
+-- | The position of an embedded object such as a chart.
+--
+-- /See:/ 'embeddedObjectPosition' smart constructor.
+data EmbeddedObjectPosition = EmbeddedObjectPosition'
+    { _eopOverlayPosition :: !(Maybe OverlayPosition)
+    , _eopSheetId         :: !(Maybe (Textual Int32))
+    , _eopNewSheet        :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EmbeddedObjectPosition' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eopOverlayPosition'
+--
+-- * 'eopSheetId'
+--
+-- * 'eopNewSheet'
+embeddedObjectPosition
+    :: EmbeddedObjectPosition
+embeddedObjectPosition =
+    EmbeddedObjectPosition'
+    { _eopOverlayPosition = Nothing
+    , _eopSheetId = Nothing
+    , _eopNewSheet = Nothing
+    }
+
+-- | The position at which the object is overlaid on top of a grid.
+eopOverlayPosition :: Lens' EmbeddedObjectPosition (Maybe OverlayPosition)
+eopOverlayPosition
+  = lens _eopOverlayPosition
+      (\ s a -> s{_eopOverlayPosition = a})
+
+-- | The sheet this is on. Set only if the embedded object is on its own
+-- sheet. Must be non-negative.
+eopSheetId :: Lens' EmbeddedObjectPosition (Maybe Int32)
+eopSheetId
+  = lens _eopSheetId (\ s a -> s{_eopSheetId = a}) .
+      mapping _Coerce
+
+-- | If true, the embedded object will be put on a new sheet whose ID is
+-- chosen for you. Used only when writing.
+eopNewSheet :: Lens' EmbeddedObjectPosition (Maybe Bool)
+eopNewSheet
+  = lens _eopNewSheet (\ s a -> s{_eopNewSheet = a})
+
+instance FromJSON EmbeddedObjectPosition where
+        parseJSON
+          = withObject "EmbeddedObjectPosition"
+              (\ o ->
+                 EmbeddedObjectPosition' <$>
+                   (o .:? "overlayPosition") <*> (o .:? "sheetId") <*>
+                     (o .:? "newSheet"))
+
+instance ToJSON EmbeddedObjectPosition where
+        toJSON EmbeddedObjectPosition'{..}
+          = object
+              (catMaybes
+                 [("overlayPosition" .=) <$> _eopOverlayPosition,
+                  ("sheetId" .=) <$> _eopSheetId,
+                  ("newSheet" .=) <$> _eopNewSheet])
+
+-- | The default filter associated with a sheet.
+--
+-- /See:/ 'basicFilter' smart constructor.
+data BasicFilter = BasicFilter'
+    { _bfSortSpecs :: !(Maybe [SortSpec])
+    , _bfRange     :: !(Maybe GridRange)
+    , _bfCriteria  :: !(Maybe BasicFilterCriteria)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicFilter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bfSortSpecs'
+--
+-- * 'bfRange'
+--
+-- * 'bfCriteria'
+basicFilter
+    :: BasicFilter
+basicFilter =
+    BasicFilter'
+    { _bfSortSpecs = Nothing
+    , _bfRange = Nothing
+    , _bfCriteria = Nothing
+    }
+
+-- | The sort order per column. Later specifications are used when values are
+-- equal in the earlier specifications.
+bfSortSpecs :: Lens' BasicFilter [SortSpec]
+bfSortSpecs
+  = lens _bfSortSpecs (\ s a -> s{_bfSortSpecs = a}) .
+      _Default
+      . _Coerce
+
+-- | The range the filter covers.
+bfRange :: Lens' BasicFilter (Maybe GridRange)
+bfRange = lens _bfRange (\ s a -> s{_bfRange = a})
+
+-- | The criteria for showing\/hiding values per column. The map\'s key is
+-- the column index, and the value is the criteria for that column.
+bfCriteria :: Lens' BasicFilter (Maybe BasicFilterCriteria)
+bfCriteria
+  = lens _bfCriteria (\ s a -> s{_bfCriteria = a})
+
+instance FromJSON BasicFilter where
+        parseJSON
+          = withObject "BasicFilter"
+              (\ o ->
+                 BasicFilter' <$>
+                   (o .:? "sortSpecs" .!= mempty) <*> (o .:? "range")
+                     <*> (o .:? "criteria"))
+
+instance ToJSON BasicFilter where
+        toJSON BasicFilter'{..}
+          = object
+              (catMaybes
+                 [("sortSpecs" .=) <$> _bfSortSpecs,
+                  ("range" .=) <$> _bfRange,
+                  ("criteria" .=) <$> _bfCriteria])
+
+-- | Splits a column of text into multiple columns, based on a delimiter in
+-- each cell.
+--
+-- /See:/ 'textToColumnsRequest' smart constructor.
+data TextToColumnsRequest = TextToColumnsRequest'
+    { _ttcrDelimiterType :: !(Maybe TextToColumnsRequestDelimiterType)
+    , _ttcrSource        :: !(Maybe GridRange)
+    , _ttcrDelimiter     :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextToColumnsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ttcrDelimiterType'
+--
+-- * 'ttcrSource'
+--
+-- * 'ttcrDelimiter'
+textToColumnsRequest
+    :: TextToColumnsRequest
+textToColumnsRequest =
+    TextToColumnsRequest'
+    { _ttcrDelimiterType = Nothing
+    , _ttcrSource = Nothing
+    , _ttcrDelimiter = Nothing
+    }
+
+-- | The delimiter type to use.
+ttcrDelimiterType :: Lens' TextToColumnsRequest (Maybe TextToColumnsRequestDelimiterType)
+ttcrDelimiterType
+  = lens _ttcrDelimiterType
+      (\ s a -> s{_ttcrDelimiterType = a})
+
+-- | The source data range. This must span exactly one column.
+ttcrSource :: Lens' TextToColumnsRequest (Maybe GridRange)
+ttcrSource
+  = lens _ttcrSource (\ s a -> s{_ttcrSource = a})
+
+-- | The delimiter to use. Used only if delimiterType is CUSTOM.
+ttcrDelimiter :: Lens' TextToColumnsRequest (Maybe Text)
+ttcrDelimiter
+  = lens _ttcrDelimiter
+      (\ s a -> s{_ttcrDelimiter = a})
+
+instance FromJSON TextToColumnsRequest where
+        parseJSON
+          = withObject "TextToColumnsRequest"
+              (\ o ->
+                 TextToColumnsRequest' <$>
+                   (o .:? "delimiterType") <*> (o .:? "source") <*>
+                     (o .:? "delimiter"))
+
+instance ToJSON TextToColumnsRequest where
+        toJSON TextToColumnsRequest'{..}
+          = object
+              (catMaybes
+                 [("delimiterType" .=) <$> _ttcrDelimiterType,
+                  ("source" .=) <$> _ttcrSource,
+                  ("delimiter" .=) <$> _ttcrDelimiter])
+
+-- | The request for updating any aspect of a spreadsheet.
+--
+-- /See:/ 'batchUpdateSpreadsheetRequest' smart constructor.
+newtype BatchUpdateSpreadsheetRequest = BatchUpdateSpreadsheetRequest'
+    { _busrRequests :: Maybe [Request']
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchUpdateSpreadsheetRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'busrRequests'
+batchUpdateSpreadsheetRequest
+    :: BatchUpdateSpreadsheetRequest
+batchUpdateSpreadsheetRequest =
+    BatchUpdateSpreadsheetRequest'
+    { _busrRequests = Nothing
+    }
+
+-- | A list of updates to apply to the spreadsheet.
+busrRequests :: Lens' BatchUpdateSpreadsheetRequest [Request']
+busrRequests
+  = lens _busrRequests (\ s a -> s{_busrRequests = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON BatchUpdateSpreadsheetRequest where
+        parseJSON
+          = withObject "BatchUpdateSpreadsheetRequest"
+              (\ o ->
+                 BatchUpdateSpreadsheetRequest' <$>
+                   (o .:? "requests" .!= mempty))
+
+instance ToJSON BatchUpdateSpreadsheetRequest where
+        toJSON BatchUpdateSpreadsheetRequest'{..}
+          = object
+              (catMaybes [("requests" .=) <$> _busrRequests])
+
+-- | The response when updating a range of values in a spreadsheet.
+--
+-- /See:/ 'updateValuesResponse' smart constructor.
+data UpdateValuesResponse = UpdateValuesResponse'
+    { _uvrUpdatedCells   :: !(Maybe (Textual Int32))
+    , _uvrSpreadsheetId  :: !(Maybe Text)
+    , _uvrUpdatedRows    :: !(Maybe (Textual Int32))
+    , _uvrUpdatedRange   :: !(Maybe Text)
+    , _uvrUpdatedColumns :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateValuesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uvrUpdatedCells'
+--
+-- * 'uvrSpreadsheetId'
+--
+-- * 'uvrUpdatedRows'
+--
+-- * 'uvrUpdatedRange'
+--
+-- * 'uvrUpdatedColumns'
+updateValuesResponse
+    :: UpdateValuesResponse
+updateValuesResponse =
+    UpdateValuesResponse'
+    { _uvrUpdatedCells = Nothing
+    , _uvrSpreadsheetId = Nothing
+    , _uvrUpdatedRows = Nothing
+    , _uvrUpdatedRange = Nothing
+    , _uvrUpdatedColumns = Nothing
+    }
+
+-- | The number of cells updated.
+uvrUpdatedCells :: Lens' UpdateValuesResponse (Maybe Int32)
+uvrUpdatedCells
+  = lens _uvrUpdatedCells
+      (\ s a -> s{_uvrUpdatedCells = a})
+      . mapping _Coerce
+
+-- | The spreadsheet the updates were applied to.
+uvrSpreadsheetId :: Lens' UpdateValuesResponse (Maybe Text)
+uvrSpreadsheetId
+  = lens _uvrSpreadsheetId
+      (\ s a -> s{_uvrSpreadsheetId = a})
+
+-- | The number of rows where at least one cell in the row was updated.
+uvrUpdatedRows :: Lens' UpdateValuesResponse (Maybe Int32)
+uvrUpdatedRows
+  = lens _uvrUpdatedRows
+      (\ s a -> s{_uvrUpdatedRows = a})
+      . mapping _Coerce
+
+-- | The range (in A1 notation) that updates were applied to.
+uvrUpdatedRange :: Lens' UpdateValuesResponse (Maybe Text)
+uvrUpdatedRange
+  = lens _uvrUpdatedRange
+      (\ s a -> s{_uvrUpdatedRange = a})
+
+-- | The number of columns where at least one cell in the column was updated.
+uvrUpdatedColumns :: Lens' UpdateValuesResponse (Maybe Int32)
+uvrUpdatedColumns
+  = lens _uvrUpdatedColumns
+      (\ s a -> s{_uvrUpdatedColumns = a})
+      . mapping _Coerce
+
+instance FromJSON UpdateValuesResponse where
+        parseJSON
+          = withObject "UpdateValuesResponse"
+              (\ o ->
+                 UpdateValuesResponse' <$>
+                   (o .:? "updatedCells") <*> (o .:? "spreadsheetId")
+                     <*> (o .:? "updatedRows")
+                     <*> (o .:? "updatedRange")
+                     <*> (o .:? "updatedColumns"))
+
+instance ToJSON UpdateValuesResponse where
+        toJSON UpdateValuesResponse'{..}
+          = object
+              (catMaybes
+                 [("updatedCells" .=) <$> _uvrUpdatedCells,
+                  ("spreadsheetId" .=) <$> _uvrSpreadsheetId,
+                  ("updatedRows" .=) <$> _uvrUpdatedRows,
+                  ("updatedRange" .=) <$> _uvrUpdatedRange,
+                  ("updatedColumns" .=) <$> _uvrUpdatedColumns])
+
+-- | The request to copy a sheet across spreadsheets.
+--
+-- /See:/ 'copySheetToAnotherSpreadsheetRequest' smart constructor.
+newtype CopySheetToAnotherSpreadsheetRequest = CopySheetToAnotherSpreadsheetRequest'
+    { _cstasrDestinationSpreadsheetId :: Maybe Text
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CopySheetToAnotherSpreadsheetRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cstasrDestinationSpreadsheetId'
+copySheetToAnotherSpreadsheetRequest
+    :: CopySheetToAnotherSpreadsheetRequest
+copySheetToAnotherSpreadsheetRequest =
+    CopySheetToAnotherSpreadsheetRequest'
+    { _cstasrDestinationSpreadsheetId = Nothing
+    }
+
+-- | The ID of the spreadsheet to copy the sheet to.
+cstasrDestinationSpreadsheetId :: Lens' CopySheetToAnotherSpreadsheetRequest (Maybe Text)
+cstasrDestinationSpreadsheetId
+  = lens _cstasrDestinationSpreadsheetId
+      (\ s a -> s{_cstasrDestinationSpreadsheetId = a})
+
+instance FromJSON
+         CopySheetToAnotherSpreadsheetRequest where
+        parseJSON
+          = withObject "CopySheetToAnotherSpreadsheetRequest"
+              (\ o ->
+                 CopySheetToAnotherSpreadsheetRequest' <$>
+                   (o .:? "destinationSpreadsheetId"))
+
+instance ToJSON CopySheetToAnotherSpreadsheetRequest
+         where
+        toJSON CopySheetToAnotherSpreadsheetRequest'{..}
+          = object
+              (catMaybes
+                 [("destinationSpreadsheetId" .=) <$>
+                    _cstasrDestinationSpreadsheetId])
+
+-- | Adds a filter view.
+--
+-- /See:/ 'addFilterViewRequest' smart constructor.
+newtype AddFilterViewRequest = AddFilterViewRequest'
+    { _aFilter :: Maybe FilterView
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddFilterViewRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aFilter'
+addFilterViewRequest
+    :: AddFilterViewRequest
+addFilterViewRequest =
+    AddFilterViewRequest'
+    { _aFilter = Nothing
+    }
+
+-- | The filter to add.
+aFilter :: Lens' AddFilterViewRequest (Maybe FilterView)
+aFilter = lens _aFilter (\ s a -> s{_aFilter = a})
+
+instance FromJSON AddFilterViewRequest where
+        parseJSON
+          = withObject "AddFilterViewRequest"
+              (\ o -> AddFilterViewRequest' <$> (o .:? "filter"))
+
+instance ToJSON AddFilterViewRequest where
+        toJSON AddFilterViewRequest'{..}
+          = object (catMaybes [("filter" .=) <$> _aFilter])
+
+-- | Metadata about a value in a pivot grouping.
+--
+-- /See:/ 'pivotGroupValueMetadata' smart constructor.
+data PivotGroupValueMetadata = PivotGroupValueMetadata'
+    { _pgvmValue     :: !(Maybe ExtendedValue)
+    , _pgvmCollapsed :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotGroupValueMetadata' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pgvmValue'
+--
+-- * 'pgvmCollapsed'
+pivotGroupValueMetadata
+    :: PivotGroupValueMetadata
+pivotGroupValueMetadata =
+    PivotGroupValueMetadata'
+    { _pgvmValue = Nothing
+    , _pgvmCollapsed = Nothing
+    }
+
+-- | The calculated value the metadata corresponds to. (Note that
+-- formulaValue is not valid, because the values will be calculated.)
+pgvmValue :: Lens' PivotGroupValueMetadata (Maybe ExtendedValue)
+pgvmValue
+  = lens _pgvmValue (\ s a -> s{_pgvmValue = a})
+
+-- | True if the data corresponding to the value is collapsed.
+pgvmCollapsed :: Lens' PivotGroupValueMetadata (Maybe Bool)
+pgvmCollapsed
+  = lens _pgvmCollapsed
+      (\ s a -> s{_pgvmCollapsed = a})
+
+instance FromJSON PivotGroupValueMetadata where
+        parseJSON
+          = withObject "PivotGroupValueMetadata"
+              (\ o ->
+                 PivotGroupValueMetadata' <$>
+                   (o .:? "value") <*> (o .:? "collapsed"))
+
+instance ToJSON PivotGroupValueMetadata where
+        toJSON PivotGroupValueMetadata'{..}
+          = object
+              (catMaybes
+                 [("value" .=) <$> _pgvmValue,
+                  ("collapsed" .=) <$> _pgvmCollapsed])
+
+-- | Updates all cells in a range with new data.
+--
+-- /See:/ 'updateCellsRequest' smart constructor.
+data UpdateCellsRequest = UpdateCellsRequest'
+    { _updStart  :: !(Maybe GridCoordinate)
+    , _updRows   :: !(Maybe [RowData])
+    , _updRange  :: !(Maybe GridRange)
+    , _updFields :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateCellsRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'updStart'
+--
+-- * 'updRows'
+--
+-- * 'updRange'
+--
+-- * 'updFields'
+updateCellsRequest
+    :: UpdateCellsRequest
+updateCellsRequest =
+    UpdateCellsRequest'
+    { _updStart = Nothing
+    , _updRows = Nothing
+    , _updRange = Nothing
+    , _updFields = Nothing
+    }
+
+-- | The coordinate to start writing data at. Any number of rows and columns
+-- (including a different number of columns per row) may be written.
+updStart :: Lens' UpdateCellsRequest (Maybe GridCoordinate)
+updStart = lens _updStart (\ s a -> s{_updStart = a})
+
+-- | The data to write.
+updRows :: Lens' UpdateCellsRequest [RowData]
+updRows
+  = lens _updRows (\ s a -> s{_updRows = a}) . _Default
+      . _Coerce
+
+-- | The range to write data to. If the data in rows does not cover the
+-- entire requested range, the fields matching those set in fields will be
+-- cleared.
+updRange :: Lens' UpdateCellsRequest (Maybe GridRange)
+updRange = lens _updRange (\ s a -> s{_updRange = a})
+
+-- | The fields of CellData that should be updated. At least one field must
+-- be specified. The root is the CellData; \'row.values.\' should not be
+-- specified. A single \`\"*\"\` can be used as short-hand for listing
+-- every field.
+updFields :: Lens' UpdateCellsRequest (Maybe FieldMask)
+updFields
+  = lens _updFields (\ s a -> s{_updFields = a})
+
+instance FromJSON UpdateCellsRequest where
+        parseJSON
+          = withObject "UpdateCellsRequest"
+              (\ o ->
+                 UpdateCellsRequest' <$>
+                   (o .:? "start") <*> (o .:? "rows" .!= mempty) <*>
+                     (o .:? "range")
+                     <*> (o .:? "fields"))
+
+instance ToJSON UpdateCellsRequest where
+        toJSON UpdateCellsRequest'{..}
+          = object
+              (catMaybes
+                 [("start" .=) <$> _updStart,
+                  ("rows" .=) <$> _updRows, ("range" .=) <$> _updRange,
+                  ("fields" .=) <$> _updFields])
+
+-- | The format of a cell.
+--
+-- /See:/ 'cellFormat' smart constructor.
+data CellFormat = CellFormat'
+    { _cfBOrders              :: !(Maybe BOrders)
+    , _cfVerticalAlignment    :: !(Maybe CellFormatVerticalAlignment)
+    , _cfBackgRoundColor      :: !(Maybe Color)
+    , _cfHyperlinkDisplayType :: !(Maybe CellFormatHyperlinkDisplayType)
+    , _cfWrapStrategy         :: !(Maybe CellFormatWrapStrategy)
+    , _cfNumberFormat         :: !(Maybe NumberFormat)
+    , _cfTextDirection        :: !(Maybe CellFormatTextDirection)
+    , _cfTextFormat           :: !(Maybe TextFormat)
+    , _cfHorizontalAlignment  :: !(Maybe CellFormatHorizontalAlignment)
+    , _cfPadding              :: !(Maybe Padding)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CellFormat' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfBOrders'
+--
+-- * 'cfVerticalAlignment'
+--
+-- * 'cfBackgRoundColor'
+--
+-- * 'cfHyperlinkDisplayType'
+--
+-- * 'cfWrapStrategy'
+--
+-- * 'cfNumberFormat'
+--
+-- * 'cfTextDirection'
+--
+-- * 'cfTextFormat'
+--
+-- * 'cfHorizontalAlignment'
+--
+-- * 'cfPadding'
+cellFormat
+    :: CellFormat
+cellFormat =
+    CellFormat'
+    { _cfBOrders = Nothing
+    , _cfVerticalAlignment = Nothing
+    , _cfBackgRoundColor = Nothing
+    , _cfHyperlinkDisplayType = Nothing
+    , _cfWrapStrategy = Nothing
+    , _cfNumberFormat = Nothing
+    , _cfTextDirection = Nothing
+    , _cfTextFormat = Nothing
+    , _cfHorizontalAlignment = Nothing
+    , _cfPadding = Nothing
+    }
+
+-- | The borders of the cell.
+cfBOrders :: Lens' CellFormat (Maybe BOrders)
+cfBOrders
+  = lens _cfBOrders (\ s a -> s{_cfBOrders = a})
+
+-- | The vertical alignment of the value in the cell.
+cfVerticalAlignment :: Lens' CellFormat (Maybe CellFormatVerticalAlignment)
+cfVerticalAlignment
+  = lens _cfVerticalAlignment
+      (\ s a -> s{_cfVerticalAlignment = a})
+
+-- | The background color of the cell.
+cfBackgRoundColor :: Lens' CellFormat (Maybe Color)
+cfBackgRoundColor
+  = lens _cfBackgRoundColor
+      (\ s a -> s{_cfBackgRoundColor = a})
+
+-- | How a hyperlink, if it exists, should be displayed in the cell.
+cfHyperlinkDisplayType :: Lens' CellFormat (Maybe CellFormatHyperlinkDisplayType)
+cfHyperlinkDisplayType
+  = lens _cfHyperlinkDisplayType
+      (\ s a -> s{_cfHyperlinkDisplayType = a})
+
+-- | The wrap strategy for the value in the cell.
+cfWrapStrategy :: Lens' CellFormat (Maybe CellFormatWrapStrategy)
+cfWrapStrategy
+  = lens _cfWrapStrategy
+      (\ s a -> s{_cfWrapStrategy = a})
+
+-- | A format describing how number values should be represented to the user.
+cfNumberFormat :: Lens' CellFormat (Maybe NumberFormat)
+cfNumberFormat
+  = lens _cfNumberFormat
+      (\ s a -> s{_cfNumberFormat = a})
+
+-- | The direction of the text in the cell.
+cfTextDirection :: Lens' CellFormat (Maybe CellFormatTextDirection)
+cfTextDirection
+  = lens _cfTextDirection
+      (\ s a -> s{_cfTextDirection = a})
+
+-- | The format of the text in the cell (unless overridden by a format run).
+cfTextFormat :: Lens' CellFormat (Maybe TextFormat)
+cfTextFormat
+  = lens _cfTextFormat (\ s a -> s{_cfTextFormat = a})
+
+-- | The horizontal alignment of the value in the cell.
+cfHorizontalAlignment :: Lens' CellFormat (Maybe CellFormatHorizontalAlignment)
+cfHorizontalAlignment
+  = lens _cfHorizontalAlignment
+      (\ s a -> s{_cfHorizontalAlignment = a})
+
+-- | The padding of the cell.
+cfPadding :: Lens' CellFormat (Maybe Padding)
+cfPadding
+  = lens _cfPadding (\ s a -> s{_cfPadding = a})
+
+instance FromJSON CellFormat where
+        parseJSON
+          = withObject "CellFormat"
+              (\ o ->
+                 CellFormat' <$>
+                   (o .:? "borders") <*> (o .:? "verticalAlignment") <*>
+                     (o .:? "backgroundColor")
+                     <*> (o .:? "hyperlinkDisplayType")
+                     <*> (o .:? "wrapStrategy")
+                     <*> (o .:? "numberFormat")
+                     <*> (o .:? "textDirection")
+                     <*> (o .:? "textFormat")
+                     <*> (o .:? "horizontalAlignment")
+                     <*> (o .:? "padding"))
+
+instance ToJSON CellFormat where
+        toJSON CellFormat'{..}
+          = object
+              (catMaybes
+                 [("borders" .=) <$> _cfBOrders,
+                  ("verticalAlignment" .=) <$> _cfVerticalAlignment,
+                  ("backgroundColor" .=) <$> _cfBackgRoundColor,
+                  ("hyperlinkDisplayType" .=) <$>
+                    _cfHyperlinkDisplayType,
+                  ("wrapStrategy" .=) <$> _cfWrapStrategy,
+                  ("numberFormat" .=) <$> _cfNumberFormat,
+                  ("textDirection" .=) <$> _cfTextDirection,
+                  ("textFormat" .=) <$> _cfTextFormat,
+                  ("horizontalAlignment" .=) <$>
+                    _cfHorizontalAlignment,
+                  ("padding" .=) <$> _cfPadding])
+
+-- | Deletes the protected range with the given ID.
+--
+-- /See:/ 'deleteProtectedRangeRequest' smart constructor.
+newtype DeleteProtectedRangeRequest = DeleteProtectedRangeRequest'
+    { _dprrProtectedRangeId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteProtectedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dprrProtectedRangeId'
+deleteProtectedRangeRequest
+    :: DeleteProtectedRangeRequest
+deleteProtectedRangeRequest =
+    DeleteProtectedRangeRequest'
+    { _dprrProtectedRangeId = Nothing
+    }
+
+-- | The ID of the protected range to delete.
+dprrProtectedRangeId :: Lens' DeleteProtectedRangeRequest (Maybe Int32)
+dprrProtectedRangeId
+  = lens _dprrProtectedRangeId
+      (\ s a -> s{_dprrProtectedRangeId = a})
+      . mapping _Coerce
+
+instance FromJSON DeleteProtectedRangeRequest where
+        parseJSON
+          = withObject "DeleteProtectedRangeRequest"
+              (\ o ->
+                 DeleteProtectedRangeRequest' <$>
+                   (o .:? "protectedRangeId"))
+
+instance ToJSON DeleteProtectedRangeRequest where
+        toJSON DeleteProtectedRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("protectedRangeId" .=) <$> _dprrProtectedRangeId])
+
+-- | Updates an existing protected range with the specified protectedRangeId.
+--
+-- /See:/ 'updateProtectedRangeRequest' smart constructor.
+data UpdateProtectedRangeRequest = UpdateProtectedRangeRequest'
+    { _uprrProtectedRange :: !(Maybe ProtectedRange)
+    , _uprrFields         :: !(Maybe FieldMask)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateProtectedRangeRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uprrProtectedRange'
+--
+-- * 'uprrFields'
+updateProtectedRangeRequest
+    :: UpdateProtectedRangeRequest
+updateProtectedRangeRequest =
+    UpdateProtectedRangeRequest'
+    { _uprrProtectedRange = Nothing
+    , _uprrFields = Nothing
+    }
+
+-- | The protected range to update with the new properties. If a nonzero
+-- protectedRangeId is specified, the protected range will use that ID. (It
+-- is an error to specify the ID of a protected range that already exists.)
+uprrProtectedRange :: Lens' UpdateProtectedRangeRequest (Maybe ProtectedRange)
+uprrProtectedRange
+  = lens _uprrProtectedRange
+      (\ s a -> s{_uprrProtectedRange = a})
+
+-- | The fields that should be updated. At least one field must be specified.
+-- The root \`protectedRange\` is implied and should not be specified. A
+-- single \`\"*\"\` can be used as short-hand for listing every field.
+uprrFields :: Lens' UpdateProtectedRangeRequest (Maybe FieldMask)
+uprrFields
+  = lens _uprrFields (\ s a -> s{_uprrFields = a})
+
+instance FromJSON UpdateProtectedRangeRequest where
+        parseJSON
+          = withObject "UpdateProtectedRangeRequest"
+              (\ o ->
+                 UpdateProtectedRangeRequest' <$>
+                   (o .:? "protectedRange") <*> (o .:? "fields"))
+
+instance ToJSON UpdateProtectedRangeRequest where
+        toJSON UpdateProtectedRangeRequest'{..}
+          = object
+              (catMaybes
+                 [("protectedRange" .=) <$> _uprrProtectedRange,
+                  ("fields" .=) <$> _uprrFields])
+
+-- | The result of adding a sheet.
+--
+-- /See:/ 'addSheetResponse' smart constructor.
+newtype AddSheetResponse = AddSheetResponse'
+    { _aProperties :: Maybe SheetProperties
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddSheetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aProperties'
+addSheetResponse
+    :: AddSheetResponse
+addSheetResponse =
+    AddSheetResponse'
+    { _aProperties = Nothing
+    }
+
+-- | The properties of the newly added sheet.
+aProperties :: Lens' AddSheetResponse (Maybe SheetProperties)
+aProperties
+  = lens _aProperties (\ s a -> s{_aProperties = a})
+
+instance FromJSON AddSheetResponse where
+        parseJSON
+          = withObject "AddSheetResponse"
+              (\ o -> AddSheetResponse' <$> (o .:? "properties"))
+
+instance ToJSON AddSheetResponse where
+        toJSON AddSheetResponse'{..}
+          = object
+              (catMaybes [("properties" .=) <$> _aProperties])
+
+-- | A protected range.
+--
+-- /See:/ 'protectedRange' smart constructor.
+data ProtectedRange = ProtectedRange'
+    { _prProtectedRangeId      :: !(Maybe (Textual Int32))
+    , _prWarningOnly           :: !(Maybe Bool)
+    , _prNamedRangeId          :: !(Maybe Text)
+    , _prRange                 :: !(Maybe GridRange)
+    , _prEditors               :: !(Maybe Editors)
+    , _prUnprotectedRanges     :: !(Maybe [GridRange])
+    , _prRequestingUserCanEdit :: !(Maybe Bool)
+    , _prDescription           :: !(Maybe Text)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ProtectedRange' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'prProtectedRangeId'
+--
+-- * 'prWarningOnly'
+--
+-- * 'prNamedRangeId'
+--
+-- * 'prRange'
+--
+-- * 'prEditors'
+--
+-- * 'prUnprotectedRanges'
+--
+-- * 'prRequestingUserCanEdit'
+--
+-- * 'prDescription'
+protectedRange
+    :: ProtectedRange
+protectedRange =
+    ProtectedRange'
+    { _prProtectedRangeId = Nothing
+    , _prWarningOnly = Nothing
+    , _prNamedRangeId = Nothing
+    , _prRange = Nothing
+    , _prEditors = Nothing
+    , _prUnprotectedRanges = Nothing
+    , _prRequestingUserCanEdit = Nothing
+    , _prDescription = Nothing
+    }
+
+-- | The ID of the protected range. This field is read-only.
+prProtectedRangeId :: Lens' ProtectedRange (Maybe Int32)
+prProtectedRangeId
+  = lens _prProtectedRangeId
+      (\ s a -> s{_prProtectedRangeId = a})
+      . mapping _Coerce
+
+-- | True if this protected range will show a warning when editing.
+-- Warning-based protection means that every user can edit data in the
+-- protected range, except editing will prompt a warning asking the user to
+-- confirm the edit. When writing: if this field is true, then editors is
+-- ignored. Additionally, if this field is changed from true to false and
+-- the \`editors\` field is not set (nor included in the field mask), then
+-- the editors will be set to all the editors in the document.
+prWarningOnly :: Lens' ProtectedRange (Maybe Bool)
+prWarningOnly
+  = lens _prWarningOnly
+      (\ s a -> s{_prWarningOnly = a})
+
+-- | The named range this protected range is backed by, if any. When writing,
+-- only one of range or named_range_id may be set.
+prNamedRangeId :: Lens' ProtectedRange (Maybe Text)
+prNamedRangeId
+  = lens _prNamedRangeId
+      (\ s a -> s{_prNamedRangeId = a})
+
+-- | The range that is being protected. The range may be fully unbounded, in
+-- which case this is considered a protected sheet. When writing, only one
+-- of range or named_range_id may be set.
+prRange :: Lens' ProtectedRange (Maybe GridRange)
+prRange = lens _prRange (\ s a -> s{_prRange = a})
+
+-- | The users and groups with edit access to the protected range. This field
+-- is only visible to users with edit access to the protected range and the
+-- document. Editors are not supported with warning_only protection.
+prEditors :: Lens' ProtectedRange (Maybe Editors)
+prEditors
+  = lens _prEditors (\ s a -> s{_prEditors = a})
+
+-- | The list of unprotected ranges within a protected sheet. Unprotected
+-- ranges are only supported on protected sheets.
+prUnprotectedRanges :: Lens' ProtectedRange [GridRange]
+prUnprotectedRanges
+  = lens _prUnprotectedRanges
+      (\ s a -> s{_prUnprotectedRanges = a})
+      . _Default
+      . _Coerce
+
+-- | True if the user who requested this protected range can edit the
+-- protected area. This field is read-only.
+prRequestingUserCanEdit :: Lens' ProtectedRange (Maybe Bool)
+prRequestingUserCanEdit
+  = lens _prRequestingUserCanEdit
+      (\ s a -> s{_prRequestingUserCanEdit = a})
+
+-- | The description of this protected range.
+prDescription :: Lens' ProtectedRange (Maybe Text)
+prDescription
+  = lens _prDescription
+      (\ s a -> s{_prDescription = a})
+
+instance FromJSON ProtectedRange where
+        parseJSON
+          = withObject "ProtectedRange"
+              (\ o ->
+                 ProtectedRange' <$>
+                   (o .:? "protectedRangeId") <*> (o .:? "warningOnly")
+                     <*> (o .:? "namedRangeId")
+                     <*> (o .:? "range")
+                     <*> (o .:? "editors")
+                     <*> (o .:? "unprotectedRanges" .!= mempty)
+                     <*> (o .:? "requestingUserCanEdit")
+                     <*> (o .:? "description"))
+
+instance ToJSON ProtectedRange where
+        toJSON ProtectedRange'{..}
+          = object
+              (catMaybes
+                 [("protectedRangeId" .=) <$> _prProtectedRangeId,
+                  ("warningOnly" .=) <$> _prWarningOnly,
+                  ("namedRangeId" .=) <$> _prNamedRangeId,
+                  ("range" .=) <$> _prRange,
+                  ("editors" .=) <$> _prEditors,
+                  ("unprotectedRanges" .=) <$> _prUnprotectedRanges,
+                  ("requestingUserCanEdit" .=) <$>
+                    _prRequestingUserCanEdit,
+                  ("description" .=) <$> _prDescription])
+
+-- | An axis of the chart. A chart may not have more than one axis per axis
+-- position.
+--
+-- /See:/ 'basicChartAxis' smart constructor.
+data BasicChartAxis = BasicChartAxis'
+    { _bcaFormat   :: !(Maybe TextFormat)
+    , _bcaTitle    :: !(Maybe Text)
+    , _bcaPosition :: !(Maybe BasicChartAxisPosition)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicChartAxis' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcaFormat'
+--
+-- * 'bcaTitle'
+--
+-- * 'bcaPosition'
+basicChartAxis
+    :: BasicChartAxis
+basicChartAxis =
+    BasicChartAxis'
+    { _bcaFormat = Nothing
+    , _bcaTitle = Nothing
+    , _bcaPosition = Nothing
+    }
+
+-- | The format of the title. Only valid if the axis is not associated with
+-- the domain.
+bcaFormat :: Lens' BasicChartAxis (Maybe TextFormat)
+bcaFormat
+  = lens _bcaFormat (\ s a -> s{_bcaFormat = a})
+
+-- | The title of this axis. If set, this overrides any title inferred from
+-- headers of the data.
+bcaTitle :: Lens' BasicChartAxis (Maybe Text)
+bcaTitle = lens _bcaTitle (\ s a -> s{_bcaTitle = a})
+
+-- | The position of this axis.
+bcaPosition :: Lens' BasicChartAxis (Maybe BasicChartAxisPosition)
+bcaPosition
+  = lens _bcaPosition (\ s a -> s{_bcaPosition = a})
+
+instance FromJSON BasicChartAxis where
+        parseJSON
+          = withObject "BasicChartAxis"
+              (\ o ->
+                 BasicChartAxis' <$>
+                   (o .:? "format") <*> (o .:? "title") <*>
+                     (o .:? "position"))
+
+instance ToJSON BasicChartAxis where
+        toJSON BasicChartAxis'{..}
+          = object
+              (catMaybes
+                 [("format" .=) <$> _bcaFormat,
+                  ("title" .=) <$> _bcaTitle,
+                  ("position" .=) <$> _bcaPosition])
+
+-- | Data in the grid, as well as metadata about the dimensions.
+--
+-- /See:/ 'gridData' smart constructor.
+data GridData = GridData'
+    { _gdRowMetadata    :: !(Maybe [DimensionProperties])
+    , _gdStartRow       :: !(Maybe (Textual Int32))
+    , _gdRowData        :: !(Maybe [RowData])
+    , _gdColumnMetadata :: !(Maybe [DimensionProperties])
+    , _gdStartColumn    :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'GridData' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'gdRowMetadata'
+--
+-- * 'gdStartRow'
+--
+-- * 'gdRowData'
+--
+-- * 'gdColumnMetadata'
+--
+-- * 'gdStartColumn'
+gridData
+    :: GridData
+gridData =
+    GridData'
+    { _gdRowMetadata = Nothing
+    , _gdStartRow = Nothing
+    , _gdRowData = Nothing
+    , _gdColumnMetadata = Nothing
+    , _gdStartColumn = Nothing
+    }
+
+-- | Metadata about the requested rows in the grid, starting with the row in
+-- start_row.
+gdRowMetadata :: Lens' GridData [DimensionProperties]
+gdRowMetadata
+  = lens _gdRowMetadata
+      (\ s a -> s{_gdRowMetadata = a})
+      . _Default
+      . _Coerce
+
+-- | The first row this GridData refers to, zero-based.
+gdStartRow :: Lens' GridData (Maybe Int32)
+gdStartRow
+  = lens _gdStartRow (\ s a -> s{_gdStartRow = a}) .
+      mapping _Coerce
+
+-- | The data in the grid, one entry per row, starting with the row in
+-- startRow. The values in RowData will correspond to columns starting at
+-- start_column.
+gdRowData :: Lens' GridData [RowData]
+gdRowData
+  = lens _gdRowData (\ s a -> s{_gdRowData = a}) .
+      _Default
+      . _Coerce
+
+-- | Metadata about the requested columns in the grid, starting with the
+-- column in start_column.
+gdColumnMetadata :: Lens' GridData [DimensionProperties]
+gdColumnMetadata
+  = lens _gdColumnMetadata
+      (\ s a -> s{_gdColumnMetadata = a})
+      . _Default
+      . _Coerce
+
+-- | The first column this GridData refers to, zero-based.
+gdStartColumn :: Lens' GridData (Maybe Int32)
+gdStartColumn
+  = lens _gdStartColumn
+      (\ s a -> s{_gdStartColumn = a})
+      . mapping _Coerce
+
+instance FromJSON GridData where
+        parseJSON
+          = withObject "GridData"
+              (\ o ->
+                 GridData' <$>
+                   (o .:? "rowMetadata" .!= mempty) <*>
+                     (o .:? "startRow")
+                     <*> (o .:? "rowData" .!= mempty)
+                     <*> (o .:? "columnMetadata" .!= mempty)
+                     <*> (o .:? "startColumn"))
+
+instance ToJSON GridData where
+        toJSON GridData'{..}
+          = object
+              (catMaybes
+                 [("rowMetadata" .=) <$> _gdRowMetadata,
+                  ("startRow" .=) <$> _gdStartRow,
+                  ("rowData" .=) <$> _gdRowData,
+                  ("columnMetadata" .=) <$> _gdColumnMetadata,
+                  ("startColumn" .=) <$> _gdStartColumn])
+
+-- | The number format of a cell.
+--
+-- /See:/ 'numberFormat' smart constructor.
+data NumberFormat = NumberFormat'
+    { _nfPattern :: !(Maybe Text)
+    , _nfType    :: !(Maybe NumberFormatType)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NumberFormat' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'nfPattern'
+--
+-- * 'nfType'
+numberFormat
+    :: NumberFormat
+numberFormat =
+    NumberFormat'
+    { _nfPattern = Nothing
+    , _nfType = Nothing
+    }
+
+-- | Pattern string used for formatting. If not set, a default pattern based
+-- on the user\'s locale will be used if necessary for the given type.
+nfPattern :: Lens' NumberFormat (Maybe Text)
+nfPattern
+  = lens _nfPattern (\ s a -> s{_nfPattern = a})
+
+-- | The type of the number format. When writing, this field must be set.
+nfType :: Lens' NumberFormat (Maybe NumberFormatType)
+nfType = lens _nfType (\ s a -> s{_nfType = a})
+
+instance FromJSON NumberFormat where
+        parseJSON
+          = withObject "NumberFormat"
+              (\ o ->
+                 NumberFormat' <$>
+                   (o .:? "pattern") <*> (o .:? "type"))
+
+instance ToJSON NumberFormat where
+        toJSON NumberFormat'{..}
+          = object
+              (catMaybes
+                 [("pattern" .=) <$> _nfPattern,
+                  ("type" .=) <$> _nfType])
+
+-- | The reply for batch updating a spreadsheet.
+--
+-- /See:/ 'batchUpdateSpreadsheetResponse' smart constructor.
+data BatchUpdateSpreadsheetResponse = BatchUpdateSpreadsheetResponse'
+    { _busrSpreadsheetId :: !(Maybe Text)
+    , _busrReplies       :: !(Maybe [Response])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchUpdateSpreadsheetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'busrSpreadsheetId'
+--
+-- * 'busrReplies'
+batchUpdateSpreadsheetResponse
+    :: BatchUpdateSpreadsheetResponse
+batchUpdateSpreadsheetResponse =
+    BatchUpdateSpreadsheetResponse'
+    { _busrSpreadsheetId = Nothing
+    , _busrReplies = Nothing
+    }
+
+-- | The spreadsheet the updates were applied to.
+busrSpreadsheetId :: Lens' BatchUpdateSpreadsheetResponse (Maybe Text)
+busrSpreadsheetId
+  = lens _busrSpreadsheetId
+      (\ s a -> s{_busrSpreadsheetId = a})
+
+-- | The reply of the updates. This maps 1:1 with the updates, although
+-- replies to some requests may be empty.
+busrReplies :: Lens' BatchUpdateSpreadsheetResponse [Response]
+busrReplies
+  = lens _busrReplies (\ s a -> s{_busrReplies = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON BatchUpdateSpreadsheetResponse
+         where
+        parseJSON
+          = withObject "BatchUpdateSpreadsheetResponse"
+              (\ o ->
+                 BatchUpdateSpreadsheetResponse' <$>
+                   (o .:? "spreadsheetId") <*>
+                     (o .:? "replies" .!= mempty))
+
+instance ToJSON BatchUpdateSpreadsheetResponse where
+        toJSON BatchUpdateSpreadsheetResponse'{..}
+          = object
+              (catMaybes
+                 [("spreadsheetId" .=) <$> _busrSpreadsheetId,
+                  ("replies" .=) <$> _busrReplies])
+
+-- | Sets a data validation rule to every cell in the range. To clear
+-- validation in a range, call this with no rule specified.
+--
+-- /See:/ 'setDataValidationRequest' smart constructor.
+data SetDataValidationRequest = SetDataValidationRequest'
+    { _sdvrRule  :: !(Maybe DataValidationRule)
+    , _sdvrRange :: !(Maybe GridRange)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetDataValidationRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sdvrRule'
+--
+-- * 'sdvrRange'
+setDataValidationRequest
+    :: SetDataValidationRequest
+setDataValidationRequest =
+    SetDataValidationRequest'
+    { _sdvrRule = Nothing
+    , _sdvrRange = Nothing
+    }
+
+-- | The data validation rule to set on each cell in the range, or empty to
+-- clear the data validation in the range.
+sdvrRule :: Lens' SetDataValidationRequest (Maybe DataValidationRule)
+sdvrRule = lens _sdvrRule (\ s a -> s{_sdvrRule = a})
+
+-- | The range the data validation rule should apply to.
+sdvrRange :: Lens' SetDataValidationRequest (Maybe GridRange)
+sdvrRange
+  = lens _sdvrRange (\ s a -> s{_sdvrRange = a})
+
+instance FromJSON SetDataValidationRequest where
+        parseJSON
+          = withObject "SetDataValidationRequest"
+              (\ o ->
+                 SetDataValidationRequest' <$>
+                   (o .:? "rule") <*> (o .:? "range"))
+
+instance ToJSON SetDataValidationRequest where
+        toJSON SetDataValidationRequest'{..}
+          = object
+              (catMaybes
+                 [("rule" .=) <$> _sdvrRule,
+                  ("range" .=) <$> _sdvrRange])
+
+-- | Duplicates a particular filter view.
+--
+-- /See:/ 'duplicateFilterViewRequest' smart constructor.
+newtype DuplicateFilterViewRequest = DuplicateFilterViewRequest'
+    { _dFilterId :: Maybe (Textual Int32)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DuplicateFilterViewRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dFilterId'
+duplicateFilterViewRequest
+    :: DuplicateFilterViewRequest
+duplicateFilterViewRequest =
+    DuplicateFilterViewRequest'
+    { _dFilterId = Nothing
+    }
+
+-- | The ID of the filter being duplicated.
+dFilterId :: Lens' DuplicateFilterViewRequest (Maybe Int32)
+dFilterId
+  = lens _dFilterId (\ s a -> s{_dFilterId = a}) .
+      mapping _Coerce
+
+instance FromJSON DuplicateFilterViewRequest where
+        parseJSON
+          = withObject "DuplicateFilterViewRequest"
+              (\ o ->
+                 DuplicateFilterViewRequest' <$> (o .:? "filterId"))
+
+instance ToJSON DuplicateFilterViewRequest where
+        toJSON DuplicateFilterViewRequest'{..}
+          = object (catMaybes [("filterId" .=) <$> _dFilterId])
+
+-- | A single grouping (either row or column) in a pivot table.
+--
+-- /See:/ 'pivotGroup' smart constructor.
+data PivotGroup = PivotGroup'
+    { _pgValueMetadata      :: !(Maybe [PivotGroupValueMetadata])
+    , _pgSourceColumnOffSet :: !(Maybe (Textual Int32))
+    , _pgSortOrder          :: !(Maybe PivotGroupSortOrder)
+    , _pgShowTotals         :: !(Maybe Bool)
+    , _pgValueBucket        :: !(Maybe PivotGroupSortValueBucket)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PivotGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pgValueMetadata'
+--
+-- * 'pgSourceColumnOffSet'
+--
+-- * 'pgSortOrder'
+--
+-- * 'pgShowTotals'
+--
+-- * 'pgValueBucket'
+pivotGroup
+    :: PivotGroup
+pivotGroup =
+    PivotGroup'
+    { _pgValueMetadata = Nothing
+    , _pgSourceColumnOffSet = Nothing
+    , _pgSortOrder = Nothing
+    , _pgShowTotals = Nothing
+    , _pgValueBucket = Nothing
+    }
+
+-- | Metadata about values in the grouping.
+pgValueMetadata :: Lens' PivotGroup [PivotGroupValueMetadata]
+pgValueMetadata
+  = lens _pgValueMetadata
+      (\ s a -> s{_pgValueMetadata = a})
+      . _Default
+      . _Coerce
+
+-- | The column offset of the source range that this grouping is based on.
+-- For example, if the source was \`C10:E15\`, a \`sourceColumnOffset\` of
+-- \`0\` means this group refers to column \`C\`, whereas the offset \`1\`
+-- would refer to column \`D\`.
+pgSourceColumnOffSet :: Lens' PivotGroup (Maybe Int32)
+pgSourceColumnOffSet
+  = lens _pgSourceColumnOffSet
+      (\ s a -> s{_pgSourceColumnOffSet = a})
+      . mapping _Coerce
+
+-- | The order the values in this group should be sorted.
+pgSortOrder :: Lens' PivotGroup (Maybe PivotGroupSortOrder)
+pgSortOrder
+  = lens _pgSortOrder (\ s a -> s{_pgSortOrder = a})
+
+-- | True if the pivot table should include the totals for this grouping.
+pgShowTotals :: Lens' PivotGroup (Maybe Bool)
+pgShowTotals
+  = lens _pgShowTotals (\ s a -> s{_pgShowTotals = a})
+
+-- | The bucket of the opposite pivot group to sort by. If not specified,
+-- sorting is alphabetical by this group\'s values.
+pgValueBucket :: Lens' PivotGroup (Maybe PivotGroupSortValueBucket)
+pgValueBucket
+  = lens _pgValueBucket
+      (\ s a -> s{_pgValueBucket = a})
+
+instance FromJSON PivotGroup where
+        parseJSON
+          = withObject "PivotGroup"
+              (\ o ->
+                 PivotGroup' <$>
+                   (o .:? "valueMetadata" .!= mempty) <*>
+                     (o .:? "sourceColumnOffset")
+                     <*> (o .:? "sortOrder")
+                     <*> (o .:? "showTotals")
+                     <*> (o .:? "valueBucket"))
+
+instance ToJSON PivotGroup where
+        toJSON PivotGroup'{..}
+          = object
+              (catMaybes
+                 [("valueMetadata" .=) <$> _pgValueMetadata,
+                  ("sourceColumnOffset" .=) <$> _pgSourceColumnOffSet,
+                  ("sortOrder" .=) <$> _pgSortOrder,
+                  ("showTotals" .=) <$> _pgShowTotals,
+                  ("valueBucket" .=) <$> _pgValueBucket])
+
+-- | A rule describing a conditional format.
+--
+-- /See:/ 'conditionalFormatRule' smart constructor.
+data ConditionalFormatRule = ConditionalFormatRule'
+    { _cfrBooleanRule  :: !(Maybe BooleanRule)
+    , _cfrGradientRule :: !(Maybe GradientRule)
+    , _cfrRanges       :: !(Maybe [GridRange])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ConditionalFormatRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cfrBooleanRule'
+--
+-- * 'cfrGradientRule'
+--
+-- * 'cfrRanges'
+conditionalFormatRule
+    :: ConditionalFormatRule
+conditionalFormatRule =
+    ConditionalFormatRule'
+    { _cfrBooleanRule = Nothing
+    , _cfrGradientRule = Nothing
+    , _cfrRanges = Nothing
+    }
+
+-- | The formatting is either \"on\" or \"off\" according to the rule.
+cfrBooleanRule :: Lens' ConditionalFormatRule (Maybe BooleanRule)
+cfrBooleanRule
+  = lens _cfrBooleanRule
+      (\ s a -> s{_cfrBooleanRule = a})
+
+-- | The formatting will vary based on the gradients in the rule.
+cfrGradientRule :: Lens' ConditionalFormatRule (Maybe GradientRule)
+cfrGradientRule
+  = lens _cfrGradientRule
+      (\ s a -> s{_cfrGradientRule = a})
+
+-- | The ranges that will be formatted if the condition is true. All the
+-- ranges must be on the same grid.
+cfrRanges :: Lens' ConditionalFormatRule [GridRange]
+cfrRanges
+  = lens _cfrRanges (\ s a -> s{_cfrRanges = a}) .
+      _Default
+      . _Coerce
+
+instance FromJSON ConditionalFormatRule where
+        parseJSON
+          = withObject "ConditionalFormatRule"
+              (\ o ->
+                 ConditionalFormatRule' <$>
+                   (o .:? "booleanRule") <*> (o .:? "gradientRule") <*>
+                     (o .:? "ranges" .!= mempty))
+
+instance ToJSON ConditionalFormatRule where
+        toJSON ConditionalFormatRule'{..}
+          = object
+              (catMaybes
+                 [("booleanRule" .=) <$> _cfrBooleanRule,
+                  ("gradientRule" .=) <$> _cfrGradientRule,
+                  ("ranges" .=) <$> _cfrRanges])
+
+-- | The specification for a basic chart. See BasicChartType for the list of
+-- charts this supports.
+--
+-- /See:/ 'basicChartSpec' smart constructor.
+data BasicChartSpec = BasicChartSpec'
+    { _bHeaderCount    :: !(Maybe (Textual Int32))
+    , _bLegendPosition :: !(Maybe BasicChartSpecLegendPosition)
+    , _bSeries         :: !(Maybe [BasicChartSeries])
+    , _bChartType      :: !(Maybe BasicChartSpecChartType)
+    , _bDomains        :: !(Maybe [BasicChartDomain])
+    , _bAxis           :: !(Maybe [BasicChartAxis])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicChartSpec' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bHeaderCount'
+--
+-- * 'bLegendPosition'
+--
+-- * 'bSeries'
+--
+-- * 'bChartType'
+--
+-- * 'bDomains'
+--
+-- * 'bAxis'
+basicChartSpec
+    :: BasicChartSpec
+basicChartSpec =
+    BasicChartSpec'
+    { _bHeaderCount = Nothing
+    , _bLegendPosition = Nothing
+    , _bSeries = Nothing
+    , _bChartType = Nothing
+    , _bDomains = Nothing
+    , _bAxis = Nothing
+    }
+
+-- | The number of rows or columns in the data that are \"headers\". If not
+-- set, Google Sheets will guess how many rows are headers based on the
+-- data. (Note that BasicChartAxis.title may override the axis title
+-- inferred from the header values.)
+bHeaderCount :: Lens' BasicChartSpec (Maybe Int32)
+bHeaderCount
+  = lens _bHeaderCount (\ s a -> s{_bHeaderCount = a})
+      . mapping _Coerce
+
+-- | The position of the chart legend.
+bLegendPosition :: Lens' BasicChartSpec (Maybe BasicChartSpecLegendPosition)
+bLegendPosition
+  = lens _bLegendPosition
+      (\ s a -> s{_bLegendPosition = a})
+
+-- | The data this chart is visualizing.
+bSeries :: Lens' BasicChartSpec [BasicChartSeries]
+bSeries
+  = lens _bSeries (\ s a -> s{_bSeries = a}) . _Default
+      . _Coerce
+
+-- | The type of the chart.
+bChartType :: Lens' BasicChartSpec (Maybe BasicChartSpecChartType)
+bChartType
+  = lens _bChartType (\ s a -> s{_bChartType = a})
+
+-- | The domain of data this is charting. Only a single domain is currently
+-- supported.
+bDomains :: Lens' BasicChartSpec [BasicChartDomain]
+bDomains
+  = lens _bDomains (\ s a -> s{_bDomains = a}) .
+      _Default
+      . _Coerce
+
+-- | The axis on the chart.
+bAxis :: Lens' BasicChartSpec [BasicChartAxis]
+bAxis
+  = lens _bAxis (\ s a -> s{_bAxis = a}) . _Default .
+      _Coerce
+
+instance FromJSON BasicChartSpec where
+        parseJSON
+          = withObject "BasicChartSpec"
+              (\ o ->
+                 BasicChartSpec' <$>
+                   (o .:? "headerCount") <*> (o .:? "legendPosition")
+                     <*> (o .:? "series" .!= mempty)
+                     <*> (o .:? "chartType")
+                     <*> (o .:? "domains" .!= mempty)
+                     <*> (o .:? "axis" .!= mempty))
+
+instance ToJSON BasicChartSpec where
+        toJSON BasicChartSpec'{..}
+          = object
+              (catMaybes
+                 [("headerCount" .=) <$> _bHeaderCount,
+                  ("legendPosition" .=) <$> _bLegendPosition,
+                  ("series" .=) <$> _bSeries,
+                  ("chartType" .=) <$> _bChartType,
+                  ("domains" .=) <$> _bDomains,
+                  ("axis" .=) <$> _bAxis])
+
+-- | Adds a new conditional format rule at the given index. All subsequent
+-- rules\' indexes are incremented.
+--
+-- /See:/ 'addConditionalFormatRuleRequest' smart constructor.
+data AddConditionalFormatRuleRequest = AddConditionalFormatRuleRequest'
+    { _acfrrRule  :: !(Maybe ConditionalFormatRule)
+    , _acfrrIndex :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddConditionalFormatRuleRequest' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acfrrRule'
+--
+-- * 'acfrrIndex'
+addConditionalFormatRuleRequest
+    :: AddConditionalFormatRuleRequest
+addConditionalFormatRuleRequest =
+    AddConditionalFormatRuleRequest'
+    { _acfrrRule = Nothing
+    , _acfrrIndex = Nothing
+    }
+
+-- | The rule to add.
+acfrrRule :: Lens' AddConditionalFormatRuleRequest (Maybe ConditionalFormatRule)
+acfrrRule
+  = lens _acfrrRule (\ s a -> s{_acfrrRule = a})
+
+-- | The zero-based index where the rule should be inserted.
+acfrrIndex :: Lens' AddConditionalFormatRuleRequest (Maybe Int32)
+acfrrIndex
+  = lens _acfrrIndex (\ s a -> s{_acfrrIndex = a}) .
+      mapping _Coerce
+
+instance FromJSON AddConditionalFormatRuleRequest
+         where
+        parseJSON
+          = withObject "AddConditionalFormatRuleRequest"
+              (\ o ->
+                 AddConditionalFormatRuleRequest' <$>
+                   (o .:? "rule") <*> (o .:? "index"))
+
+instance ToJSON AddConditionalFormatRuleRequest where
+        toJSON AddConditionalFormatRuleRequest'{..}
+          = object
+              (catMaybes
+                 [("rule" .=) <$> _acfrrRule,
+                  ("index" .=) <$> _acfrrIndex])
+
+-- | The result of duplicating a sheet.
+--
+-- /See:/ 'duplicateSheetResponse' smart constructor.
+newtype DuplicateSheetResponse = DuplicateSheetResponse'
+    { _dsrProperties :: Maybe SheetProperties
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DuplicateSheetResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrProperties'
+duplicateSheetResponse
+    :: DuplicateSheetResponse
+duplicateSheetResponse =
+    DuplicateSheetResponse'
+    { _dsrProperties = Nothing
+    }
+
+-- | The properties of the duplicate sheet.
+dsrProperties :: Lens' DuplicateSheetResponse (Maybe SheetProperties)
+dsrProperties
+  = lens _dsrProperties
+      (\ s a -> s{_dsrProperties = a})
+
+instance FromJSON DuplicateSheetResponse where
+        parseJSON
+          = withObject "DuplicateSheetResponse"
+              (\ o ->
+                 DuplicateSheetResponse' <$> (o .:? "properties"))
+
+instance ToJSON DuplicateSheetResponse where
+        toJSON DuplicateSheetResponse'{..}
+          = object
+              (catMaybes [("properties" .=) <$> _dsrProperties])
+
+-- | The format of a run of text in a cell. Absent values indicate that the
+-- field isn\'t specified.
+--
+-- /See:/ 'textFormat' smart constructor.
+data TextFormat = TextFormat'
+    { _tfFontFamily      :: !(Maybe Text)
+    , _tfForegRoundColor :: !(Maybe Color)
+    , _tfFontSize        :: !(Maybe (Textual Int32))
+    , _tfUnderline       :: !(Maybe Bool)
+    , _tfItalic          :: !(Maybe Bool)
+    , _tfBold            :: !(Maybe Bool)
+    , _tfStrikethrough   :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TextFormat' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tfFontFamily'
+--
+-- * 'tfForegRoundColor'
+--
+-- * 'tfFontSize'
+--
+-- * 'tfUnderline'
+--
+-- * 'tfItalic'
+--
+-- * 'tfBold'
+--
+-- * 'tfStrikethrough'
+textFormat
+    :: TextFormat
+textFormat =
+    TextFormat'
+    { _tfFontFamily = Nothing
+    , _tfForegRoundColor = Nothing
+    , _tfFontSize = Nothing
+    , _tfUnderline = Nothing
+    , _tfItalic = Nothing
+    , _tfBold = Nothing
+    , _tfStrikethrough = Nothing
+    }
+
+-- | The font family.
+tfFontFamily :: Lens' TextFormat (Maybe Text)
+tfFontFamily
+  = lens _tfFontFamily (\ s a -> s{_tfFontFamily = a})
+
+-- | The foreground color of the text.
+tfForegRoundColor :: Lens' TextFormat (Maybe Color)
+tfForegRoundColor
+  = lens _tfForegRoundColor
+      (\ s a -> s{_tfForegRoundColor = a})
+
+-- | The size of the font.
+tfFontSize :: Lens' TextFormat (Maybe Int32)
+tfFontSize
+  = lens _tfFontSize (\ s a -> s{_tfFontSize = a}) .
+      mapping _Coerce
+
+-- | True if the text is underlined.
+tfUnderline :: Lens' TextFormat (Maybe Bool)
+tfUnderline
+  = lens _tfUnderline (\ s a -> s{_tfUnderline = a})
+
+-- | True if the text is italicized.
+tfItalic :: Lens' TextFormat (Maybe Bool)
+tfItalic = lens _tfItalic (\ s a -> s{_tfItalic = a})
+
+-- | True if the text is bold.
+tfBold :: Lens' TextFormat (Maybe Bool)
+tfBold = lens _tfBold (\ s a -> s{_tfBold = a})
+
+-- | True if the text has a strikethrough.
+tfStrikethrough :: Lens' TextFormat (Maybe Bool)
+tfStrikethrough
+  = lens _tfStrikethrough
+      (\ s a -> s{_tfStrikethrough = a})
+
+instance FromJSON TextFormat where
+        parseJSON
+          = withObject "TextFormat"
+              (\ o ->
+                 TextFormat' <$>
+                   (o .:? "fontFamily") <*> (o .:? "foregroundColor")
+                     <*> (o .:? "fontSize")
+                     <*> (o .:? "underline")
+                     <*> (o .:? "italic")
+                     <*> (o .:? "bold")
+                     <*> (o .:? "strikethrough"))
+
+instance ToJSON TextFormat where
+        toJSON TextFormat'{..}
+          = object
+              (catMaybes
+                 [("fontFamily" .=) <$> _tfFontFamily,
+                  ("foregroundColor" .=) <$> _tfForegRoundColor,
+                  ("fontSize" .=) <$> _tfFontSize,
+                  ("underline" .=) <$> _tfUnderline,
+                  ("italic" .=) <$> _tfItalic, ("bold" .=) <$> _tfBold,
+                  ("strikethrough" .=) <$> _tfStrikethrough])
+
+-- | The domain of a chart. For example, if charting stock prices over time,
+-- this would be the date.
+--
+-- /See:/ 'basicChartDomain' smart constructor.
+newtype BasicChartDomain = BasicChartDomain'
+    { _bcdDomain :: Maybe ChartData
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BasicChartDomain' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bcdDomain'
+basicChartDomain
+    :: BasicChartDomain
+basicChartDomain =
+    BasicChartDomain'
+    { _bcdDomain = Nothing
+    }
+
+-- | The data of the domain. For example, if charting stock prices over time,
+-- this is the data representing the dates.
+bcdDomain :: Lens' BasicChartDomain (Maybe ChartData)
+bcdDomain
+  = lens _bcdDomain (\ s a -> s{_bcdDomain = a})
+
+instance FromJSON BasicChartDomain where
+        parseJSON
+          = withObject "BasicChartDomain"
+              (\ o -> BasicChartDomain' <$> (o .:? "domain"))
+
+instance ToJSON BasicChartDomain where
+        toJSON BasicChartDomain'{..}
+          = object (catMaybes [("domain" .=) <$> _bcdDomain])
+
+-- | The amount of padding around the cell, in pixels. When updating padding,
+-- every field must be specified.
+--
+-- /See:/ 'padding' smart constructor.
+data Padding = Padding'
+    { _pBottom :: !(Maybe (Textual Int32))
+    , _pLeft   :: !(Maybe (Textual Int32))
+    , _pRight  :: !(Maybe (Textual Int32))
+    , _pTop    :: !(Maybe (Textual Int32))
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Padding' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pBottom'
+--
+-- * 'pLeft'
+--
+-- * 'pRight'
+--
+-- * 'pTop'
+padding
+    :: Padding
+padding =
+    Padding'
+    { _pBottom = Nothing
+    , _pLeft = Nothing
+    , _pRight = Nothing
+    , _pTop = Nothing
+    }
+
+-- | The bottom padding of the cell.
+pBottom :: Lens' Padding (Maybe Int32)
+pBottom
+  = lens _pBottom (\ s a -> s{_pBottom = a}) .
+      mapping _Coerce
+
+-- | The left padding of the cell.
+pLeft :: Lens' Padding (Maybe Int32)
+pLeft
+  = lens _pLeft (\ s a -> s{_pLeft = a}) .
+      mapping _Coerce
+
+-- | The right padding of the cell.
+pRight :: Lens' Padding (Maybe Int32)
+pRight
+  = lens _pRight (\ s a -> s{_pRight = a}) .
+      mapping _Coerce
+
+-- | The top padding of the cell.
+pTop :: Lens' Padding (Maybe Int32)
+pTop
+  = lens _pTop (\ s a -> s{_pTop = a}) .
+      mapping _Coerce
+
+instance FromJSON Padding where
+        parseJSON
+          = withObject "Padding"
+              (\ o ->
+                 Padding' <$>
+                   (o .:? "bottom") <*> (o .:? "left") <*>
+                     (o .:? "right")
+                     <*> (o .:? "top"))
+
+instance ToJSON Padding where
+        toJSON Padding'{..}
+          = object
+              (catMaybes
+                 [("bottom" .=) <$> _pBottom, ("left" .=) <$> _pLeft,
+                  ("right" .=) <$> _pRight, ("top" .=) <$> _pTop])
+
+-- | The specifications of a chart.
+--
+-- /See:/ 'chartSpec' smart constructor.
+data ChartSpec = ChartSpec'
+    { _csTitle                   :: !(Maybe Text)
+    , _csPieChart                :: !(Maybe PieChartSpec)
+    , _csBasicChart              :: !(Maybe BasicChartSpec)
+    , _csHiddenDimensionStrategy :: !(Maybe ChartSpecHiddenDimensionStrategy)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ChartSpec' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csTitle'
+--
+-- * 'csPieChart'
+--
+-- * 'csBasicChart'
+--
+-- * 'csHiddenDimensionStrategy'
+chartSpec
+    :: ChartSpec
+chartSpec =
+    ChartSpec'
+    { _csTitle = Nothing
+    , _csPieChart = Nothing
+    , _csBasicChart = Nothing
+    , _csHiddenDimensionStrategy = Nothing
+    }
+
+-- | The title of the chart.
+csTitle :: Lens' ChartSpec (Maybe Text)
+csTitle = lens _csTitle (\ s a -> s{_csTitle = a})
+
+-- | A pie chart specification.
+csPieChart :: Lens' ChartSpec (Maybe PieChartSpec)
+csPieChart
+  = lens _csPieChart (\ s a -> s{_csPieChart = a})
+
+-- | A basic chart specification, can be one of many kinds of charts. See
+-- BasicChartType for the list of all charts this supports.
+csBasicChart :: Lens' ChartSpec (Maybe BasicChartSpec)
+csBasicChart
+  = lens _csBasicChart (\ s a -> s{_csBasicChart = a})
+
+-- | Determines how the charts will use hidden rows or columns.
+csHiddenDimensionStrategy :: Lens' ChartSpec (Maybe ChartSpecHiddenDimensionStrategy)
+csHiddenDimensionStrategy
+  = lens _csHiddenDimensionStrategy
+      (\ s a -> s{_csHiddenDimensionStrategy = a})
+
+instance FromJSON ChartSpec where
+        parseJSON
+          = withObject "ChartSpec"
+              (\ o ->
+                 ChartSpec' <$>
+                   (o .:? "title") <*> (o .:? "pieChart") <*>
+                     (o .:? "basicChart")
+                     <*> (o .:? "hiddenDimensionStrategy"))
+
+instance ToJSON ChartSpec where
+        toJSON ChartSpec'{..}
+          = object
+              (catMaybes
+                 [("title" .=) <$> _csTitle,
+                  ("pieChart" .=) <$> _csPieChart,
+                  ("basicChart" .=) <$> _csBasicChart,
+                  ("hiddenDimensionStrategy" .=) <$>
+                    _csHiddenDimensionStrategy])
+
+-- | Properties about a dimension.
+--
+-- /See:/ 'dimensionProperties' smart constructor.
+data DimensionProperties = DimensionProperties'
+    { _dpHiddenByFilter :: !(Maybe Bool)
+    , _dpPixelSize      :: !(Maybe (Textual Int32))
+    , _dpHiddenByUser   :: !(Maybe Bool)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DimensionProperties' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dpHiddenByFilter'
+--
+-- * 'dpPixelSize'
+--
+-- * 'dpHiddenByUser'
+dimensionProperties
+    :: DimensionProperties
+dimensionProperties =
+    DimensionProperties'
+    { _dpHiddenByFilter = Nothing
+    , _dpPixelSize = Nothing
+    , _dpHiddenByUser = Nothing
+    }
+
+-- | True if this dimension is being filtered. This field is read-only.
+dpHiddenByFilter :: Lens' DimensionProperties (Maybe Bool)
+dpHiddenByFilter
+  = lens _dpHiddenByFilter
+      (\ s a -> s{_dpHiddenByFilter = a})
+
+-- | The height (if a row) or width (if a column) of the dimension in pixels.
+dpPixelSize :: Lens' DimensionProperties (Maybe Int32)
+dpPixelSize
+  = lens _dpPixelSize (\ s a -> s{_dpPixelSize = a}) .
+      mapping _Coerce
+
+-- | True if this dimension is explicitly hidden.
+dpHiddenByUser :: Lens' DimensionProperties (Maybe Bool)
+dpHiddenByUser
+  = lens _dpHiddenByUser
+      (\ s a -> s{_dpHiddenByUser = a})
+
+instance FromJSON DimensionProperties where
+        parseJSON
+          = withObject "DimensionProperties"
+              (\ o ->
+                 DimensionProperties' <$>
+                   (o .:? "hiddenByFilter") <*> (o .:? "pixelSize") <*>
+                     (o .:? "hiddenByUser"))
+
+instance ToJSON DimensionProperties where
+        toJSON DimensionProperties'{..}
+          = object
+              (catMaybes
+                 [("hiddenByFilter" .=) <$> _dpHiddenByFilter,
+                  ("pixelSize" .=) <$> _dpPixelSize,
+                  ("hiddenByUser" .=) <$> _dpHiddenByUser])
+
+-- | The response when retrieving more than one range of values in a
+-- spreadsheet.
+--
+-- /See:/ 'batchGetValuesResponse' smart constructor.
+data BatchGetValuesResponse = BatchGetValuesResponse'
+    { _bgvrSpreadsheetId :: !(Maybe Text)
+    , _bgvrValueRanges   :: !(Maybe [ValueRange])
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BatchGetValuesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bgvrSpreadsheetId'
+--
+-- * 'bgvrValueRanges'
+batchGetValuesResponse
+    :: BatchGetValuesResponse
+batchGetValuesResponse =
+    BatchGetValuesResponse'
+    { _bgvrSpreadsheetId = Nothing
+    , _bgvrValueRanges = Nothing
+    }
+
+-- | The ID of the spreadsheet the data was retrieved from.
+bgvrSpreadsheetId :: Lens' BatchGetValuesResponse (Maybe Text)
+bgvrSpreadsheetId
+  = lens _bgvrSpreadsheetId
+      (\ s a -> s{_bgvrSpreadsheetId = a})
+
+-- | The requested values. The order of the ValueRanges is the same as the
+-- order of the requested ranges.
+bgvrValueRanges :: Lens' BatchGetValuesResponse [ValueRange]
+bgvrValueRanges
+  = lens _bgvrValueRanges
+      (\ s a -> s{_bgvrValueRanges = a})
+      . _Default
+      . _Coerce
+
+instance FromJSON BatchGetValuesResponse where
+        parseJSON
+          = withObject "BatchGetValuesResponse"
+              (\ o ->
+                 BatchGetValuesResponse' <$>
+                   (o .:? "spreadsheetId") <*>
+                     (o .:? "valueRanges" .!= mempty))
+
+instance ToJSON BatchGetValuesResponse where
+        toJSON BatchGetValuesResponse'{..}
+          = object
+              (catMaybes
+                 [("spreadsheetId" .=) <$> _bgvrSpreadsheetId,
+                  ("valueRanges" .=) <$> _bgvrValueRanges])
+
+-- | A single kind of update to apply to a spreadsheet.
+--
+-- /See:/ 'request'' smart constructor.
+data Request' = Request''
+    { _reqAddFilterView                :: !(Maybe AddFilterViewRequest)
+    , _reqDeleteProtectedRange         :: !(Maybe DeleteProtectedRangeRequest)
+    , _reqUpdateProtectedRange         :: !(Maybe UpdateProtectedRangeRequest)
+    , _reqUpdateCells                  :: !(Maybe UpdateCellsRequest)
+    , _reqDuplicateFilterView          :: !(Maybe DuplicateFilterViewRequest)
+    , _reqAddConditionalFormatRule     :: !(Maybe AddConditionalFormatRuleRequest)
+    , _reqSortRange                    :: !(Maybe SortRangeRequest)
+    , _reqUpdateNamedRange             :: !(Maybe UpdateNamedRangeRequest)
+    , _reqDeleteNamedRange             :: !(Maybe DeleteNamedRangeRequest)
+    , _reqClearBasicFilter             :: !(Maybe ClearBasicFilterRequest)
+    , _reqAppendCells                  :: !(Maybe AppendCellsRequest)
+    , _reqPasteData                    :: !(Maybe PasteDataRequest)
+    , _reqUpdateEmbeddedObjectPosition :: !(Maybe UpdateEmbeddedObjectPositionRequest)
+    , _reqCopyPaste                    :: !(Maybe CopyPasteRequest)
+    , _reqAutoResizeDimensions         :: !(Maybe AutoResizeDimensionsRequest)
+    , _reqAddSheet                     :: !(Maybe AddSheetRequest)
+    , _reqFindReplace                  :: !(Maybe FindReplaceRequest)
+    , _reqDeleteDimension              :: !(Maybe DeleteDimensionRequest)
+    , _reqCutPaste                     :: !(Maybe CutPasteRequest)
+    , _reqMoveDimension                :: !(Maybe MoveDimensionRequest)
+    , _reqRepeatCell                   :: !(Maybe RepeatCellRequest)
+    , _reqAddProtectedRange            :: !(Maybe AddProtectedRangeRequest)
+    , _reqUpdateFilterView             :: !(Maybe UpdateFilterViewRequest)
+    , _reqDeleteFilterView             :: !(Maybe DeleteFilterViewRequest)
+    , _reqInsertDimension              :: !(Maybe InsertDimensionRequest)
+    , _reqUpdateSheetProperties        :: !(Maybe UpdateSheetPropertiesRequest)
+    , _reqDeleteConditionalFormatRule  :: !(Maybe DeleteConditionalFormatRuleRequest)
+    , _reqUpdateConditionalFormatRule  :: !(Maybe UpdateConditionalFormatRuleRequest)
+    , _reqDeleteEmbeddedObject         :: !(Maybe DeleteEmbeddedObjectRequest)
+    , _reqMergeCells                   :: !(Maybe MergeCellsRequest)
+    , _reqAddNamedRange                :: !(Maybe AddNamedRangeRequest)
+    , _reqAddChart                     :: !(Maybe AddChartRequest)
+    , _reqDuplicateSheet               :: !(Maybe DuplicateSheetRequest)
+    , _reqAutoFill                     :: !(Maybe AutoFillRequest)
+    , _reqUpdateDimensionProperties    :: !(Maybe UpdateDimensionPropertiesRequest)
+    , _reqUpdateChartSpec              :: !(Maybe UpdateChartSpecRequest)
+    , _reqSetBasicFilter               :: !(Maybe SetBasicFilterRequest)
+    , _reqTextToColumns                :: !(Maybe TextToColumnsRequest)
+    , _reqUpdateSpreadsheetProperties  :: !(Maybe UpdateSpreadsheetPropertiesRequest)
+    , _reqDeleteSheet                  :: !(Maybe DeleteSheetRequest)
+    , _reqUnmergeCells                 :: !(Maybe UnmergeCellsRequest)
+    , _reqUpdateBOrders                :: !(Maybe UpdateBOrdersRequest)
+    , _reqAppendDimension              :: !(Maybe AppendDimensionRequest)
+    , _reqSetDataValidation            :: !(Maybe SetDataValidationRequest)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Request' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'reqAddFilterView'
+--
+-- * 'reqDeleteProtectedRange'
+--
+-- * 'reqUpdateProtectedRange'
+--
+-- * 'reqUpdateCells'
+--
+-- * 'reqDuplicateFilterView'
+--
+-- * 'reqAddConditionalFormatRule'
+--
+-- * 'reqSortRange'
+--
+-- * 'reqUpdateNamedRange'
+--
+-- * 'reqDeleteNamedRange'
+--
+-- * 'reqClearBasicFilter'
+--
+-- * 'reqAppendCells'
+--
+-- * 'reqPasteData'
+--
+-- * 'reqUpdateEmbeddedObjectPosition'
+--
+-- * 'reqCopyPaste'
+--
+-- * 'reqAutoResizeDimensions'
+--
+-- * 'reqAddSheet'
+--
+-- * 'reqFindReplace'
+--
+-- * 'reqDeleteDimension'
+--
+-- * 'reqCutPaste'
+--
+-- * 'reqMoveDimension'
+--
+-- * 'reqRepeatCell'
+--
+-- * 'reqAddProtectedRange'
+--
+-- * 'reqUpdateFilterView'
+--
+-- * 'reqDeleteFilterView'
+--
+-- * 'reqInsertDimension'
+--
+-- * 'reqUpdateSheetProperties'
+--
+-- * 'reqDeleteConditionalFormatRule'
+--
+-- * 'reqUpdateConditionalFormatRule'
+--
+-- * 'reqDeleteEmbeddedObject'
+--
+-- * 'reqMergeCells'
+--
+-- * 'reqAddNamedRange'
+--
+-- * 'reqAddChart'
+--
+-- * 'reqDuplicateSheet'
+--
+-- * 'reqAutoFill'
+--
+-- * 'reqUpdateDimensionProperties'
+--
+-- * 'reqUpdateChartSpec'
+--
+-- * 'reqSetBasicFilter'
+--
+-- * 'reqTextToColumns'
+--
+-- * 'reqUpdateSpreadsheetProperties'
+--
+-- * 'reqDeleteSheet'
+--
+-- * 'reqUnmergeCells'
+--
+-- * 'reqUpdateBOrders'
+--
+-- * 'reqAppendDimension'
+--
+-- * 'reqSetDataValidation'
+request'
+    :: Request'
+request' =
+    Request''
+    { _reqAddFilterView = Nothing
+    , _reqDeleteProtectedRange = Nothing
+    , _reqUpdateProtectedRange = Nothing
+    , _reqUpdateCells = Nothing
+    , _reqDuplicateFilterView = Nothing
+    , _reqAddConditionalFormatRule = Nothing
+    , _reqSortRange = Nothing
+    , _reqUpdateNamedRange = Nothing
+    , _reqDeleteNamedRange = Nothing
+    , _reqClearBasicFilter = Nothing
+    , _reqAppendCells = Nothing
+    , _reqPasteData = Nothing
+    , _reqUpdateEmbeddedObjectPosition = Nothing
+    , _reqCopyPaste = Nothing
+    , _reqAutoResizeDimensions = Nothing
+    , _reqAddSheet = Nothing
+    , _reqFindReplace = Nothing
+    , _reqDeleteDimension = Nothing
+    , _reqCutPaste = Nothing
+    , _reqMoveDimension = Nothing
+    , _reqRepeatCell = Nothing
+    , _reqAddProtectedRange = Nothing
+    , _reqUpdateFilterView = Nothing
+    , _reqDeleteFilterView = Nothing
+    , _reqInsertDimension = Nothing
+    , _reqUpdateSheetProperties = Nothing
+    , _reqDeleteConditionalFormatRule = Nothing
+    , _reqUpdateConditionalFormatRule = Nothing
+    , _reqDeleteEmbeddedObject = Nothing
+    , _reqMergeCells = Nothing
+    , _reqAddNamedRange = Nothing
+    , _reqAddChart = Nothing
+    , _reqDuplicateSheet = Nothing
+    , _reqAutoFill = Nothing
+    , _reqUpdateDimensionProperties = Nothing
+    , _reqUpdateChartSpec = Nothing
+    , _reqSetBasicFilter = Nothing
+    , _reqTextToColumns = Nothing
+    , _reqUpdateSpreadsheetProperties = Nothing
+    , _reqDeleteSheet = Nothing
+    , _reqUnmergeCells = Nothing
+    , _reqUpdateBOrders = Nothing
+    , _reqAppendDimension = Nothing
+    , _reqSetDataValidation = Nothing
+    }
+
+-- | Adds a filter view.
+reqAddFilterView :: Lens' Request' (Maybe AddFilterViewRequest)
+reqAddFilterView
+  = lens _reqAddFilterView
+      (\ s a -> s{_reqAddFilterView = a})
+
+-- | Deletes a protected range.
+reqDeleteProtectedRange :: Lens' Request' (Maybe DeleteProtectedRangeRequest)
+reqDeleteProtectedRange
+  = lens _reqDeleteProtectedRange
+      (\ s a -> s{_reqDeleteProtectedRange = a})
+
+-- | Updates a protected range.
+reqUpdateProtectedRange :: Lens' Request' (Maybe UpdateProtectedRangeRequest)
+reqUpdateProtectedRange
+  = lens _reqUpdateProtectedRange
+      (\ s a -> s{_reqUpdateProtectedRange = a})
+
+-- | Updates many cells at once.
+reqUpdateCells :: Lens' Request' (Maybe UpdateCellsRequest)
+reqUpdateCells
+  = lens _reqUpdateCells
+      (\ s a -> s{_reqUpdateCells = a})
+
+-- | Duplicates a filter view.
+reqDuplicateFilterView :: Lens' Request' (Maybe DuplicateFilterViewRequest)
+reqDuplicateFilterView
+  = lens _reqDuplicateFilterView
+      (\ s a -> s{_reqDuplicateFilterView = a})
+
+-- | Adds a new conditional format rule.
+reqAddConditionalFormatRule :: Lens' Request' (Maybe AddConditionalFormatRuleRequest)
+reqAddConditionalFormatRule
+  = lens _reqAddConditionalFormatRule
+      (\ s a -> s{_reqAddConditionalFormatRule = a})
+
+-- | Sorts data in a range.
+reqSortRange :: Lens' Request' (Maybe SortRangeRequest)
+reqSortRange
+  = lens _reqSortRange (\ s a -> s{_reqSortRange = a})
+
+-- | Updates a named range.
+reqUpdateNamedRange :: Lens' Request' (Maybe UpdateNamedRangeRequest)
+reqUpdateNamedRange
+  = lens _reqUpdateNamedRange
+      (\ s a -> s{_reqUpdateNamedRange = a})
+
+-- | Deletes a named range.
+reqDeleteNamedRange :: Lens' Request' (Maybe DeleteNamedRangeRequest)
+reqDeleteNamedRange
+  = lens _reqDeleteNamedRange
+      (\ s a -> s{_reqDeleteNamedRange = a})
+
+-- | Clears the basic filter on a sheet.
+reqClearBasicFilter :: Lens' Request' (Maybe ClearBasicFilterRequest)
+reqClearBasicFilter
+  = lens _reqClearBasicFilter
+      (\ s a -> s{_reqClearBasicFilter = a})
+
+-- | Appends cells after the last row with data in a sheet.
+reqAppendCells :: Lens' Request' (Maybe AppendCellsRequest)
+reqAppendCells
+  = lens _reqAppendCells
+      (\ s a -> s{_reqAppendCells = a})
+
+-- | Pastes data (HTML or delimited) into a sheet.
+reqPasteData :: Lens' Request' (Maybe PasteDataRequest)
+reqPasteData
+  = lens _reqPasteData (\ s a -> s{_reqPasteData = a})
+
+-- | Updates an embedded object\'s (e.g. chart, image) position.
+reqUpdateEmbeddedObjectPosition :: Lens' Request' (Maybe UpdateEmbeddedObjectPositionRequest)
+reqUpdateEmbeddedObjectPosition
+  = lens _reqUpdateEmbeddedObjectPosition
+      (\ s a -> s{_reqUpdateEmbeddedObjectPosition = a})
+
+-- | Copies data from one area and pastes it to another.
+reqCopyPaste :: Lens' Request' (Maybe CopyPasteRequest)
+reqCopyPaste
+  = lens _reqCopyPaste (\ s a -> s{_reqCopyPaste = a})
+
+-- | Automatically resizes one or more dimensions based on the contents of
+-- the cells in that dimension.
+reqAutoResizeDimensions :: Lens' Request' (Maybe AutoResizeDimensionsRequest)
+reqAutoResizeDimensions
+  = lens _reqAutoResizeDimensions
+      (\ s a -> s{_reqAutoResizeDimensions = a})
+
+-- | Adds a sheet.
+reqAddSheet :: Lens' Request' (Maybe AddSheetRequest)
+reqAddSheet
+  = lens _reqAddSheet (\ s a -> s{_reqAddSheet = a})
+
+-- | Finds and replaces occurrences of some text with other text.
+reqFindReplace :: Lens' Request' (Maybe FindReplaceRequest)
+reqFindReplace
+  = lens _reqFindReplace
+      (\ s a -> s{_reqFindReplace = a})
+
+-- | Deletes rows or columns in a sheet.
+reqDeleteDimension :: Lens' Request' (Maybe DeleteDimensionRequest)
+reqDeleteDimension
+  = lens _reqDeleteDimension
+      (\ s a -> s{_reqDeleteDimension = a})
+
+-- | Cuts data from one area and pastes it to another.
+reqCutPaste :: Lens' Request' (Maybe CutPasteRequest)
+reqCutPaste
+  = lens _reqCutPaste (\ s a -> s{_reqCutPaste = a})
+
+-- | Moves rows or columns to another location in a sheet.
+reqMoveDimension :: Lens' Request' (Maybe MoveDimensionRequest)
+reqMoveDimension
+  = lens _reqMoveDimension
+      (\ s a -> s{_reqMoveDimension = a})
+
+-- | Repeats a single cell across a range.
+reqRepeatCell :: Lens' Request' (Maybe RepeatCellRequest)
+reqRepeatCell
+  = lens _reqRepeatCell
+      (\ s a -> s{_reqRepeatCell = a})
+
+-- | Adds a protected range.
+reqAddProtectedRange :: Lens' Request' (Maybe AddProtectedRangeRequest)
+reqAddProtectedRange
+  = lens _reqAddProtectedRange
+      (\ s a -> s{_reqAddProtectedRange = a})
+
+-- | Updates the properties of a filter view.
+reqUpdateFilterView :: Lens' Request' (Maybe UpdateFilterViewRequest)
+reqUpdateFilterView
+  = lens _reqUpdateFilterView
+      (\ s a -> s{_reqUpdateFilterView = a})
+
+-- | Deletes a filter view from a sheet.
+reqDeleteFilterView :: Lens' Request' (Maybe DeleteFilterViewRequest)
+reqDeleteFilterView
+  = lens _reqDeleteFilterView
+      (\ s a -> s{_reqDeleteFilterView = a})
+
+-- | Inserts new rows or columns in a sheet.
+reqInsertDimension :: Lens' Request' (Maybe InsertDimensionRequest)
+reqInsertDimension
+  = lens _reqInsertDimension
+      (\ s a -> s{_reqInsertDimension = a})
+
+-- | Updates a sheet\'s properties.
+reqUpdateSheetProperties :: Lens' Request' (Maybe UpdateSheetPropertiesRequest)
+reqUpdateSheetProperties
+  = lens _reqUpdateSheetProperties
+      (\ s a -> s{_reqUpdateSheetProperties = a})
+
+-- | Deletes an existing conditional format rule.
+reqDeleteConditionalFormatRule :: Lens' Request' (Maybe DeleteConditionalFormatRuleRequest)
+reqDeleteConditionalFormatRule
+  = lens _reqDeleteConditionalFormatRule
+      (\ s a -> s{_reqDeleteConditionalFormatRule = a})
+
+-- | Updates an existing conditional format rule.
+reqUpdateConditionalFormatRule :: Lens' Request' (Maybe UpdateConditionalFormatRuleRequest)
+reqUpdateConditionalFormatRule
+  = lens _reqUpdateConditionalFormatRule
+      (\ s a -> s{_reqUpdateConditionalFormatRule = a})
+
+-- | Deletes an embedded object (e.g, chart, image) in a sheet.
+reqDeleteEmbeddedObject :: Lens' Request' (Maybe DeleteEmbeddedObjectRequest)
+reqDeleteEmbeddedObject
+  = lens _reqDeleteEmbeddedObject
+      (\ s a -> s{_reqDeleteEmbeddedObject = a})
+
+-- | Merges cells together.
+reqMergeCells :: Lens' Request' (Maybe MergeCellsRequest)
+reqMergeCells
+  = lens _reqMergeCells
+      (\ s a -> s{_reqMergeCells = a})
+
+-- | Adds a named range.
+reqAddNamedRange :: Lens' Request' (Maybe AddNamedRangeRequest)
+reqAddNamedRange
+  = lens _reqAddNamedRange
+      (\ s a -> s{_reqAddNamedRange = a})
+
+-- | Adds a chart.
+reqAddChart :: Lens' Request' (Maybe AddChartRequest)
+reqAddChart
+  = lens _reqAddChart (\ s a -> s{_reqAddChart = a})
+
+-- | Duplicates a sheet.
+reqDuplicateSheet :: Lens' Request' (Maybe DuplicateSheetRequest)
+reqDuplicateSheet
+  = lens _reqDuplicateSheet
+      (\ s a -> s{_reqDuplicateSheet = a})
+
+-- | Automatically fills in more data based on existing data.
+reqAutoFill :: Lens' Request' (Maybe AutoFillRequest)
+reqAutoFill
+  = lens _reqAutoFill (\ s a -> s{_reqAutoFill = a})
+
+-- | Updates dimensions\' properties.
+reqUpdateDimensionProperties :: Lens' Request' (Maybe UpdateDimensionPropertiesRequest)
+reqUpdateDimensionProperties
+  = lens _reqUpdateDimensionProperties
+      (\ s a -> s{_reqUpdateDimensionProperties = a})
+
+-- | Updates a chart\'s specifications.
+reqUpdateChartSpec :: Lens' Request' (Maybe UpdateChartSpecRequest)
+reqUpdateChartSpec
+  = lens _reqUpdateChartSpec
+      (\ s a -> s{_reqUpdateChartSpec = a})
+
+-- | Sets the basic filter on a sheet.
+reqSetBasicFilter :: Lens' Request' (Maybe SetBasicFilterRequest)
+reqSetBasicFilter
+  = lens _reqSetBasicFilter
+      (\ s a -> s{_reqSetBasicFilter = a})
+
+-- | Converts a column of text into many columns of text.
+reqTextToColumns :: Lens' Request' (Maybe TextToColumnsRequest)
+reqTextToColumns
+  = lens _reqTextToColumns
+      (\ s a -> s{_reqTextToColumns = a})
+
+-- | Updates the spreadsheet\'s properties.
+reqUpdateSpreadsheetProperties :: Lens' Request' (Maybe UpdateSpreadsheetPropertiesRequest)
+reqUpdateSpreadsheetProperties
+  = lens _reqUpdateSpreadsheetProperties
+      (\ s a -> s{_reqUpdateSpreadsheetProperties = a})
+
+-- | Deletes a sheet.
+reqDeleteSheet :: Lens' Request' (Maybe DeleteSheetRequest)
+reqDeleteSheet
+  = lens _reqDeleteSheet
+      (\ s a -> s{_reqDeleteSheet = a})
+
+-- | Unmerges merged cells.
+reqUnmergeCells :: Lens' Request' (Maybe UnmergeCellsRequest)
+reqUnmergeCells
+  = lens _reqUnmergeCells
+      (\ s a -> s{_reqUnmergeCells = a})
+
+-- | Updates the borders in a range of cells.
+reqUpdateBOrders :: Lens' Request' (Maybe UpdateBOrdersRequest)
+reqUpdateBOrders
+  = lens _reqUpdateBOrders
+      (\ s a -> s{_reqUpdateBOrders = a})
+
+-- | Appends dimensions to the end of a sheet.
+reqAppendDimension :: Lens' Request' (Maybe AppendDimensionRequest)
+reqAppendDimension
+  = lens _reqAppendDimension
+      (\ s a -> s{_reqAppendDimension = a})
+
+-- | Sets data validation for one or more cells.
+reqSetDataValidation :: Lens' Request' (Maybe SetDataValidationRequest)
+reqSetDataValidation
+  = lens _reqSetDataValidation
+      (\ s a -> s{_reqSetDataValidation = a})
+
+instance FromJSON Request' where
+        parseJSON
+          = withObject "Request"
+              (\ o ->
+                 Request'' <$>
+                   (o .:? "addFilterView") <*>
+                     (o .:? "deleteProtectedRange")
+                     <*> (o .:? "updateProtectedRange")
+                     <*> (o .:? "updateCells")
+                     <*> (o .:? "duplicateFilterView")
+                     <*> (o .:? "addConditionalFormatRule")
+                     <*> (o .:? "sortRange")
+                     <*> (o .:? "updateNamedRange")
+                     <*> (o .:? "deleteNamedRange")
+                     <*> (o .:? "clearBasicFilter")
+                     <*> (o .:? "appendCells")
+                     <*> (o .:? "pasteData")
+                     <*> (o .:? "updateEmbeddedObjectPosition")
+                     <*> (o .:? "copyPaste")
+                     <*> (o .:? "autoResizeDimensions")
+                     <*> (o .:? "addSheet")
+                     <*> (o .:? "findReplace")
+                     <*> (o .:? "deleteDimension")
+                     <*> (o .:? "cutPaste")
+                     <*> (o .:? "moveDimension")
+                     <*> (o .:? "repeatCell")
+                     <*> (o .:? "addProtectedRange")
+                     <*> (o .:? "updateFilterView")
+                     <*> (o .:? "deleteFilterView")
+                     <*> (o .:? "insertDimension")
+                     <*> (o .:? "updateSheetProperties")
+                     <*> (o .:? "deleteConditionalFormatRule")
+                     <*> (o .:? "updateConditionalFormatRule")
+                     <*> (o .:? "deleteEmbeddedObject")
+                     <*> (o .:? "mergeCells")
+                     <*> (o .:? "addNamedRange")
+                     <*> (o .:? "addChart")
+                     <*> (o .:? "duplicateSheet")
+                     <*> (o .:? "autoFill")
+                     <*> (o .:? "updateDimensionProperties")
+                     <*> (o .:? "updateChartSpec")
+                     <*> (o .:? "setBasicFilter")
+                     <*> (o .:? "textToColumns")
+                     <*> (o .:? "updateSpreadsheetProperties")
+                     <*> (o .:? "deleteSheet")
+                     <*> (o .:? "unmergeCells")
+                     <*> (o .:? "updateBorders")
+                     <*> (o .:? "appendDimension")
+                     <*> (o .:? "setDataValidation"))
+
+instance ToJSON Request' where
+        toJSON Request''{..}
+          = object
+              (catMaybes
+                 [("addFilterView" .=) <$> _reqAddFilterView,
+                  ("deleteProtectedRange" .=) <$>
+                    _reqDeleteProtectedRange,
+                  ("updateProtectedRange" .=) <$>
+                    _reqUpdateProtectedRange,
+                  ("updateCells" .=) <$> _reqUpdateCells,
+                  ("duplicateFilterView" .=) <$>
+                    _reqDuplicateFilterView,
+                  ("addConditionalFormatRule" .=) <$>
+                    _reqAddConditionalFormatRule,
+                  ("sortRange" .=) <$> _reqSortRange,
+                  ("updateNamedRange" .=) <$> _reqUpdateNamedRange,
+                  ("deleteNamedRange" .=) <$> _reqDeleteNamedRange,
+                  ("clearBasicFilter" .=) <$> _reqClearBasicFilter,
+                  ("appendCells" .=) <$> _reqAppendCells,
+                  ("pasteData" .=) <$> _reqPasteData,
+                  ("updateEmbeddedObjectPosition" .=) <$>
+                    _reqUpdateEmbeddedObjectPosition,
+                  ("copyPaste" .=) <$> _reqCopyPaste,
+                  ("autoResizeDimensions" .=) <$>
+                    _reqAutoResizeDimensions,
+                  ("addSheet" .=) <$> _reqAddSheet,
+                  ("findReplace" .=) <$> _reqFindReplace,
+                  ("deleteDimension" .=) <$> _reqDeleteDimension,
+                  ("cutPaste" .=) <$> _reqCutPaste,
+                  ("moveDimension" .=) <$> _reqMoveDimension,
+                  ("repeatCell" .=) <$> _reqRepeatCell,
+                  ("addProtectedRange" .=) <$> _reqAddProtectedRange,
+                  ("updateFilterView" .=) <$> _reqUpdateFilterView,
+                  ("deleteFilterView" .=) <$> _reqDeleteFilterView,
+                  ("insertDimension" .=) <$> _reqInsertDimension,
+                  ("updateSheetProperties" .=) <$>
+                    _reqUpdateSheetProperties,
+                  ("deleteConditionalFormatRule" .=) <$>
+                    _reqDeleteConditionalFormatRule,
+                  ("updateConditionalFormatRule" .=) <$>
+                    _reqUpdateConditionalFormatRule,
+                  ("deleteEmbeddedObject" .=) <$>
+                    _reqDeleteEmbeddedObject,
+                  ("mergeCells" .=) <$> _reqMergeCells,
+                  ("addNamedRange" .=) <$> _reqAddNamedRange,
+                  ("addChart" .=) <$> _reqAddChart,
+                  ("duplicateSheet" .=) <$> _reqDuplicateSheet,
+                  ("autoFill" .=) <$> _reqAutoFill,
+                  ("updateDimensionProperties" .=) <$>
+                    _reqUpdateDimensionProperties,
+                  ("updateChartSpec" .=) <$> _reqUpdateChartSpec,
+                  ("setBasicFilter" .=) <$> _reqSetBasicFilter,
+                  ("textToColumns" .=) <$> _reqTextToColumns,
+                  ("updateSpreadsheetProperties" .=) <$>
+                    _reqUpdateSpreadsheetProperties,
+                  ("deleteSheet" .=) <$> _reqDeleteSheet,
+                  ("unmergeCells" .=) <$> _reqUnmergeCells,
+                  ("updateBorders" .=) <$> _reqUpdateBOrders,
+                  ("appendDimension" .=) <$> _reqAppendDimension,
+                  ("setDataValidation" .=) <$> _reqSetDataValidation])
+
+-- | The result of deleting a conditional format rule.
+--
+-- /See:/ 'deleteConditionalFormatRuleResponse' smart constructor.
+newtype DeleteConditionalFormatRuleResponse = DeleteConditionalFormatRuleResponse'
+    { _dcfrrRule :: Maybe ConditionalFormatRule
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteConditionalFormatRuleResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcfrrRule'
+deleteConditionalFormatRuleResponse
+    :: DeleteConditionalFormatRuleResponse
+deleteConditionalFormatRuleResponse =
+    DeleteConditionalFormatRuleResponse'
+    { _dcfrrRule = Nothing
+    }
+
+-- | The rule that was deleted.
+dcfrrRule :: Lens' DeleteConditionalFormatRuleResponse (Maybe ConditionalFormatRule)
+dcfrrRule
+  = lens _dcfrrRule (\ s a -> s{_dcfrrRule = a})
+
+instance FromJSON DeleteConditionalFormatRuleResponse
+         where
+        parseJSON
+          = withObject "DeleteConditionalFormatRuleResponse"
+              (\ o ->
+                 DeleteConditionalFormatRuleResponse' <$>
+                   (o .:? "rule"))
+
+instance ToJSON DeleteConditionalFormatRuleResponse
+         where
+        toJSON DeleteConditionalFormatRuleResponse'{..}
+          = object (catMaybes [("rule" .=) <$> _dcfrrRule])
+
+-- | The result of updating a conditional format rule.
+--
+-- /See:/ 'updateConditionalFormatRuleResponse' smart constructor.
+data UpdateConditionalFormatRuleResponse = UpdateConditionalFormatRuleResponse'
+    { _uNewRule  :: !(Maybe ConditionalFormatRule)
+    , _uNewIndex :: !(Maybe (Textual Int32))
+    , _uOldIndex :: !(Maybe (Textual Int32))
+    , _uOldRule  :: !(Maybe ConditionalFormatRule)
+    } deriving (Eq,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'UpdateConditionalFormatRuleResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'uNewRule'
+--
+-- * 'uNewIndex'
+--
+-- * 'uOldIndex'
+--
+-- * 'uOldRule'
+updateConditionalFormatRuleResponse
+    :: UpdateConditionalFormatRuleResponse
+updateConditionalFormatRuleResponse =
+    UpdateConditionalFormatRuleResponse'
+    { _uNewRule = Nothing
+    , _uNewIndex = Nothing
+    , _uOldIndex = Nothing
+    , _uOldRule = Nothing
+    }
+
+-- | The new rule that replaced the old rule (if replacing), or the rule that
+-- was moved (if moved)
+uNewRule :: Lens' UpdateConditionalFormatRuleResponse (Maybe ConditionalFormatRule)
+uNewRule = lens _uNewRule (\ s a -> s{_uNewRule = a})
+
+-- | The index of the new rule.
+uNewIndex :: Lens' UpdateConditionalFormatRuleResponse (Maybe Int32)
+uNewIndex
+  = lens _uNewIndex (\ s a -> s{_uNewIndex = a}) .
+      mapping _Coerce
+
+-- | The old index of the rule. Not set if a rule was replaced (because it is
+-- the same as new_index).
+uOldIndex :: Lens' UpdateConditionalFormatRuleResponse (Maybe Int32)
+uOldIndex
+  = lens _uOldIndex (\ s a -> s{_uOldIndex = a}) .
+      mapping _Coerce
+
+-- | The old (deleted) rule. Not set if a rule was moved (because it is the
+-- same as new_rule).
+uOldRule :: Lens' UpdateConditionalFormatRuleResponse (Maybe ConditionalFormatRule)
+uOldRule = lens _uOldRule (\ s a -> s{_uOldRule = a})
+
+instance FromJSON UpdateConditionalFormatRuleResponse
+         where
+        parseJSON
+          = withObject "UpdateConditionalFormatRuleResponse"
+              (\ o ->
+                 UpdateConditionalFormatRuleResponse' <$>
+                   (o .:? "newRule") <*> (o .:? "newIndex") <*>
+                     (o .:? "oldIndex")
+                     <*> (o .:? "oldRule"))
+
+instance ToJSON UpdateConditionalFormatRuleResponse
+         where
+        toJSON UpdateConditionalFormatRuleResponse'{..}
+          = object
+              (catMaybes
+                 [("newRule" .=) <$> _uNewRule,
+                  ("newIndex" .=) <$> _uNewIndex,
+                  ("oldIndex" .=) <$> _uOldIndex,
+                  ("oldRule" .=) <$> _uOldRule])
diff --git a/gen/Network/Google/Sheets/Types/Sum.hs b/gen/Network/Google/Sheets/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/Google/Sheets/Types/Sum.hs
@@ -0,0 +1,1835 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Network.Google.Sheets.Types.Sum
+-- Copyright   : (c) 2015-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.Google.Sheets.Types.Sum where
+
+import           Network.Google.Prelude
+
+-- | What kind of data to paste.
+data CopyPasteRequestPasteType
+    = PasteNormal
+      -- ^ @PASTE_NORMAL@
+      -- Paste values, formulas, formats, and merges.
+    | PasteValues
+      -- ^ @PASTE_VALUES@
+      -- Paste the values ONLY without formats, formulas, or merges.
+    | PasteFormat
+      -- ^ @PASTE_FORMAT@
+      -- Paste the format and data validation only.
+    | PasteNoBOrders
+      -- ^ @PASTE_NO_BORDERS@
+      -- Like PASTE_NORMAL but without borders.
+    | PasteFormula
+      -- ^ @PASTE_FORMULA@
+      -- Paste the formulas only.
+    | PasteDataValidation
+      -- ^ @PASTE_DATA_VALIDATION@
+      -- Paste the data validation only.
+    | PasteConditionalFormatting
+      -- ^ @PASTE_CONDITIONAL_FORMATTING@
+      -- Paste the conditional formatting rules only.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CopyPasteRequestPasteType
+
+instance FromHttpApiData CopyPasteRequestPasteType where
+    parseQueryParam = \case
+        "PASTE_NORMAL" -> Right PasteNormal
+        "PASTE_VALUES" -> Right PasteValues
+        "PASTE_FORMAT" -> Right PasteFormat
+        "PASTE_NO_BORDERS" -> Right PasteNoBOrders
+        "PASTE_FORMULA" -> Right PasteFormula
+        "PASTE_DATA_VALIDATION" -> Right PasteDataValidation
+        "PASTE_CONDITIONAL_FORMATTING" -> Right PasteConditionalFormatting
+        x -> Left ("Unable to parse CopyPasteRequestPasteType from: " <> x)
+
+instance ToHttpApiData CopyPasteRequestPasteType where
+    toQueryParam = \case
+        PasteNormal -> "PASTE_NORMAL"
+        PasteValues -> "PASTE_VALUES"
+        PasteFormat -> "PASTE_FORMAT"
+        PasteNoBOrders -> "PASTE_NO_BORDERS"
+        PasteFormula -> "PASTE_FORMULA"
+        PasteDataValidation -> "PASTE_DATA_VALIDATION"
+        PasteConditionalFormatting -> "PASTE_CONDITIONAL_FORMATTING"
+
+instance FromJSON CopyPasteRequestPasteType where
+    parseJSON = parseJSONText "CopyPasteRequestPasteType"
+
+instance ToJSON CopyPasteRequestPasteType where
+    toJSON = toJSONText
+
+-- | The position of this axis.
+data BasicChartAxisPosition
+    = BasicChartAxisPositionUnspecified
+      -- ^ @BASIC_CHART_AXIS_POSITION_UNSPECIFIED@
+      -- Default value, do not use.
+    | BottomAxis
+      -- ^ @BOTTOM_AXIS@
+      -- The axis rendered at the bottom of a chart. For most charts, this is the
+      -- standard major axis. For bar charts, this is a minor axis.
+    | LeftAxis
+      -- ^ @LEFT_AXIS@
+      -- The axis rendered at the left of a chart. For most charts, this is a
+      -- minor axis. For bar charts, this is the standard major axis.
+    | RightAxis
+      -- ^ @RIGHT_AXIS@
+      -- The axis rendered at the right of a chart. For most charts, this is a
+      -- minor axis. For bar charts, this is an unusual major axis.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BasicChartAxisPosition
+
+instance FromHttpApiData BasicChartAxisPosition where
+    parseQueryParam = \case
+        "BASIC_CHART_AXIS_POSITION_UNSPECIFIED" -> Right BasicChartAxisPositionUnspecified
+        "BOTTOM_AXIS" -> Right BottomAxis
+        "LEFT_AXIS" -> Right LeftAxis
+        "RIGHT_AXIS" -> Right RightAxis
+        x -> Left ("Unable to parse BasicChartAxisPosition from: " <> x)
+
+instance ToHttpApiData BasicChartAxisPosition where
+    toQueryParam = \case
+        BasicChartAxisPositionUnspecified -> "BASIC_CHART_AXIS_POSITION_UNSPECIFIED"
+        BottomAxis -> "BOTTOM_AXIS"
+        LeftAxis -> "LEFT_AXIS"
+        RightAxis -> "RIGHT_AXIS"
+
+instance FromJSON BasicChartAxisPosition where
+    parseJSON = parseJSONText "BasicChartAxisPosition"
+
+instance ToJSON BasicChartAxisPosition where
+    toJSON = toJSONText
+
+-- | The minor axis that will specify the range of values for this series.
+-- For example, if charting stocks over time, the \"Volume\" series may
+-- want to be pinned to the right with the prices pinned to the left,
+-- because the scale of trading volume is different than the scale of
+-- prices. It is an error to specify an axis that isn\'t a valid minor axis
+-- for the chart\'s type.
+data BasicChartSeriesTargetAxis
+    = BCSTABasicChartAxisPositionUnspecified
+      -- ^ @BASIC_CHART_AXIS_POSITION_UNSPECIFIED@
+      -- Default value, do not use.
+    | BCSTABottomAxis
+      -- ^ @BOTTOM_AXIS@
+      -- The axis rendered at the bottom of a chart. For most charts, this is the
+      -- standard major axis. For bar charts, this is a minor axis.
+    | BCSTALeftAxis
+      -- ^ @LEFT_AXIS@
+      -- The axis rendered at the left of a chart. For most charts, this is a
+      -- minor axis. For bar charts, this is the standard major axis.
+    | BCSTARightAxis
+      -- ^ @RIGHT_AXIS@
+      -- The axis rendered at the right of a chart. For most charts, this is a
+      -- minor axis. For bar charts, this is an unusual major axis.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BasicChartSeriesTargetAxis
+
+instance FromHttpApiData BasicChartSeriesTargetAxis where
+    parseQueryParam = \case
+        "BASIC_CHART_AXIS_POSITION_UNSPECIFIED" -> Right BCSTABasicChartAxisPositionUnspecified
+        "BOTTOM_AXIS" -> Right BCSTABottomAxis
+        "LEFT_AXIS" -> Right BCSTALeftAxis
+        "RIGHT_AXIS" -> Right BCSTARightAxis
+        x -> Left ("Unable to parse BasicChartSeriesTargetAxis from: " <> x)
+
+instance ToHttpApiData BasicChartSeriesTargetAxis where
+    toQueryParam = \case
+        BCSTABasicChartAxisPositionUnspecified -> "BASIC_CHART_AXIS_POSITION_UNSPECIFIED"
+        BCSTABottomAxis -> "BOTTOM_AXIS"
+        BCSTALeftAxis -> "LEFT_AXIS"
+        BCSTARightAxis -> "RIGHT_AXIS"
+
+instance FromJSON BasicChartSeriesTargetAxis where
+    parseJSON = parseJSONText "BasicChartSeriesTargetAxis"
+
+instance ToJSON BasicChartSeriesTargetAxis where
+    toJSON = toJSONText
+
+-- | Whether rows or columns should be appended.
+data AppendDimensionRequestDimension
+    = DimensionUnspecified
+      -- ^ @DIMENSION_UNSPECIFIED@
+      -- The default value, do not use.
+    | Rows
+      -- ^ @ROWS@
+      -- Operates on the rows of a sheet.
+    | Columns
+      -- ^ @COLUMNS@
+      -- Operates on the columns of a sheet.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable AppendDimensionRequestDimension
+
+instance FromHttpApiData AppendDimensionRequestDimension where
+    parseQueryParam = \case
+        "DIMENSION_UNSPECIFIED" -> Right DimensionUnspecified
+        "ROWS" -> Right Rows
+        "COLUMNS" -> Right Columns
+        x -> Left ("Unable to parse AppendDimensionRequestDimension from: " <> x)
+
+instance ToHttpApiData AppendDimensionRequestDimension where
+    toQueryParam = \case
+        DimensionUnspecified -> "DIMENSION_UNSPECIFIED"
+        Rows -> "ROWS"
+        Columns -> "COLUMNS"
+
+instance FromJSON AppendDimensionRequestDimension where
+    parseJSON = parseJSONText "AppendDimensionRequestDimension"
+
+instance ToJSON AppendDimensionRequestDimension where
+    toJSON = toJSONText
+
+-- | The dimension of the span.
+data DimensionRangeDimension
+    = DRDDimensionUnspecified
+      -- ^ @DIMENSION_UNSPECIFIED@
+      -- The default value, do not use.
+    | DRDRows
+      -- ^ @ROWS@
+      -- Operates on the rows of a sheet.
+    | DRDColumns
+      -- ^ @COLUMNS@
+      -- Operates on the columns of a sheet.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable DimensionRangeDimension
+
+instance FromHttpApiData DimensionRangeDimension where
+    parseQueryParam = \case
+        "DIMENSION_UNSPECIFIED" -> Right DRDDimensionUnspecified
+        "ROWS" -> Right DRDRows
+        "COLUMNS" -> Right DRDColumns
+        x -> Left ("Unable to parse DimensionRangeDimension from: " <> x)
+
+instance ToHttpApiData DimensionRangeDimension where
+    toQueryParam = \case
+        DRDDimensionUnspecified -> "DIMENSION_UNSPECIFIED"
+        DRDRows -> "ROWS"
+        DRDColumns -> "COLUMNS"
+
+instance FromJSON DimensionRangeDimension where
+    parseJSON = parseJSONText "DimensionRangeDimension"
+
+instance ToJSON DimensionRangeDimension where
+    toJSON = toJSONText
+
+-- | The dimension that data should be filled into.
+data SourceAndDestinationDimension
+    = SADDDimensionUnspecified
+      -- ^ @DIMENSION_UNSPECIFIED@
+      -- The default value, do not use.
+    | SADDRows
+      -- ^ @ROWS@
+      -- Operates on the rows of a sheet.
+    | SADDColumns
+      -- ^ @COLUMNS@
+      -- Operates on the columns of a sheet.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable SourceAndDestinationDimension
+
+instance FromHttpApiData SourceAndDestinationDimension where
+    parseQueryParam = \case
+        "DIMENSION_UNSPECIFIED" -> Right SADDDimensionUnspecified
+        "ROWS" -> Right SADDRows
+        "COLUMNS" -> Right SADDColumns
+        x -> Left ("Unable to parse SourceAndDestinationDimension from: " <> x)
+
+instance ToHttpApiData SourceAndDestinationDimension where
+    toQueryParam = \case
+        SADDDimensionUnspecified -> "DIMENSION_UNSPECIFIED"
+        SADDRows -> "ROWS"
+        SADDColumns -> "COLUMNS"
+
+instance FromJSON SourceAndDestinationDimension where
+    parseJSON = parseJSONText "SourceAndDestinationDimension"
+
+instance ToJSON SourceAndDestinationDimension where
+    toJSON = toJSONText
+
+-- | The wrap strategy for the value in the cell.
+data CellFormatWrapStrategy
+    = WrapStrategyUnspecified
+      -- ^ @WRAP_STRATEGY_UNSPECIFIED@
+      -- The default value, do not use.
+    | OverflowCell
+      -- ^ @OVERFLOW_CELL@
+      -- Lines that are longer than the cell width will be written in the next
+      -- cell over, so long as that cell is empty. If the next cell over is
+      -- non-empty, this behaves the same as CLIP. The text will never wrap to
+      -- the next line unless the user manually inserts a new line. Example: |
+      -- First sentence. | | Manual newline that is very long. \<- Text continues
+      -- into next cell | Next newline. |
+    | LegacyWrap
+      -- ^ @LEGACY_WRAP@
+      -- This wrap strategy represents the old Google Sheets wrap strategy where
+      -- words that are longer than a line are clipped rather than broken. This
+      -- strategy is not supported on all platforms and is being phased out.
+      -- Example: | Cell has a | | loooooooooo| \<- Word is clipped. | word. |
+    | Clip
+      -- ^ @CLIP@
+      -- Lines that are longer than the cell width will be clipped. The text will
+      -- never wrap to the next line unless the user manually inserts a new line.
+      -- Example: | First sentence. | | Manual newline t| \<- Text is clipped |
+      -- Next newline. |
+    | Wrap
+      -- ^ @WRAP@
+      -- Words that are longer than a line are wrapped at the character level
+      -- rather than clipped. Example: | Cell has a | | loooooooooo| \<- Word is
+      -- broken. | ong word. |
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CellFormatWrapStrategy
+
+instance FromHttpApiData CellFormatWrapStrategy where
+    parseQueryParam = \case
+        "WRAP_STRATEGY_UNSPECIFIED" -> Right WrapStrategyUnspecified
+        "OVERFLOW_CELL" -> Right OverflowCell
+        "LEGACY_WRAP" -> Right LegacyWrap
+        "CLIP" -> Right Clip
+        "WRAP" -> Right Wrap
+        x -> Left ("Unable to parse CellFormatWrapStrategy from: " <> x)
+
+instance ToHttpApiData CellFormatWrapStrategy where
+    toQueryParam = \case
+        WrapStrategyUnspecified -> "WRAP_STRATEGY_UNSPECIFIED"
+        OverflowCell -> "OVERFLOW_CELL"
+        LegacyWrap -> "LEGACY_WRAP"
+        Clip -> "CLIP"
+        Wrap -> "WRAP"
+
+instance FromJSON CellFormatWrapStrategy where
+    parseJSON = parseJSONText "CellFormatWrapStrategy"
+
+instance ToJSON CellFormatWrapStrategy where
+    toJSON = toJSONText
+
+-- | How the input data should be interpreted.
+data BatchUpdateValuesRequestValueInputOption
+    = InputValueOptionUnspecified
+      -- ^ @INPUT_VALUE_OPTION_UNSPECIFIED@
+      -- Default input value. This value must not be used.
+    | Raw
+      -- ^ @RAW@
+      -- The values the user has entered will not be parsed and will be stored
+      -- as-is.
+    | UserEntered
+      -- ^ @USER_ENTERED@
+      -- The values will be parsed as if the user typed them into the UI. Numbers
+      -- will stay as numbers, but strings may be converted to numbers, dates,
+      -- etc. following the same rules that are applied when entering text into a
+      -- cell via the Google Sheets UI.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BatchUpdateValuesRequestValueInputOption
+
+instance FromHttpApiData BatchUpdateValuesRequestValueInputOption where
+    parseQueryParam = \case
+        "INPUT_VALUE_OPTION_UNSPECIFIED" -> Right InputValueOptionUnspecified
+        "RAW" -> Right Raw
+        "USER_ENTERED" -> Right UserEntered
+        x -> Left ("Unable to parse BatchUpdateValuesRequestValueInputOption from: " <> x)
+
+instance ToHttpApiData BatchUpdateValuesRequestValueInputOption where
+    toQueryParam = \case
+        InputValueOptionUnspecified -> "INPUT_VALUE_OPTION_UNSPECIFIED"
+        Raw -> "RAW"
+        UserEntered -> "USER_ENTERED"
+
+instance FromJSON BatchUpdateValuesRequestValueInputOption where
+    parseJSON = parseJSONText "BatchUpdateValuesRequestValueInputOption"
+
+instance ToJSON BatchUpdateValuesRequestValueInputOption where
+    toJSON = toJSONText
+
+-- | Where the legend of the pie chart should be drawn.
+data PieChartSpecLegendPosition
+    = PieChartLegendPositionUnspecified
+      -- ^ @PIE_CHART_LEGEND_POSITION_UNSPECIFIED@
+      -- Default value, do not use.
+    | BottomLegend
+      -- ^ @BOTTOM_LEGEND@
+      -- The legend is rendered on the bottom of the chart.
+    | LeftLegend
+      -- ^ @LEFT_LEGEND@
+      -- The legend is rendered on the left of the chart.
+    | RightLegend
+      -- ^ @RIGHT_LEGEND@
+      -- The legend is rendered on the right of the chart.
+    | TopLegend
+      -- ^ @TOP_LEGEND@
+      -- The legend is rendered on the top of the chart.
+    | NoLegend
+      -- ^ @NO_LEGEND@
+      -- No legend is rendered.
+    | LabeledLegend
+      -- ^ @LABELED_LEGEND@
+      -- Each pie slice has a label attached to it.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PieChartSpecLegendPosition
+
+instance FromHttpApiData PieChartSpecLegendPosition where
+    parseQueryParam = \case
+        "PIE_CHART_LEGEND_POSITION_UNSPECIFIED" -> Right PieChartLegendPositionUnspecified
+        "BOTTOM_LEGEND" -> Right BottomLegend
+        "LEFT_LEGEND" -> Right LeftLegend
+        "RIGHT_LEGEND" -> Right RightLegend
+        "TOP_LEGEND" -> Right TopLegend
+        "NO_LEGEND" -> Right NoLegend
+        "LABELED_LEGEND" -> Right LabeledLegend
+        x -> Left ("Unable to parse PieChartSpecLegendPosition from: " <> x)
+
+instance ToHttpApiData PieChartSpecLegendPosition where
+    toQueryParam = \case
+        PieChartLegendPositionUnspecified -> "PIE_CHART_LEGEND_POSITION_UNSPECIFIED"
+        BottomLegend -> "BOTTOM_LEGEND"
+        LeftLegend -> "LEFT_LEGEND"
+        RightLegend -> "RIGHT_LEGEND"
+        TopLegend -> "TOP_LEGEND"
+        NoLegend -> "NO_LEGEND"
+        LabeledLegend -> "LABELED_LEGEND"
+
+instance FromJSON PieChartSpecLegendPosition where
+    parseJSON = parseJSONText "PieChartSpecLegendPosition"
+
+instance ToJSON PieChartSpecLegendPosition where
+    toJSON = toJSONText
+
+-- | The vertical alignment of the value in the cell.
+data CellFormatVerticalAlignment
+    = VerticalAlignUnspecified
+      -- ^ @VERTICAL_ALIGN_UNSPECIFIED@
+      -- The vertical alignment is not specified. Do not use this.
+    | Top
+      -- ^ @TOP@
+      -- The text is explicitly aligned to the top of the cell.
+    | Middle
+      -- ^ @MIDDLE@
+      -- The text is explicitly aligned to the middle of the cell.
+    | Bottom
+      -- ^ @BOTTOM@
+      -- The text is explicitly aligned to the bottom of the cell.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CellFormatVerticalAlignment
+
+instance FromHttpApiData CellFormatVerticalAlignment where
+    parseQueryParam = \case
+        "VERTICAL_ALIGN_UNSPECIFIED" -> Right VerticalAlignUnspecified
+        "TOP" -> Right Top
+        "MIDDLE" -> Right Middle
+        "BOTTOM" -> Right Bottom
+        x -> Left ("Unable to parse CellFormatVerticalAlignment from: " <> x)
+
+instance ToHttpApiData CellFormatVerticalAlignment where
+    toQueryParam = \case
+        VerticalAlignUnspecified -> "VERTICAL_ALIGN_UNSPECIFIED"
+        Top -> "TOP"
+        Middle -> "MIDDLE"
+        Bottom -> "BOTTOM"
+
+instance FromJSON CellFormatVerticalAlignment where
+    parseJSON = parseJSONText "CellFormatVerticalAlignment"
+
+instance ToJSON CellFormatVerticalAlignment where
+    toJSON = toJSONText
+
+-- | The type of the number format. When writing, this field must be set.
+data NumberFormatType
+    = NumberFormatTypeUnspecified
+      -- ^ @NUMBER_FORMAT_TYPE_UNSPECIFIED@
+      -- The number format is not specified and is based on the contents of the
+      -- cell. Do not explicitly use this.
+    | Text
+      -- ^ @TEXT@
+      -- Text formatting, e.g \`1000.12\`
+    | Number
+      -- ^ @NUMBER@
+      -- Number formatting, e.g, \`1,000.12\`
+    | Percent
+      -- ^ @PERCENT@
+      -- Percent formatting, e.g \`10.12%\`
+    | Currency
+      -- ^ @CURRENCY@
+      -- Currency formatting, e.g \`$1,000.12\`
+    | Date
+      -- ^ @DATE@
+      -- Date formatting, e.g \`9\/26\/2008\`
+    | Time
+      -- ^ @TIME@
+      -- Time formatting, e.g \`3:59:00 PM\`
+    | DateTime
+      -- ^ @DATE_TIME@
+      -- Date+Time formatting, e.g \`9\/26\/08 15:59:00\`
+    | Scientific
+      -- ^ @SCIENTIFIC@
+      -- Scientific number formatting, e.g \`1.01E+03\`
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable NumberFormatType
+
+instance FromHttpApiData NumberFormatType where
+    parseQueryParam = \case
+        "NUMBER_FORMAT_TYPE_UNSPECIFIED" -> Right NumberFormatTypeUnspecified
+        "TEXT" -> Right Text
+        "NUMBER" -> Right Number
+        "PERCENT" -> Right Percent
+        "CURRENCY" -> Right Currency
+        "DATE" -> Right Date
+        "TIME" -> Right Time
+        "DATE_TIME" -> Right DateTime
+        "SCIENTIFIC" -> Right Scientific
+        x -> Left ("Unable to parse NumberFormatType from: " <> x)
+
+instance ToHttpApiData NumberFormatType where
+    toQueryParam = \case
+        NumberFormatTypeUnspecified -> "NUMBER_FORMAT_TYPE_UNSPECIFIED"
+        Text -> "TEXT"
+        Number -> "NUMBER"
+        Percent -> "PERCENT"
+        Currency -> "CURRENCY"
+        Date -> "DATE"
+        Time -> "TIME"
+        DateTime -> "DATE_TIME"
+        Scientific -> "SCIENTIFIC"
+
+instance FromJSON NumberFormatType where
+    parseJSON = parseJSONText "NumberFormatType"
+
+instance ToJSON NumberFormatType where
+    toJSON = toJSONText
+
+-- | A relative date (based on the current date). Valid only if the type is
+-- DATE_BEFORE, DATE_AFTER, DATE_ON_OR_BEFORE or DATE_ON_OR_AFTER. Relative
+-- dates are not supported in data validation. They are supported only in
+-- conditional formatting and conditional filters.
+data ConditionValueRelativeDate
+    = RelativeDateUnspecified
+      -- ^ @RELATIVE_DATE_UNSPECIFIED@
+      -- Default value, do not use.
+    | PastYear
+      -- ^ @PAST_YEAR@
+      -- The value is one year before today.
+    | PastMonth
+      -- ^ @PAST_MONTH@
+      -- The value is one month before today.
+    | PastWeek
+      -- ^ @PAST_WEEK@
+      -- The value is one week before today.
+    | Yesterday
+      -- ^ @YESTERDAY@
+      -- The value is yesterday.
+    | Today
+      -- ^ @TODAY@
+      -- The value is today.
+    | Tomorrow
+      -- ^ @TOMORROW@
+      -- The value is tomorrow.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ConditionValueRelativeDate
+
+instance FromHttpApiData ConditionValueRelativeDate where
+    parseQueryParam = \case
+        "RELATIVE_DATE_UNSPECIFIED" -> Right RelativeDateUnspecified
+        "PAST_YEAR" -> Right PastYear
+        "PAST_MONTH" -> Right PastMonth
+        "PAST_WEEK" -> Right PastWeek
+        "YESTERDAY" -> Right Yesterday
+        "TODAY" -> Right Today
+        "TOMORROW" -> Right Tomorrow
+        x -> Left ("Unable to parse ConditionValueRelativeDate from: " <> x)
+
+instance ToHttpApiData ConditionValueRelativeDate where
+    toQueryParam = \case
+        RelativeDateUnspecified -> "RELATIVE_DATE_UNSPECIFIED"
+        PastYear -> "PAST_YEAR"
+        PastMonth -> "PAST_MONTH"
+        PastWeek -> "PAST_WEEK"
+        Yesterday -> "YESTERDAY"
+        Today -> "TODAY"
+        Tomorrow -> "TOMORROW"
+
+instance FromJSON ConditionValueRelativeDate where
+    parseJSON = parseJSONText "ConditionValueRelativeDate"
+
+instance ToJSON ConditionValueRelativeDate where
+    toJSON = toJSONText
+
+-- | The order data should be sorted.
+data SortSpecSortOrder
+    = SortOrderUnspecified
+      -- ^ @SORT_ORDER_UNSPECIFIED@
+      -- Default value, do not use this.
+    | Ascending
+      -- ^ @ASCENDING@
+      -- Sort ascending.
+    | Descending
+      -- ^ @DESCENDING@
+      -- Sort descending.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable SortSpecSortOrder
+
+instance FromHttpApiData SortSpecSortOrder where
+    parseQueryParam = \case
+        "SORT_ORDER_UNSPECIFIED" -> Right SortOrderUnspecified
+        "ASCENDING" -> Right Ascending
+        "DESCENDING" -> Right Descending
+        x -> Left ("Unable to parse SortSpecSortOrder from: " <> x)
+
+instance ToHttpApiData SortSpecSortOrder where
+    toQueryParam = \case
+        SortOrderUnspecified -> "SORT_ORDER_UNSPECIFIED"
+        Ascending -> "ASCENDING"
+        Descending -> "DESCENDING"
+
+instance FromJSON SortSpecSortOrder where
+    parseJSON = parseJSONText "SortSpecSortOrder"
+
+instance ToJSON SortSpecSortOrder where
+    toJSON = toJSONText
+
+-- | A function to summarize the value. If formula is set, the only supported
+-- values are SUM and CUSTOM. If sourceColumnOffset is set, then \`CUSTOM\`
+-- is not supported.
+data PivotValueSummarizeFunction
+    = PivotStandardValueFunctionUnspecified
+      -- ^ @PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED@
+      -- The default, do not use.
+    | Sum
+      -- ^ @SUM@
+      -- Corresponds to the \`SUM\` function.
+    | Counta
+      -- ^ @COUNTA@
+      -- Corresponds to the \`COUNTA\` function.
+    | Count
+      -- ^ @COUNT@
+      -- Corresponds to the \`COUNT\` function.
+    | Countunique
+      -- ^ @COUNTUNIQUE@
+      -- Corresponds to the \`COUNTUNIQUE\` function.
+    | Average
+      -- ^ @AVERAGE@
+      -- Corresponds to the \`AVERAGE\` function.
+    | Max
+      -- ^ @MAX@
+      -- Corresponds to the \`MAX\` function.
+    | Min
+      -- ^ @MIN@
+      -- Corresponds to the \`MIN\` function.
+    | Median
+      -- ^ @MEDIAN@
+      -- Corresponds to the \`MEDIAN\` function.
+    | Product
+      -- ^ @PRODUCT@
+      -- Corresponds to the \`PRODUCT\` function.
+    | Stdev
+      -- ^ @STDEV@
+      -- Corresponds to the \`STDEV\` function.
+    | Stdevp
+      -- ^ @STDEVP@
+      -- Corresponds to the \`STDEVP\` function.
+    | Var
+      -- ^ @VAR@
+      -- Corresponds to the \`VAR\` function.
+    | Varp
+      -- ^ @VARP@
+      -- Corresponds to the \`VARP\` function.
+    | Custom
+      -- ^ @CUSTOM@
+      -- Indicates the formula should be used as-is. Only valid if
+      -- PivotValue.formula was set.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PivotValueSummarizeFunction
+
+instance FromHttpApiData PivotValueSummarizeFunction where
+    parseQueryParam = \case
+        "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED" -> Right PivotStandardValueFunctionUnspecified
+        "SUM" -> Right Sum
+        "COUNTA" -> Right Counta
+        "COUNT" -> Right Count
+        "COUNTUNIQUE" -> Right Countunique
+        "AVERAGE" -> Right Average
+        "MAX" -> Right Max
+        "MIN" -> Right Min
+        "MEDIAN" -> Right Median
+        "PRODUCT" -> Right Product
+        "STDEV" -> Right Stdev
+        "STDEVP" -> Right Stdevp
+        "VAR" -> Right Var
+        "VARP" -> Right Varp
+        "CUSTOM" -> Right Custom
+        x -> Left ("Unable to parse PivotValueSummarizeFunction from: " <> x)
+
+instance ToHttpApiData PivotValueSummarizeFunction where
+    toQueryParam = \case
+        PivotStandardValueFunctionUnspecified -> "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED"
+        Sum -> "SUM"
+        Counta -> "COUNTA"
+        Count -> "COUNT"
+        Countunique -> "COUNTUNIQUE"
+        Average -> "AVERAGE"
+        Max -> "MAX"
+        Min -> "MIN"
+        Median -> "MEDIAN"
+        Product -> "PRODUCT"
+        Stdev -> "STDEV"
+        Stdevp -> "STDEVP"
+        Var -> "VAR"
+        Varp -> "VARP"
+        Custom -> "CUSTOM"
+
+instance FromJSON PivotValueSummarizeFunction where
+    parseJSON = parseJSONText "PivotValueSummarizeFunction"
+
+instance ToJSON PivotValueSummarizeFunction where
+    toJSON = toJSONText
+
+-- | How a hyperlink, if it exists, should be displayed in the cell.
+data CellFormatHyperlinkDisplayType
+    = HyperlinkDisplayTypeUnspecified
+      -- ^ @HYPERLINK_DISPLAY_TYPE_UNSPECIFIED@
+      -- The default value: the hyperlink is rendered. Do not use this.
+    | Linked
+      -- ^ @LINKED@
+      -- A hyperlink should be explicitly rendered.
+    | PlainText
+      -- ^ @PLAIN_TEXT@
+      -- A hyperlink should not be rendered.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CellFormatHyperlinkDisplayType
+
+instance FromHttpApiData CellFormatHyperlinkDisplayType where
+    parseQueryParam = \case
+        "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED" -> Right HyperlinkDisplayTypeUnspecified
+        "LINKED" -> Right Linked
+        "PLAIN_TEXT" -> Right PlainText
+        x -> Left ("Unable to parse CellFormatHyperlinkDisplayType from: " <> x)
+
+instance ToHttpApiData CellFormatHyperlinkDisplayType where
+    toQueryParam = \case
+        HyperlinkDisplayTypeUnspecified -> "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED"
+        Linked -> "LINKED"
+        PlainText -> "PLAIN_TEXT"
+
+instance FromJSON CellFormatHyperlinkDisplayType where
+    parseJSON = parseJSONText "CellFormatHyperlinkDisplayType"
+
+instance ToJSON CellFormatHyperlinkDisplayType where
+    toJSON = toJSONText
+
+-- | The type of sheet. Defaults to GRID. This field cannot be changed once
+-- set.
+data SheetPropertiesSheetType
+    = SheetTypeUnspecified
+      -- ^ @SHEET_TYPE_UNSPECIFIED@
+      -- Default value, do not use.
+    | Grid
+      -- ^ @GRID@
+      -- The sheet is a grid.
+    | Object
+      -- ^ @OBJECT@
+      -- The sheet has no grid and instead has an object like a chart or image.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable SheetPropertiesSheetType
+
+instance FromHttpApiData SheetPropertiesSheetType where
+    parseQueryParam = \case
+        "SHEET_TYPE_UNSPECIFIED" -> Right SheetTypeUnspecified
+        "GRID" -> Right Grid
+        "OBJECT" -> Right Object
+        x -> Left ("Unable to parse SheetPropertiesSheetType from: " <> x)
+
+instance ToHttpApiData SheetPropertiesSheetType where
+    toQueryParam = \case
+        SheetTypeUnspecified -> "SHEET_TYPE_UNSPECIFIED"
+        Grid -> "GRID"
+        Object -> "OBJECT"
+
+instance FromJSON SheetPropertiesSheetType where
+    parseJSON = parseJSONText "SheetPropertiesSheetType"
+
+instance ToJSON SheetPropertiesSheetType where
+    toJSON = toJSONText
+
+-- | How the cells should be merged.
+data MergeCellsRequestMergeType
+    = MergeAll
+      -- ^ @MERGE_ALL@
+      -- Create a single merge from the range
+    | MergeColumns
+      -- ^ @MERGE_COLUMNS@
+      -- Create a merge for each column in the range
+    | MergeRows
+      -- ^ @MERGE_ROWS@
+      -- Create a merge for each row in the range
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable MergeCellsRequestMergeType
+
+instance FromHttpApiData MergeCellsRequestMergeType where
+    parseQueryParam = \case
+        "MERGE_ALL" -> Right MergeAll
+        "MERGE_COLUMNS" -> Right MergeColumns
+        "MERGE_ROWS" -> Right MergeRows
+        x -> Left ("Unable to parse MergeCellsRequestMergeType from: " <> x)
+
+instance ToHttpApiData MergeCellsRequestMergeType where
+    toQueryParam = \case
+        MergeAll -> "MERGE_ALL"
+        MergeColumns -> "MERGE_COLUMNS"
+        MergeRows -> "MERGE_ROWS"
+
+instance FromJSON MergeCellsRequestMergeType where
+    parseJSON = parseJSONText "MergeCellsRequestMergeType"
+
+instance ToJSON MergeCellsRequestMergeType where
+    toJSON = toJSONText
+
+-- | The horizontal alignment of the value in the cell.
+data CellFormatHorizontalAlignment
+    = HorizontalAlignUnspecified
+      -- ^ @HORIZONTAL_ALIGN_UNSPECIFIED@
+      -- The horizontal alignment is not specified. Do not use this.
+    | Left'
+      -- ^ @LEFT@
+      -- The text is explicitly aligned to the left of the cell.
+    | Center
+      -- ^ @CENTER@
+      -- The text is explicitly aligned to the center of the cell.
+    | Right'
+      -- ^ @RIGHT@
+      -- The text is explicitly aligned to the right of the cell.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CellFormatHorizontalAlignment
+
+instance FromHttpApiData CellFormatHorizontalAlignment where
+    parseQueryParam = \case
+        "HORIZONTAL_ALIGN_UNSPECIFIED" -> Right HorizontalAlignUnspecified
+        "LEFT" -> Right Left'
+        "CENTER" -> Right Center
+        "RIGHT" -> Right Right'
+        x -> Left ("Unable to parse CellFormatHorizontalAlignment from: " <> x)
+
+instance ToHttpApiData CellFormatHorizontalAlignment where
+    toQueryParam = \case
+        HorizontalAlignUnspecified -> "HORIZONTAL_ALIGN_UNSPECIFIED"
+        Left' -> "LEFT"
+        Center -> "CENTER"
+        Right' -> "RIGHT"
+
+instance FromJSON CellFormatHorizontalAlignment where
+    parseJSON = parseJSONText "CellFormatHorizontalAlignment"
+
+instance ToJSON CellFormatHorizontalAlignment where
+    toJSON = toJSONText
+
+-- | The type of condition.
+data BooleanConditionType
+    = ConditionTypeUnspecified
+      -- ^ @CONDITION_TYPE_UNSPECIFIED@
+      -- The default value, do not use.
+    | NumberGreater
+      -- ^ @NUMBER_GREATER@
+      -- The cell\'s value must be greater than the condition\'s value. Supported
+      -- by data validation, conditional formatting and filters. Requires a
+      -- single ConditionValue.
+    | NumberGreaterThanEQ
+      -- ^ @NUMBER_GREATER_THAN_EQ@
+      -- The cell\'s value must be greater than or equal to the condition\'s
+      -- value. Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue.
+    | NumberLess
+      -- ^ @NUMBER_LESS@
+      -- The cell\'s value must be less than the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | NumberLessThanEQ
+      -- ^ @NUMBER_LESS_THAN_EQ@
+      -- The cell\'s value must be less than or equal to the condition\'s value.
+      -- Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue.
+    | NumberEQ
+      -- ^ @NUMBER_EQ@
+      -- The cell\'s value must be equal to the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | NumberNotEQ
+      -- ^ @NUMBER_NOT_EQ@
+      -- The cell\'s value must be not equal to the condition\'s value. Supported
+      -- by data validation, conditional formatting and filters. Requires a
+      -- single ConditionValue.
+    | NumberBetween
+      -- ^ @NUMBER_BETWEEN@
+      -- The cell\'s value must be between the two condition values. Supported by
+      -- data validation, conditional formatting and filters. Requires exactly
+      -- two ConditionValues.
+    | NumberNotBetween
+      -- ^ @NUMBER_NOT_BETWEEN@
+      -- The cell\'s value must not be between the two condition values.
+      -- Supported by data validation, conditional formatting and filters.
+      -- Requires exactly two ConditionValues.
+    | TextContains
+      -- ^ @TEXT_CONTAINS@
+      -- The cell\'s value must contain the condition\'s value. Supported by data
+      -- validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | TextNotContains
+      -- ^ @TEXT_NOT_CONTAINS@
+      -- The cell\'s value must not contain the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | TextStartsWith
+      -- ^ @TEXT_STARTS_WITH@
+      -- The cell\'s value must start with the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | TextEndsWith
+      -- ^ @TEXT_ENDS_WITH@
+      -- The cell\'s value must end with the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | TextEQ
+      -- ^ @TEXT_EQ@
+      -- The cell\'s value must be exactly the condition\'s value. Supported by
+      -- data validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+    | TextIsEmail
+      -- ^ @TEXT_IS_EMAIL@
+      -- The cell\'s value must be a valid email address. Supported by data
+      -- validation. Requires no ConditionValues.
+    | TextIsURL
+      -- ^ @TEXT_IS_URL@
+      -- The cell\'s value must be a valid URL. Supported by data validation.
+      -- Requires no ConditionValues.
+    | DateEQ
+      -- ^ @DATE_EQ@
+      -- The cell\'s value must be the same date as the condition\'s value.
+      -- Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue.
+    | DateBefore
+      -- ^ @DATE_BEFORE@
+      -- The cell\'s value must be before the date of the condition\'s value.
+      -- Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue that may be a relative date.
+    | DateAfter
+      -- ^ @DATE_AFTER@
+      -- The cell\'s value must be after the date of the condition\'s value.
+      -- Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue that may be a relative date.
+    | DateOnOrBefore
+      -- ^ @DATE_ON_OR_BEFORE@
+      -- The cell\'s value must be on or before the date of the condition\'s
+      -- value. Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue that may be a relative date.
+    | DateOnOrAfter
+      -- ^ @DATE_ON_OR_AFTER@
+      -- The cell\'s value must be on or after the date of the condition\'s
+      -- value. Supported by data validation, conditional formatting and filters.
+      -- Requires a single ConditionValue that may be a relative date.
+    | DateBetween
+      -- ^ @DATE_BETWEEN@
+      -- The cell\'s value must be between the dates of the two condition values.
+      -- Supported by data validation. Requires exactly two ConditionValues.
+    | DateNotBetween
+      -- ^ @DATE_NOT_BETWEEN@
+      -- The cell\'s value must be outside the dates of the two condition values.
+      -- Supported by data validation. Requires exactly two ConditionValues.
+    | DateIsValid
+      -- ^ @DATE_IS_VALID@
+      -- The cell\'s value must be a date. Supported by data validation. Requires
+      -- no ConditionValues.
+    | OneOfRange
+      -- ^ @ONE_OF_RANGE@
+      -- The cell\'s value must be listed in the grid in condition value\'s
+      -- range. Supported by data validation. Requires a single ConditionValue,
+      -- and the value must be a valid range in A1 notation.
+    | OneOfList
+      -- ^ @ONE_OF_LIST@
+      -- The cell\'s value must in the list of condition values. Supported by
+      -- data validation. Supports any number of condition values, one per item
+      -- in the list. Formulas are not supported in the values.
+    | Blank
+      -- ^ @BLANK@
+      -- The cell\'s value must be empty. Supported by data validation,
+      -- conditional formatting and filters. Requires no ConditionValues.
+    | NotBlank
+      -- ^ @NOT_BLANK@
+      -- The cell\'s value must not be empty. Supported by data validation,
+      -- conditional formatting and filters. Requires no ConditionValues.
+    | CustomFormula
+      -- ^ @CUSTOM_FORMULA@
+      -- The condition\'s formula must evaluate to true. Supported by data
+      -- validation, conditional formatting and filters. Requires a single
+      -- ConditionValue.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BooleanConditionType
+
+instance FromHttpApiData BooleanConditionType where
+    parseQueryParam = \case
+        "CONDITION_TYPE_UNSPECIFIED" -> Right ConditionTypeUnspecified
+        "NUMBER_GREATER" -> Right NumberGreater
+        "NUMBER_GREATER_THAN_EQ" -> Right NumberGreaterThanEQ
+        "NUMBER_LESS" -> Right NumberLess
+        "NUMBER_LESS_THAN_EQ" -> Right NumberLessThanEQ
+        "NUMBER_EQ" -> Right NumberEQ
+        "NUMBER_NOT_EQ" -> Right NumberNotEQ
+        "NUMBER_BETWEEN" -> Right NumberBetween
+        "NUMBER_NOT_BETWEEN" -> Right NumberNotBetween
+        "TEXT_CONTAINS" -> Right TextContains
+        "TEXT_NOT_CONTAINS" -> Right TextNotContains
+        "TEXT_STARTS_WITH" -> Right TextStartsWith
+        "TEXT_ENDS_WITH" -> Right TextEndsWith
+        "TEXT_EQ" -> Right TextEQ
+        "TEXT_IS_EMAIL" -> Right TextIsEmail
+        "TEXT_IS_URL" -> Right TextIsURL
+        "DATE_EQ" -> Right DateEQ
+        "DATE_BEFORE" -> Right DateBefore
+        "DATE_AFTER" -> Right DateAfter
+        "DATE_ON_OR_BEFORE" -> Right DateOnOrBefore
+        "DATE_ON_OR_AFTER" -> Right DateOnOrAfter
+        "DATE_BETWEEN" -> Right DateBetween
+        "DATE_NOT_BETWEEN" -> Right DateNotBetween
+        "DATE_IS_VALID" -> Right DateIsValid
+        "ONE_OF_RANGE" -> Right OneOfRange
+        "ONE_OF_LIST" -> Right OneOfList
+        "BLANK" -> Right Blank
+        "NOT_BLANK" -> Right NotBlank
+        "CUSTOM_FORMULA" -> Right CustomFormula
+        x -> Left ("Unable to parse BooleanConditionType from: " <> x)
+
+instance ToHttpApiData BooleanConditionType where
+    toQueryParam = \case
+        ConditionTypeUnspecified -> "CONDITION_TYPE_UNSPECIFIED"
+        NumberGreater -> "NUMBER_GREATER"
+        NumberGreaterThanEQ -> "NUMBER_GREATER_THAN_EQ"
+        NumberLess -> "NUMBER_LESS"
+        NumberLessThanEQ -> "NUMBER_LESS_THAN_EQ"
+        NumberEQ -> "NUMBER_EQ"
+        NumberNotEQ -> "NUMBER_NOT_EQ"
+        NumberBetween -> "NUMBER_BETWEEN"
+        NumberNotBetween -> "NUMBER_NOT_BETWEEN"
+        TextContains -> "TEXT_CONTAINS"
+        TextNotContains -> "TEXT_NOT_CONTAINS"
+        TextStartsWith -> "TEXT_STARTS_WITH"
+        TextEndsWith -> "TEXT_ENDS_WITH"
+        TextEQ -> "TEXT_EQ"
+        TextIsEmail -> "TEXT_IS_EMAIL"
+        TextIsURL -> "TEXT_IS_URL"
+        DateEQ -> "DATE_EQ"
+        DateBefore -> "DATE_BEFORE"
+        DateAfter -> "DATE_AFTER"
+        DateOnOrBefore -> "DATE_ON_OR_BEFORE"
+        DateOnOrAfter -> "DATE_ON_OR_AFTER"
+        DateBetween -> "DATE_BETWEEN"
+        DateNotBetween -> "DATE_NOT_BETWEEN"
+        DateIsValid -> "DATE_IS_VALID"
+        OneOfRange -> "ONE_OF_RANGE"
+        OneOfList -> "ONE_OF_LIST"
+        Blank -> "BLANK"
+        NotBlank -> "NOT_BLANK"
+        CustomFormula -> "CUSTOM_FORMULA"
+
+instance FromJSON BooleanConditionType where
+    parseJSON = parseJSONText "BooleanConditionType"
+
+instance ToJSON BooleanConditionType where
+    toJSON = toJSONText
+
+-- | The major dimension of the values. For output, if the spreadsheet data
+-- is: \`A1=1,B1=2,A2=3,B2=4\`, then requesting
+-- \`range=A1:B2,majorDimension=ROWS\` will return \`[[1,2],[3,4]]\`,
+-- whereas requesting \`range=A1:B2,majorDimension=COLUMNS\` will return
+-- \`[[1,3],[2,4]]\`. For input, with \`range=A1:B2,majorDimension=ROWS\`
+-- then \`[[1,2],[3,4]]\` will set \`A1=1,B1=2,A2=3,B2=4\`. With
+-- \`range=A1:B2,majorDimension=COLUMNS\` then \`[[1,2],[3,4]]\` will set
+-- \`A1=1,B1=3,A2=2,B2=4\`. When writing, if this field is not set, it
+-- defaults to ROWS.
+data ValueRangeMajorDimension
+    = VRMDDimensionUnspecified
+      -- ^ @DIMENSION_UNSPECIFIED@
+      -- The default value, do not use.
+    | VRMDRows
+      -- ^ @ROWS@
+      -- Operates on the rows of a sheet.
+    | VRMDColumns
+      -- ^ @COLUMNS@
+      -- Operates on the columns of a sheet.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ValueRangeMajorDimension
+
+instance FromHttpApiData ValueRangeMajorDimension where
+    parseQueryParam = \case
+        "DIMENSION_UNSPECIFIED" -> Right VRMDDimensionUnspecified
+        "ROWS" -> Right VRMDRows
+        "COLUMNS" -> Right VRMDColumns
+        x -> Left ("Unable to parse ValueRangeMajorDimension from: " <> x)
+
+instance ToHttpApiData ValueRangeMajorDimension where
+    toQueryParam = \case
+        VRMDDimensionUnspecified -> "DIMENSION_UNSPECIFIED"
+        VRMDRows -> "ROWS"
+        VRMDColumns -> "COLUMNS"
+
+instance FromJSON ValueRangeMajorDimension where
+    parseJSON = parseJSONText "ValueRangeMajorDimension"
+
+instance ToJSON ValueRangeMajorDimension where
+    toJSON = toJSONText
+
+-- | The order the values in this group should be sorted.
+data PivotGroupSortOrder
+    = PGSOSortOrderUnspecified
+      -- ^ @SORT_ORDER_UNSPECIFIED@
+      -- Default value, do not use this.
+    | PGSOAscending
+      -- ^ @ASCENDING@
+      -- Sort ascending.
+    | PGSODescending
+      -- ^ @DESCENDING@
+      -- Sort descending.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PivotGroupSortOrder
+
+instance FromHttpApiData PivotGroupSortOrder where
+    parseQueryParam = \case
+        "SORT_ORDER_UNSPECIFIED" -> Right PGSOSortOrderUnspecified
+        "ASCENDING" -> Right PGSOAscending
+        "DESCENDING" -> Right PGSODescending
+        x -> Left ("Unable to parse PivotGroupSortOrder from: " <> x)
+
+instance ToHttpApiData PivotGroupSortOrder where
+    toQueryParam = \case
+        PGSOSortOrderUnspecified -> "SORT_ORDER_UNSPECIFIED"
+        PGSOAscending -> "ASCENDING"
+        PGSODescending -> "DESCENDING"
+
+instance FromJSON PivotGroupSortOrder where
+    parseJSON = parseJSONText "PivotGroupSortOrder"
+
+instance ToJSON PivotGroupSortOrder where
+    toJSON = toJSONText
+
+-- | The type of the chart.
+data BasicChartSpecChartType
+    = BasicChartTypeUnspecified
+      -- ^ @BASIC_CHART_TYPE_UNSPECIFIED@
+      -- Default value, do not use.
+    | Bar
+      -- ^ @BAR@
+      -- A </chart/interactive/docs/gallery/barchart bar chart>.
+    | Line
+      -- ^ @LINE@
+      -- A </chart/interactive/docs/gallery/linechart line chart>.
+    | Area
+      -- ^ @AREA@
+      -- An </chart/interactive/docs/gallery/areachart area chart>.
+    | Column
+      -- ^ @COLUMN@
+      -- A </chart/interactive/docs/gallery/columnchart column chart>.
+    | Scatter
+      -- ^ @SCATTER@
+      -- A </chart/interactive/docs/gallery/scatterchart scatter chart>.
+    | Combo
+      -- ^ @COMBO@
+      -- A </chart/interactive/docs/gallery/combochart combo chart>.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BasicChartSpecChartType
+
+instance FromHttpApiData BasicChartSpecChartType where
+    parseQueryParam = \case
+        "BASIC_CHART_TYPE_UNSPECIFIED" -> Right BasicChartTypeUnspecified
+        "BAR" -> Right Bar
+        "LINE" -> Right Line
+        "AREA" -> Right Area
+        "COLUMN" -> Right Column
+        "SCATTER" -> Right Scatter
+        "COMBO" -> Right Combo
+        x -> Left ("Unable to parse BasicChartSpecChartType from: " <> x)
+
+instance ToHttpApiData BasicChartSpecChartType where
+    toQueryParam = \case
+        BasicChartTypeUnspecified -> "BASIC_CHART_TYPE_UNSPECIFIED"
+        Bar -> "BAR"
+        Line -> "LINE"
+        Area -> "AREA"
+        Column -> "COLUMN"
+        Scatter -> "SCATTER"
+        Combo -> "COMBO"
+
+instance FromJSON BasicChartSpecChartType where
+    parseJSON = parseJSONText "BasicChartSpecChartType"
+
+instance ToJSON BasicChartSpecChartType where
+    toJSON = toJSONText
+
+-- | V1 error format.
+data Xgafv
+    = X1
+      -- ^ @1@
+      -- v1 error format
+    | X2
+      -- ^ @2@
+      -- v2 error format
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable Xgafv
+
+instance FromHttpApiData Xgafv where
+    parseQueryParam = \case
+        "1" -> Right X1
+        "2" -> Right X2
+        x -> Left ("Unable to parse Xgafv from: " <> x)
+
+instance ToHttpApiData Xgafv where
+    toQueryParam = \case
+        X1 -> "1"
+        X2 -> "2"
+
+instance FromJSON Xgafv where
+    parseJSON = parseJSONText "Xgafv"
+
+instance ToJSON Xgafv where
+    toJSON = toJSONText
+
+-- | The amount of time to wait before volatile functions are recalculated.
+data SpreadsheetPropertiesAutoRecalc
+    = RecalculationIntervalUnspecified
+      -- ^ @RECALCULATION_INTERVAL_UNSPECIFIED@
+      -- Default value. This value must not be used.
+    | OnChange
+      -- ^ @ON_CHANGE@
+      -- Volatile functions are updated on every change.
+    | Minute
+      -- ^ @MINUTE@
+      -- Volatile functions are updated on every change and every minute.
+    | Hour
+      -- ^ @HOUR@
+      -- Volatile functions are updated on every change and hourly.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable SpreadsheetPropertiesAutoRecalc
+
+instance FromHttpApiData SpreadsheetPropertiesAutoRecalc where
+    parseQueryParam = \case
+        "RECALCULATION_INTERVAL_UNSPECIFIED" -> Right RecalculationIntervalUnspecified
+        "ON_CHANGE" -> Right OnChange
+        "MINUTE" -> Right Minute
+        "HOUR" -> Right Hour
+        x -> Left ("Unable to parse SpreadsheetPropertiesAutoRecalc from: " <> x)
+
+instance ToHttpApiData SpreadsheetPropertiesAutoRecalc where
+    toQueryParam = \case
+        RecalculationIntervalUnspecified -> "RECALCULATION_INTERVAL_UNSPECIFIED"
+        OnChange -> "ON_CHANGE"
+        Minute -> "MINUTE"
+        Hour -> "HOUR"
+
+instance FromJSON SpreadsheetPropertiesAutoRecalc where
+    parseJSON = parseJSONText "SpreadsheetPropertiesAutoRecalc"
+
+instance ToJSON SpreadsheetPropertiesAutoRecalc where
+    toJSON = toJSONText
+
+-- | How that data should be oriented when pasting.
+data CopyPasteRequestPasteOrientation
+    = Normal
+      -- ^ @NORMAL@
+      -- Paste normally.
+    | Transpose
+      -- ^ @TRANSPOSE@
+      -- Paste transposed, where all rows become columns and vice versa.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CopyPasteRequestPasteOrientation
+
+instance FromHttpApiData CopyPasteRequestPasteOrientation where
+    parseQueryParam = \case
+        "NORMAL" -> Right Normal
+        "TRANSPOSE" -> Right Transpose
+        x -> Left ("Unable to parse CopyPasteRequestPasteOrientation from: " <> x)
+
+instance ToHttpApiData CopyPasteRequestPasteOrientation where
+    toQueryParam = \case
+        Normal -> "NORMAL"
+        Transpose -> "TRANSPOSE"
+
+instance FromJSON CopyPasteRequestPasteOrientation where
+    parseJSON = parseJSONText "CopyPasteRequestPasteOrientation"
+
+instance ToJSON CopyPasteRequestPasteOrientation where
+    toJSON = toJSONText
+
+-- | How the data should be pasted.
+data PasteDataRequestType
+    = PDRTPasteNormal
+      -- ^ @PASTE_NORMAL@
+      -- Paste values, formulas, formats, and merges.
+    | PDRTPasteValues
+      -- ^ @PASTE_VALUES@
+      -- Paste the values ONLY without formats, formulas, or merges.
+    | PDRTPasteFormat
+      -- ^ @PASTE_FORMAT@
+      -- Paste the format and data validation only.
+    | PDRTPasteNoBOrders
+      -- ^ @PASTE_NO_BORDERS@
+      -- Like PASTE_NORMAL but without borders.
+    | PDRTPasteFormula
+      -- ^ @PASTE_FORMULA@
+      -- Paste the formulas only.
+    | PDRTPasteDataValidation
+      -- ^ @PASTE_DATA_VALIDATION@
+      -- Paste the data validation only.
+    | PDRTPasteConditionalFormatting
+      -- ^ @PASTE_CONDITIONAL_FORMATTING@
+      -- Paste the conditional formatting rules only.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PasteDataRequestType
+
+instance FromHttpApiData PasteDataRequestType where
+    parseQueryParam = \case
+        "PASTE_NORMAL" -> Right PDRTPasteNormal
+        "PASTE_VALUES" -> Right PDRTPasteValues
+        "PASTE_FORMAT" -> Right PDRTPasteFormat
+        "PASTE_NO_BORDERS" -> Right PDRTPasteNoBOrders
+        "PASTE_FORMULA" -> Right PDRTPasteFormula
+        "PASTE_DATA_VALIDATION" -> Right PDRTPasteDataValidation
+        "PASTE_CONDITIONAL_FORMATTING" -> Right PDRTPasteConditionalFormatting
+        x -> Left ("Unable to parse PasteDataRequestType from: " <> x)
+
+instance ToHttpApiData PasteDataRequestType where
+    toQueryParam = \case
+        PDRTPasteNormal -> "PASTE_NORMAL"
+        PDRTPasteValues -> "PASTE_VALUES"
+        PDRTPasteFormat -> "PASTE_FORMAT"
+        PDRTPasteNoBOrders -> "PASTE_NO_BORDERS"
+        PDRTPasteFormula -> "PASTE_FORMULA"
+        PDRTPasteDataValidation -> "PASTE_DATA_VALIDATION"
+        PDRTPasteConditionalFormatting -> "PASTE_CONDITIONAL_FORMATTING"
+
+instance FromJSON PasteDataRequestType where
+    parseJSON = parseJSONText "PasteDataRequestType"
+
+instance ToJSON PasteDataRequestType where
+    toJSON = toJSONText
+
+-- | The direction of the text in the cell.
+data CellFormatTextDirection
+    = TextDirectionUnspecified
+      -- ^ @TEXT_DIRECTION_UNSPECIFIED@
+      -- The text direction is not specified. Do not use this.
+    | LeftToRight
+      -- ^ @LEFT_TO_RIGHT@
+      -- The text direction of left-to-right was set by the user.
+    | RightToLeft
+      -- ^ @RIGHT_TO_LEFT@
+      -- The text direction of right-to-left was set by the user.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CellFormatTextDirection
+
+instance FromHttpApiData CellFormatTextDirection where
+    parseQueryParam = \case
+        "TEXT_DIRECTION_UNSPECIFIED" -> Right TextDirectionUnspecified
+        "LEFT_TO_RIGHT" -> Right LeftToRight
+        "RIGHT_TO_LEFT" -> Right RightToLeft
+        x -> Left ("Unable to parse CellFormatTextDirection from: " <> x)
+
+instance ToHttpApiData CellFormatTextDirection where
+    toQueryParam = \case
+        TextDirectionUnspecified -> "TEXT_DIRECTION_UNSPECIFIED"
+        LeftToRight -> "LEFT_TO_RIGHT"
+        RightToLeft -> "RIGHT_TO_LEFT"
+
+instance FromJSON CellFormatTextDirection where
+    parseJSON = parseJSONText "CellFormatTextDirection"
+
+instance ToJSON CellFormatTextDirection where
+    toJSON = toJSONText
+
+-- | The type of this series. Valid only if the chartType is COMBO. Different
+-- types will change the way the series is visualized. Only LINE, AREA, and
+-- COLUMN are supported.
+data BasicChartSeriesType
+    = BCSTBasicChartTypeUnspecified
+      -- ^ @BASIC_CHART_TYPE_UNSPECIFIED@
+      -- Default value, do not use.
+    | BCSTBar
+      -- ^ @BAR@
+      -- A </chart/interactive/docs/gallery/barchart bar chart>.
+    | BCSTLine
+      -- ^ @LINE@
+      -- A </chart/interactive/docs/gallery/linechart line chart>.
+    | BCSTArea
+      -- ^ @AREA@
+      -- An </chart/interactive/docs/gallery/areachart area chart>.
+    | BCSTColumn
+      -- ^ @COLUMN@
+      -- A </chart/interactive/docs/gallery/columnchart column chart>.
+    | BCSTScatter
+      -- ^ @SCATTER@
+      -- A </chart/interactive/docs/gallery/scatterchart scatter chart>.
+    | BCSTCombo
+      -- ^ @COMBO@
+      -- A </chart/interactive/docs/gallery/combochart combo chart>.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BasicChartSeriesType
+
+instance FromHttpApiData BasicChartSeriesType where
+    parseQueryParam = \case
+        "BASIC_CHART_TYPE_UNSPECIFIED" -> Right BCSTBasicChartTypeUnspecified
+        "BAR" -> Right BCSTBar
+        "LINE" -> Right BCSTLine
+        "AREA" -> Right BCSTArea
+        "COLUMN" -> Right BCSTColumn
+        "SCATTER" -> Right BCSTScatter
+        "COMBO" -> Right BCSTCombo
+        x -> Left ("Unable to parse BasicChartSeriesType from: " <> x)
+
+instance ToHttpApiData BasicChartSeriesType where
+    toQueryParam = \case
+        BCSTBasicChartTypeUnspecified -> "BASIC_CHART_TYPE_UNSPECIFIED"
+        BCSTBar -> "BAR"
+        BCSTLine -> "LINE"
+        BCSTArea -> "AREA"
+        BCSTColumn -> "COLUMN"
+        BCSTScatter -> "SCATTER"
+        BCSTCombo -> "COMBO"
+
+instance FromJSON BasicChartSeriesType where
+    parseJSON = parseJSONText "BasicChartSeriesType"
+
+instance ToJSON BasicChartSeriesType where
+    toJSON = toJSONText
+
+-- | Determines how the charts will use hidden rows or columns.
+data ChartSpecHiddenDimensionStrategy
+    = ChartHiddenDimensionStrategyUnspecified
+      -- ^ @CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED@
+      -- Default value, do not use.
+    | SkipHiddenRowsAndColumns
+      -- ^ @SKIP_HIDDEN_ROWS_AND_COLUMNS@
+      -- Charts will skip hidden rows and columns.
+    | SkipHiddenRows
+      -- ^ @SKIP_HIDDEN_ROWS@
+      -- Charts will skip hidden rows only.
+    | SkipHiddenColumns
+      -- ^ @SKIP_HIDDEN_COLUMNS@
+      -- Charts will skip hidden columns only.
+    | ShowAll
+      -- ^ @SHOW_ALL@
+      -- Charts will not skip any hidden rows or columns.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ChartSpecHiddenDimensionStrategy
+
+instance FromHttpApiData ChartSpecHiddenDimensionStrategy where
+    parseQueryParam = \case
+        "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED" -> Right ChartHiddenDimensionStrategyUnspecified
+        "SKIP_HIDDEN_ROWS_AND_COLUMNS" -> Right SkipHiddenRowsAndColumns
+        "SKIP_HIDDEN_ROWS" -> Right SkipHiddenRows
+        "SKIP_HIDDEN_COLUMNS" -> Right SkipHiddenColumns
+        "SHOW_ALL" -> Right ShowAll
+        x -> Left ("Unable to parse ChartSpecHiddenDimensionStrategy from: " <> x)
+
+instance ToHttpApiData ChartSpecHiddenDimensionStrategy where
+    toQueryParam = \case
+        ChartHiddenDimensionStrategyUnspecified -> "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED"
+        SkipHiddenRowsAndColumns -> "SKIP_HIDDEN_ROWS_AND_COLUMNS"
+        SkipHiddenRows -> "SKIP_HIDDEN_ROWS"
+        SkipHiddenColumns -> "SKIP_HIDDEN_COLUMNS"
+        ShowAll -> "SHOW_ALL"
+
+instance FromJSON ChartSpecHiddenDimensionStrategy where
+    parseJSON = parseJSONText "ChartSpecHiddenDimensionStrategy"
+
+instance ToJSON ChartSpecHiddenDimensionStrategy where
+    toJSON = toJSONText
+
+-- | The style of the border.
+data BOrderStyle
+    = StyleUnspecified
+      -- ^ @STYLE_UNSPECIFIED@
+      -- The style is not specified. Do not use this.
+    | Dotted
+      -- ^ @DOTTED@
+      -- The border is dotted.
+    | Dashed
+      -- ^ @DASHED@
+      -- The border is dashed.
+    | Solid
+      -- ^ @SOLID@
+      -- The border is a solid line.
+    | None
+      -- ^ @NONE@
+      -- No border. Used only when updating a border in order to erase it.
+    | Double
+      -- ^ @DOUBLE@
+      -- The border is two solid lines.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BOrderStyle
+
+instance FromHttpApiData BOrderStyle where
+    parseQueryParam = \case
+        "STYLE_UNSPECIFIED" -> Right StyleUnspecified
+        "DOTTED" -> Right Dotted
+        "DASHED" -> Right Dashed
+        "SOLID" -> Right Solid
+        "NONE" -> Right None
+        "DOUBLE" -> Right Double
+        x -> Left ("Unable to parse BOrderStyle from: " <> x)
+
+instance ToHttpApiData BOrderStyle where
+    toQueryParam = \case
+        StyleUnspecified -> "STYLE_UNSPECIFIED"
+        Dotted -> "DOTTED"
+        Dashed -> "DASHED"
+        Solid -> "SOLID"
+        None -> "NONE"
+        Double -> "DOUBLE"
+
+instance FromJSON BOrderStyle where
+    parseJSON = parseJSONText "BOrderStyle"
+
+instance ToJSON BOrderStyle where
+    toJSON = toJSONText
+
+-- | What kind of data to paste. All the source data will be cut, regardless
+-- of what is pasted.
+data CutPasteRequestPasteType
+    = CPRPTPasteNormal
+      -- ^ @PASTE_NORMAL@
+      -- Paste values, formulas, formats, and merges.
+    | CPRPTPasteValues
+      -- ^ @PASTE_VALUES@
+      -- Paste the values ONLY without formats, formulas, or merges.
+    | CPRPTPasteFormat
+      -- ^ @PASTE_FORMAT@
+      -- Paste the format and data validation only.
+    | CPRPTPasteNoBOrders
+      -- ^ @PASTE_NO_BORDERS@
+      -- Like PASTE_NORMAL but without borders.
+    | CPRPTPasteFormula
+      -- ^ @PASTE_FORMULA@
+      -- Paste the formulas only.
+    | CPRPTPasteDataValidation
+      -- ^ @PASTE_DATA_VALIDATION@
+      -- Paste the data validation only.
+    | CPRPTPasteConditionalFormatting
+      -- ^ @PASTE_CONDITIONAL_FORMATTING@
+      -- Paste the conditional formatting rules only.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable CutPasteRequestPasteType
+
+instance FromHttpApiData CutPasteRequestPasteType where
+    parseQueryParam = \case
+        "PASTE_NORMAL" -> Right CPRPTPasteNormal
+        "PASTE_VALUES" -> Right CPRPTPasteValues
+        "PASTE_FORMAT" -> Right CPRPTPasteFormat
+        "PASTE_NO_BORDERS" -> Right CPRPTPasteNoBOrders
+        "PASTE_FORMULA" -> Right CPRPTPasteFormula
+        "PASTE_DATA_VALIDATION" -> Right CPRPTPasteDataValidation
+        "PASTE_CONDITIONAL_FORMATTING" -> Right CPRPTPasteConditionalFormatting
+        x -> Left ("Unable to parse CutPasteRequestPasteType from: " <> x)
+
+instance ToHttpApiData CutPasteRequestPasteType where
+    toQueryParam = \case
+        CPRPTPasteNormal -> "PASTE_NORMAL"
+        CPRPTPasteValues -> "PASTE_VALUES"
+        CPRPTPasteFormat -> "PASTE_FORMAT"
+        CPRPTPasteNoBOrders -> "PASTE_NO_BORDERS"
+        CPRPTPasteFormula -> "PASTE_FORMULA"
+        CPRPTPasteDataValidation -> "PASTE_DATA_VALIDATION"
+        CPRPTPasteConditionalFormatting -> "PASTE_CONDITIONAL_FORMATTING"
+
+instance FromJSON CutPasteRequestPasteType where
+    parseJSON = parseJSONText "CutPasteRequestPasteType"
+
+instance ToJSON CutPasteRequestPasteType where
+    toJSON = toJSONText
+
+-- | The position of the chart legend.
+data BasicChartSpecLegendPosition
+    = BCSLPBasicChartLegendPositionUnspecified
+      -- ^ @BASIC_CHART_LEGEND_POSITION_UNSPECIFIED@
+      -- Default value, do not use.
+    | BCSLPBottomLegend
+      -- ^ @BOTTOM_LEGEND@
+      -- The legend is rendered on the bottom of the chart.
+    | BCSLPLeftLegend
+      -- ^ @LEFT_LEGEND@
+      -- The legend is rendered on the left of the chart.
+    | BCSLPRightLegend
+      -- ^ @RIGHT_LEGEND@
+      -- The legend is rendered on the right of the chart.
+    | BCSLPTopLegend
+      -- ^ @TOP_LEGEND@
+      -- The legend is rendered on the top of the chart.
+    | BCSLPNoLegend
+      -- ^ @NO_LEGEND@
+      -- No legend is rendered.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable BasicChartSpecLegendPosition
+
+instance FromHttpApiData BasicChartSpecLegendPosition where
+    parseQueryParam = \case
+        "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED" -> Right BCSLPBasicChartLegendPositionUnspecified
+        "BOTTOM_LEGEND" -> Right BCSLPBottomLegend
+        "LEFT_LEGEND" -> Right BCSLPLeftLegend
+        "RIGHT_LEGEND" -> Right BCSLPRightLegend
+        "TOP_LEGEND" -> Right BCSLPTopLegend
+        "NO_LEGEND" -> Right BCSLPNoLegend
+        x -> Left ("Unable to parse BasicChartSpecLegendPosition from: " <> x)
+
+instance ToHttpApiData BasicChartSpecLegendPosition where
+    toQueryParam = \case
+        BCSLPBasicChartLegendPositionUnspecified -> "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED"
+        BCSLPBottomLegend -> "BOTTOM_LEGEND"
+        BCSLPLeftLegend -> "LEFT_LEGEND"
+        BCSLPRightLegend -> "RIGHT_LEGEND"
+        BCSLPTopLegend -> "TOP_LEGEND"
+        BCSLPNoLegend -> "NO_LEGEND"
+
+instance FromJSON BasicChartSpecLegendPosition where
+    parseJSON = parseJSONText "BasicChartSpecLegendPosition"
+
+instance ToJSON BasicChartSpecLegendPosition where
+    toJSON = toJSONText
+
+-- | The type of error.
+data ErrorValueType
+    = ErrorTypeUnspecified
+      -- ^ @ERROR_TYPE_UNSPECIFIED@
+      -- The default error type, do not use this.
+    | Error'
+      -- ^ @ERROR@
+      -- Corresponds to the \`#ERROR!\` error.
+    | NullValue
+      -- ^ @NULL_VALUE@
+      -- Corresponds to the \`#NULL!\` error.
+    | DivideByZero
+      -- ^ @DIVIDE_BY_ZERO@
+      -- Corresponds to the \`#DIV\/0\` error.
+    | Value
+      -- ^ @VALUE@
+      -- Corresponds to the \`#VALUE!\` error.
+    | Ref
+      -- ^ @REF@
+      -- Corresponds to the \`#REF!\` error.
+    | Name
+      -- ^ @NAME@
+      -- Corresponds to the \`#NAME?\` error.
+    | Num
+      -- ^ @NUM@
+      -- Corresponds to the \`#NUM\`! error.
+    | NA
+      -- ^ @N_A@
+      -- Corresponds to the \`#N\/A\` error.
+    | Loading
+      -- ^ @LOADING@
+      -- Corresponds to the \`Loading...\` state.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable ErrorValueType
+
+instance FromHttpApiData ErrorValueType where
+    parseQueryParam = \case
+        "ERROR_TYPE_UNSPECIFIED" -> Right ErrorTypeUnspecified
+        "ERROR" -> Right Error'
+        "NULL_VALUE" -> Right NullValue
+        "DIVIDE_BY_ZERO" -> Right DivideByZero
+        "VALUE" -> Right Value
+        "REF" -> Right Ref
+        "NAME" -> Right Name
+        "NUM" -> Right Num
+        "N_A" -> Right NA
+        "LOADING" -> Right Loading
+        x -> Left ("Unable to parse ErrorValueType from: " <> x)
+
+instance ToHttpApiData ErrorValueType where
+    toQueryParam = \case
+        ErrorTypeUnspecified -> "ERROR_TYPE_UNSPECIFIED"
+        Error' -> "ERROR"
+        NullValue -> "NULL_VALUE"
+        DivideByZero -> "DIVIDE_BY_ZERO"
+        Value -> "VALUE"
+        Ref -> "REF"
+        Name -> "NAME"
+        Num -> "NUM"
+        NA -> "N_A"
+        Loading -> "LOADING"
+
+instance FromJSON ErrorValueType where
+    parseJSON = parseJSONText "ErrorValueType"
+
+instance ToJSON ErrorValueType where
+    toJSON = toJSONText
+
+-- | Whether values should be listed horizontally (as columns) or vertically
+-- (as rows).
+data PivotTableValueLayout
+    = Horizontal
+      -- ^ @HORIZONTAL@
+      -- Values are laid out horizontally (as columns).
+    | Vertical
+      -- ^ @VERTICAL@
+      -- Values are laid out vertically (as rows).
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable PivotTableValueLayout
+
+instance FromHttpApiData PivotTableValueLayout where
+    parseQueryParam = \case
+        "HORIZONTAL" -> Right Horizontal
+        "VERTICAL" -> Right Vertical
+        x -> Left ("Unable to parse PivotTableValueLayout from: " <> x)
+
+instance ToHttpApiData PivotTableValueLayout where
+    toQueryParam = \case
+        Horizontal -> "HORIZONTAL"
+        Vertical -> "VERTICAL"
+
+instance FromJSON PivotTableValueLayout where
+    parseJSON = parseJSONText "PivotTableValueLayout"
+
+instance ToJSON PivotTableValueLayout where
+    toJSON = toJSONText
+
+-- | How the value should be interpreted.
+data InterpolationPointType
+    = IPTInterpolationPointTypeUnspecified
+      -- ^ @INTERPOLATION_POINT_TYPE_UNSPECIFIED@
+      -- The default value, do not use.
+    | IPTMin
+      -- ^ @MIN@
+      -- The interpolation point will use the minimum value in the cells over the
+      -- range of the conditional format.
+    | IPTMax
+      -- ^ @MAX@
+      -- The interpolation point will use the maximum value in the cells over the
+      -- range of the conditional format.
+    | IPTNumber
+      -- ^ @NUMBER@
+      -- The interpolation point will use exactly the value in
+      -- InterpolationPoint.value.
+    | IPTPercent
+      -- ^ @PERCENT@
+      -- The interpolation point will be the given percentage over all the cells
+      -- in the range of the conditional format. This is equivalent to NUMBER if
+      -- the value was: \`=(MAX(FLATTEN(range)) * (value \/ 100)) +
+      -- (MIN(FLATTEN(range)) * (1 - (value \/ 100)))\` (where errors in the
+      -- range are ignored when flattening).
+    | IPTPercentile
+      -- ^ @PERCENTILE@
+      -- The interpolation point will be the given percentile over all the cells
+      -- in the range of the conditional format. This is equivalent to NUMBER if
+      -- the value was: \`=PERCENTILE(FLATTEN(range), value \/ 100)\` (where
+      -- errors in the range are ignored when flattening).
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable InterpolationPointType
+
+instance FromHttpApiData InterpolationPointType where
+    parseQueryParam = \case
+        "INTERPOLATION_POINT_TYPE_UNSPECIFIED" -> Right IPTInterpolationPointTypeUnspecified
+        "MIN" -> Right IPTMin
+        "MAX" -> Right IPTMax
+        "NUMBER" -> Right IPTNumber
+        "PERCENT" -> Right IPTPercent
+        "PERCENTILE" -> Right IPTPercentile
+        x -> Left ("Unable to parse InterpolationPointType from: " <> x)
+
+instance ToHttpApiData InterpolationPointType where
+    toQueryParam = \case
+        IPTInterpolationPointTypeUnspecified -> "INTERPOLATION_POINT_TYPE_UNSPECIFIED"
+        IPTMin -> "MIN"
+        IPTMax -> "MAX"
+        IPTNumber -> "NUMBER"
+        IPTPercent -> "PERCENT"
+        IPTPercentile -> "PERCENTILE"
+
+instance FromJSON InterpolationPointType where
+    parseJSON = parseJSONText "InterpolationPointType"
+
+instance ToJSON InterpolationPointType where
+    toJSON = toJSONText
+
+-- | The delimiter type to use.
+data TextToColumnsRequestDelimiterType
+    = TTCRDTDelimiterTypeUnspecified
+      -- ^ @DELIMITER_TYPE_UNSPECIFIED@
+      -- Default value. This value must not be used.
+    | TTCRDTComma
+      -- ^ @COMMA@
+      -- \",\"
+    | TTCRDTSemicolon
+      -- ^ @SEMICOLON@
+      -- \";\"
+    | TTCRDTPeriod
+      -- ^ @PERIOD@
+      -- \".\"
+    | TTCRDTSpace
+      -- ^ @SPACE@
+      -- \" \"
+    | TTCRDTCustom
+      -- ^ @CUSTOM@
+      -- A custom value as defined in delimiter.
+      deriving (Eq, Ord, Enum, Read, Show, Data, Typeable, Generic)
+
+instance Hashable TextToColumnsRequestDelimiterType
+
+instance FromHttpApiData TextToColumnsRequestDelimiterType where
+    parseQueryParam = \case
+        "DELIMITER_TYPE_UNSPECIFIED" -> Right TTCRDTDelimiterTypeUnspecified
+        "COMMA" -> Right TTCRDTComma
+        "SEMICOLON" -> Right TTCRDTSemicolon
+        "PERIOD" -> Right TTCRDTPeriod
+        "SPACE" -> Right TTCRDTSpace
+        "CUSTOM" -> Right TTCRDTCustom
+        x -> Left ("Unable to parse TextToColumnsRequestDelimiterType from: " <> x)
+
+instance ToHttpApiData TextToColumnsRequestDelimiterType where
+    toQueryParam = \case
+        TTCRDTDelimiterTypeUnspecified -> "DELIMITER_TYPE_UNSPECIFIED"
+        TTCRDTComma -> "COMMA"
+        TTCRDTSemicolon -> "SEMICOLON"
+        TTCRDTPeriod -> "PERIOD"
+        TTCRDTSpace -> "SPACE"
+        TTCRDTCustom -> "CUSTOM"
+
+instance FromJSON TextToColumnsRequestDelimiterType where
+    parseJSON = parseJSONText "TextToColumnsRequestDelimiterType"
+
+instance ToJSON TextToColumnsRequestDelimiterType where
+    toJSON = toJSONText
diff --git a/gogol-sheets.cabal b/gogol-sheets.cabal
new file mode 100644
--- /dev/null
+++ b/gogol-sheets.cabal
@@ -0,0 +1,53 @@
+name:                  gogol-sheets
+version:               0.1.0
+synopsis:              Google Sheets SDK.
+homepage:              https://github.com/brendanhay/gogol
+bug-reports:           https://github.com/brendanhay/gogol/issues
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2015-2016 Brendan Hay
+category:              Network, Google, Cloud
+build-type:            Simple
+cabal-version:         >= 1.10
+extra-source-files:    README.md
+
+description:
+    Reads and writes Google Sheets.
+    .
+    /Warning:/ This is an experimental prototype/preview release which is still
+    under exploratory development and not intended for public use, caveat emptor!
+    .
+    This library is compatible with version @v4@
+    of the API.
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/gogol.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.Google.Resource.Sheets.Spreadsheets.BatchUpdate
+        , Network.Google.Resource.Sheets.Spreadsheets.Create
+        , Network.Google.Resource.Sheets.Spreadsheets.Get
+        , Network.Google.Resource.Sheets.Spreadsheets.Sheets.CopyTo
+        , Network.Google.Resource.Sheets.Spreadsheets.Values.BatchGet
+        , Network.Google.Resource.Sheets.Spreadsheets.Values.BatchUpdate
+        , Network.Google.Resource.Sheets.Spreadsheets.Values.Get
+        , Network.Google.Resource.Sheets.Spreadsheets.Values.Update
+        , Network.Google.Sheets
+        , Network.Google.Sheets.Types
+
+    other-modules:
+          Network.Google.Sheets.Types.Product
+        , Network.Google.Sheets.Types.Sum
+
+    build-depends:
+          gogol-core == 0.1.0.*
+        , base       >= 4.7 && < 5
