code: def values_update(self, range, params=None, body=None):
          
          url = SPREADSHEET_VALUES_URL % (self.id, quote(range))
          r = self.client.request('put', url, params=params, json=body)
          return r.json()
docs: Lower-level method that directly calls `spreadsheets.values.update <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update>`_.
  
          :param str range: The `A1 notation <https://developers.google.com/sheets/api/guides/concepts#a1_notation>`_ of the values to update.
          :param dict params: (optional) `Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update#query-parameters>`_.
          :param dict body: (optional) `Request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update#request-body>`_.
          :returns: `Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update#response-body>`_.
          :rtype: dict
  
          Example::
  
              sh.values_update(
                  'Sheet1!A2',
                  params={
                      'valueInputOption': 'USER_ENTERED'
                  },
                  body={
                      'values': [[1, 2, 3]]
                  }
              )
  
          .. versionadded:: 3.0