a
    |fq                     @   s   d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZ ddlmZ G dd dZdS )zX
gspread.spreadsheet
~~~~~~~~~~~~~~

This module contains common spreadsheets' models.

    N)AnyDict	GeneratorIterableListMappingOptionalUnion)Response   )Cell)WorksheetNotFound)
HTTPClient
ParamsType)DRIVE_FILES_API_V3_URLSPREADSHEET_DRIVE_URL)ExportFormatfinditem)	Worksheetc                	   @   s  e Zd ZdZeeeeeef f dddZ	e
edddZe
eddd	Ze
edd
dZe
edddZe
edddZe
edddZe
edddZe
edddZeeddf dddZedddZeeef edddZeeeeef eddd Zeed!d"d#Zd{ee eeeef  ed$d%d&Zd|eee ed'd(d)Zd}ee ee ed*d+d,Z d~eee eeeef  edd-d.Z!deeeef  edd/d0Z"dee ed1d2d3Z#e$eed4d5d6Z%dee eeef d1d7d8Z&e$ed9d:d;Z'eee$f ed<d=d>Z(de)ee d@dAdBZ*eedCdDdEZ+dee$e$ee$ edFdGdHZ,de$ee$ ee$ ee edIdJdKZ-eedLdMdNZ.eee$f edOdPdQZ/e0e edRdSdTZ1deeee)ee e)e2dVdWdXZ3e4j5fe4e6dYdZd[Z7eeeeee)f f  dd\d]Z8deeee d_d`daZ9ee2dbdcddZ:ee2dbdedfZ;eee< dgdhdiZ=ee ddjdkZ>eedCdldmZ?eedndodpZ@eedqdrdsZAe$ee dtdudvZBeddwdxZCdddydzZDdS )Spreadsheetz(The class that represents a spreadsheet.)http_client
propertiesc                 C   s(   || _ || _|  }| j|d  d S )Nr   )client_propertiesfetch_sheet_metadataupdate)selfr   r   metadata r   MD:\Projects\storyit_web\backend\venv\Lib\site-packages\gspread/spreadsheet.py__init__   s    zSpreadsheet.__init__)returnc                 C   s
   | j d S )zSpreadsheet ID.idr   r   r   r   r   r"       s    zSpreadsheet.idc                 C   s
   | j d S )zSpreadsheet title.titler#   r$   r   r   r   r%   %   s    zSpreadsheet.titlec                 C   s
   t | j S )zSpreadsheet URL.)r   r"   r$   r   r   r   url*   s    zSpreadsheet.urlc                 C   s   d| j vr|   | j d S )zSpreadsheet Creation time.ZcreatedTime)r   update_drive_metadatar$   r   r   r   creationTime/   s    
zSpreadsheet.creationTimec                 C   s*   t jdtd d| jvr |   | jd S )zSpreadsheet last updated time.
        Only updated on initialisation.
        For actual last updated time, use get_lastUpdateTime().zQworksheet.lastUpdateTime is deprecated, please use worksheet.get_lastUpdateTime())categorymodifiedTime)warningswarnDeprecationWarningr   r'   r$   r   r   r   lastUpdateTime6   s    
zSpreadsheet.lastUpdateTimec                 C   s
   | j d S )zSpreadsheet timeZonetimeZoner#   r$   r   r   r   timezoneC   s    zSpreadsheet.timezonec                 C   s
   | j d S )zSpreadsheet localelocaler#   r$   r   r   r   r1   H   s    zSpreadsheet.localec                 C   s
   |  dS )z2Shortcut property for getting the first worksheet.r   )get_worksheetr$   r   r   r   sheet1M   s    zSpreadsheet.sheet1Nc                 c   s   |   E d H  d S )N)
worksheetsr$   r   r   r   __iter__R   s    zSpreadsheet.__iter__c                 C   s   d | jjt| j| jS )Nz<{} {} id:{}>)format	__class____name__reprr%   r"   r$   r   r   r   __repr__U   s
    zSpreadsheet.__repr__)bodyr!   c                 C   s   | j | j|S )a  Lower-level method that directly calls `spreadsheets/<ID>:batchUpdate <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate>`_.

        :param dict body: `Batch Update Request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate#request-body>`_.
        :returns: `Batch Update Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate#response-body>`_.
        :rtype: dict

        .. versionadded:: 3.0
        )r   batch_updater"   r   r;   r   r   r   r<   \   s    	zSpreadsheet.batch_update)rangeparamsr;   r!   c                 C   s   | j | j|||S )a  Lower-level method that directly calls `spreadsheets/<ID>/values:append <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append>`_.

        :param str range: The `A1 notation <https://developers.google.com/sheets/api/guides/concepts#a1_notation>`_
                          of a range to search for a logical table of data. Values will be appended after the last row of the table.
        :param dict params: `Values Append Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append#query-parameters>`_.
        :param dict body: `Values Append Request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append#request-body>`_.
        :returns: `Values Append Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append#response-body>`_.
        :rtype: dict

        .. versionadded:: 3.0
        )r   values_appendr"   r   r>   r?   r;   r   r   r   r@   g   s    zSpreadsheet.values_append)r>   r!   c                 C   s   | j | j|S )a   Lower-level method that directly calls `spreadsheets/<ID>/values:clear <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/clear>`_.

        :param str range: The `A1 notation <https://developers.google.com/sheets/api/guides/concepts#a1_notation>`_ of the values to clear.
        :returns: `Values Clear Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/clear#response-body>`_.
        :rtype: dict

        .. versionadded:: 3.0
        )r   values_clearr"   )r   r>   r   r   r   rB   w   s    	zSpreadsheet.values_clear)r?   r;   r!   c                 C   s   | j | j||S )a  Lower-level method that directly calls `spreadsheets/<ID>/values:batchClear`

        :param dict params: (optional) `Values Batch Clear Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchClear#path-parameters>`_.
        :param dict body: (optional) `Values Batch Clear request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchClear#request-body>`_.
        :rtype: dict
        )r   values_batch_clearr"   )r   r?   r;   r   r   r   rC      s    zSpreadsheet.values_batch_clear)r>   r?   r!   c                 C   s   | j j| j||dS )a  Lower-level method that directly calls `GET spreadsheets/<ID>/values/<range> <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get>`_.

        :param str range: The `A1 notation <https://developers.google.com/sheets/api/guides/concepts#a1_notation>`_ of the values to retrieve.
        :param dict params: (optional) `Values Get Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get#query-parameters>`_.
        :returns: `Values Get Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get#response-body>`_.
        :rtype: dict

        .. versionadded:: 3.0
        r?   )r   
values_getr"   )r   r>   r?   r   r   r   rE      s    
zSpreadsheet.values_get)rangesr?   r!   c                 C   s   | j j| j||dS )a  Lower-level method that directly calls `spreadsheets/<ID>/values:batchGet <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet>`_.

        :param list ranges: List of ranges in the `A1 notation <https://developers.google.com/sheets/api/guides/concepts#a1_notation>`_ of the values to retrieve.
        :param dict params: (optional) `Values Batch Get Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet#query-parameters>`_.
        :returns: `Values Batch Get Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet#response-body>`_.
        :rtype: dict
        rD   )r   values_batch_getr"   )r   rF   r?   r   r   r   rG      s    
zSpreadsheet.values_batch_getc                 C   s   | j j| j|||dS )ay  Lower-level method that directly calls `PUT spreadsheets/<ID>/values/<range> <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) `Values Update Query parameters <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update#query-parameters>`_.
        :param dict body: (optional) `Values Update Request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update#request-body>`_.
        :returns: `Values Update 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
        )r?   r;   )r   values_updater"   rA   r   r   r   rH      s    zSpreadsheet.values_updatec                 C   s   | j j| j|dS )a"  Lower-level method that directly calls `spreadsheets/<ID>/values:batchUpdate <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate>`_.

        :param dict body: (optional) `Values Batch Update Request body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate#request-body>`_.
        :returns: `Values Batch Update Response body <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate#response-body>`_.
        :rtype: dict
        )r;   )r   values_batch_updater"   r=   r   r   r   rI      s    zSpreadsheet.values_batch_update)r?   r!   c                 C   s   | j j| j|dS )zA method stub that directly calls `spreadsheets.get <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get>`_.rD   )r   Zspreadsheets_getr"   r   r?   r   r   r   _spreadsheets_get   s    zSpreadsheet._spreadsheets_get)sheet_iddestination_spreadsheet_idr!   c                 C   s   | j | j||S )zLower-level method that directly calls `spreadsheets.sheets.copyTo <https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo>`_.)r   Zspreadsheets_sheets_copy_tor"   )r   rL   rM   r   r   r   _spreadsheets_sheets_copy_to   s    z(Spreadsheet._spreadsheets_sheets_copy_toc                 C   s   | j j| j|dS )a  Similar to :method spreadsheets_get:`gspread.http_client.spreadsheets_get`,
        get the spreadsheet form the API but by default **does not get the cells data**.
        It only retrieve the the metadata from the spreadsheet.

        :param dict params: (optional) the HTTP params for the GET request.
            By default sets the parameter ``includeGridData`` to ``false``.
        :returns: The raw spreadsheet
        :rtype: dict
        rD   )r   r   r"   rJ   r   r   r   r      s    z Spreadsheet.fetch_sheet_metadata)indexr!   c              	   C   sV   |   }z$|d | d }t| || j| jW S  ttfyP   td|Y n0 dS )a  Returns a worksheet with specified `index`.

        :param index: An index of a worksheet. Indexes start from zero.
        :type index: int

        :returns: an instance of :class:`gspread.worksheet.Worksheet`.

        :raises:
            :class:`~gspread.exceptions.WorksheetNotFound`: if can't find the worksheet

        Example. To get third worksheet of a spreadsheet:

        >>> sht = client.open('My fancy spreadsheet')
        >>> worksheet = sht.get_worksheet(2)
        sheetsr   zindex {} not foundN)r   r   r"   r   KeyError
IndexErrorr   r6   )r   rO   
sheet_datar   r   r   r   r2      s    zSpreadsheet.get_worksheet)r"   r!   c              
      s   |   }zt| W n. tyB } ztd|W Y d}~n
d}~0 0 z.t fdd|d }t| |d | j| jW S  ttfy   t	d
 Y n0 dS )a!  Returns a worksheet with specified `worksheet id`.

        :param id: The id of a worksheet. it can be seen in the url as the value of the parameter 'gid'.
        :type id: str | int

        :returns: an instance of :class:`gspread.worksheet.Worksheet`.
        :raises:
            :class:`~gspread.exceptions.WorksheetNotFound`: if can't find the worksheet

        Example. To get the worksheet 123456 of a spreadsheet:

        >>> sht = client.open('My fancy spreadsheet')
        >>> worksheet = sht.get_worksheet_by_id(123456)
        id should be intNc                    s   | d d  kS Nr   sheetIdr   xworksheet_id_intr   r   <lambda>      z1Spreadsheet.get_worksheet_by_id.<locals>.<lambda>rP   r   zid {} not found)r   int
ValueErrorr   r   r"   r   StopIterationrQ   r   r6   )r   r"   rS   exitemr   rY   r   get_worksheet_by_id   s     
zSpreadsheet.get_worksheet_by_idF)exclude_hiddenr!   c                    s4      } fdd|d D }|r0dd |D }|S )a  Returns a list of all :class:`worksheets <gspread.worksheet.Worksheet>`
        in a spreadsheet.

        :param exclude_hidden: (optional) If set to ``True`` will only return
                                 visible worksheets. Default is ``False``.
        :type exclude_hidden: bool

        :returns: a list of :class:`worksheets <gspread.worksheet.Worksheet>`.
        :rtype: list
        c                    s"   g | ]}t  |d   j jqS )r   )r   r"   r   ).0sr$   r   r   
<listcomp>+  s   z*Spreadsheet.worksheets.<locals>.<listcomp>rP   c                 S   s   g | ]}|j s|qS r   )ZisSheetHidden)rd   wr   r   r   rf   0  r\   )r   )r   rc   rS   r4   r   r$   r   r4     s    
zSpreadsheet.worksheets)r%   r!   c              	      sZ   |   }z.t fdd|d }t| |d | j| jW S  ttfyT   t Y n0 dS )a.  Returns a worksheet with specified `title`.

        :param title: A title of a worksheet. If there're multiple
                      worksheets with the same title, first one will
                      be returned.
        :type title: str

        :returns: an instance of :class:`gspread.worksheet.Worksheet`.

        :raises:
            WorksheetNotFound: if can't find the worksheet

        Example. Getting worksheet named 'Annual bonuses'

        >>> sht = client.open('Sample one')
        >>> worksheet = sht.worksheet('Annual bonuses')
        c                    s   | d d  kS )Nr   r%   r   rW   r%   r   r   r[   H  r\   z'Spreadsheet.worksheet.<locals>.<lambda>rP   r   N)r   r   r   r"   r   r_   rQ   r   )r   r%   rS   ra   r   rh   r   	worksheet3  s    
zSpreadsheet.worksheet)r%   rowscolsrO   r!   c                 C   sv   ddd|d||ddiigi}|dur@||d d d d d	< | j | j|}|d
 d d d }t| || j| j S )a  Adds a new worksheet to a spreadsheet.

        :param title: A title of a new worksheet.
        :type title: str
        :param rows: Number of rows.
        :type rows: int
        :param cols: Number of columns.
        :type cols: int
        :param index: Position of the sheet.
        :type index: int

        :returns: a newly created :class:`worksheets <gspread.worksheet.Worksheet>`.
        requestsZaddSheetr   ZGRID)ZrowCountZcolumnCount)r%   Z	sheetTypeZgridPropertiesNr   rO   Zreplies)r   r<   r"   r   )r   r%   rj   rk   rO   r;   datar   r   r   r   add_worksheetO  s&    zSpreadsheet.add_worksheet)source_sheet_idinsert_sheet_indexnew_sheet_idnew_sheet_namer!   c              	   C   s   t j| j| j|| |||dS )a  Duplicates the contents of a sheet.

        :param int source_sheet_id: The sheet ID to duplicate.
        :param int insert_sheet_index: (optional) The zero-based index
                                       where the new sheet should be inserted.
                                       The index of all sheets after this are
                                       incremented.
        :param int new_sheet_id: (optional) 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.
        :param str new_sheet_name: (optional) The name of the new sheet.
                                   If empty, a new name is chosen for you.

        :returns: a newly created :class:`gspread.worksheet.Worksheet`

        .. versionadded:: 3.1
        )rp   rq   rr   )r   Z
_duplicater   r"   )r   ro   rp   rq   rr   r   r   r   duplicate_sheet{  s    zSpreadsheet.duplicate_sheet)ri   r!   c                 C   s$   ddd|j iigi}| j| j |S )zDeletes a worksheet from a spreadsheet.

        :param worksheet: The worksheet to be deleted.
        :type worksheet: :class:`~gspread.worksheet.Worksheet`
        rl   deleteSheetrV   )r"   r   r<   )r   ri   r;   r   r   r   del_worksheet  s    zSpreadsheet.del_worksheet)worksheet_idr!   c              
   C   s^   zt |}W n. ty: } ztd|W Y d}~n
d}~0 0 ddd|iigi}| j| j|S )z+
        Deletes a Worksheet by id
        rT   Nrl   rt   rV   )r]   r^   r   r<   r"   )r   rv   rZ   r`   r;   r   r   r   del_worksheet_by_id  s     zSpreadsheet.del_worksheet_by_id)worksheets_in_desired_orderr!   c                 C   sr   i }t |D ]\}}|||j< q|  D ]"}|j|v r8q(|d7 }|||j< q(ddd | D i}| j| j|S )a  Updates the ``index`` property of each Worksheet to reflect
        its index in the provided sequence of Worksheets.

        :param worksheets_in_desired_order: Iterable of Worksheet objects in desired order.

        Note: If you omit some of the Spreadsheet's existing Worksheet objects from
        the provided sequence, those Worksheets will be appended to the end of the sequence
        in the order that they appear in the list returned by :meth:`gspread.spreadsheet.Spreadsheet.worksheets`.

        .. versionadded:: 3.4
        r   rl   c                 S   s$   g | ]\}}d ||dddiqS )ZupdateSheetProperties)rV   rO   rO   r   fieldsr   )rd   keyvalr   r   r   rf     s   z2Spreadsheet.reorder_worksheets.<locals>.<listcomp>)	enumerater"   r4   itemsr   r<   )r   rx   Zidx_mapidxrg   r;   r   r   r   reorder_worksheets  s    
zSpreadsheet.reorder_worksheetsT)email_address	perm_typerolenotifyemail_message	with_linkr!   c              	   C   s   | j j| j||||||dS )a  Share the spreadsheet with other accounts.

        :param email_address: user or group e-mail address, domain name
                      or None for 'anyone' type.
        :type email_address: str, None
        :param perm_type: The account type.
               Allowed values are: ``user``, ``group``, ``domain``,
               ``anyone``.
        :type perm_type: str
        :param role: The primary role for this user.
               Allowed values are: ``owner``, ``writer``, ``reader``.
        :type role: str
        :param notify: (optional) Whether to send an email to the target user/domain.
        :type notify: bool
        :param email_message: (optional) The email to be sent if notify=True
        :type email_message: str
        :param with_link: (optional) Whether the link is required for this permission
        :type with_link: bool

        Example::

            # Give Otto a write permission on this spreadsheet
            sh.share('otto@example.com', perm_type='user', role='writer')

            # Give Otto's family a read permission on this spreadsheet
            sh.share('otto-familly@example.com', perm_type='group', role='reader')
        )r   r   r   r   r   r   )r   Zinsert_permissionr"   )r   r   r   r   r   r   r   r   r   r   share  s    $zSpreadsheet.share)r6   r!   c                 C   s   | j | j|S )a  Export the spreadsheet in the given format.

        :param str file_id: A key of a spreadsheet to export

        :param format: The format of the resulting file.
            Possible values are:

                ``ExportFormat.PDF``,
                ``ExportFormat.EXCEL``,
                ``ExportFormat.CSV``,
                ``ExportFormat.OPEN_OFFICE_SHEET``,
                ``ExportFormat.TSV``,
                and ``ExportFormat.ZIPPED_HTML``.

            See `ExportFormat`_ in the Drive API.
            Default value is ``ExportFormat.PDF``.
        :type format: :class:`~gspread.utils.ExportFormat`

        :returns bytes: The content of the exported file.

        .. _ExportFormat: https://developers.google.com/drive/api/guides/ref-export-formats
        )r   exportr"   )r   r6   r   r   r   r   	  s    zSpreadsheet.exportc                 C   s   | j | jS )z$Lists the spreadsheet's permissions.)r   list_permissionsr"   r$   r   r   r   r   "  s    zSpreadsheet.list_permissionsany)valuer   r!   c                    sR   | j | j}dv rdnd  fdd|D }|D ]}| j | j| q8|S )a  Remove permissions from a user or domain.

        :param value: User or domain to remove permissions from
        :type value: str
        :param role: (optional) Permission to remove. Defaults to all
                     permissions.
        :type role: str

        Example::

            # Remove Otto's write permission for this spreadsheet
            sh.remove_permissions('otto@example.com', role='writer')

            # Remove all Otto's permissions for this spreadsheet
            sh.remove_permissions('otto@example.com')
        @ZemailAddressdomainc                    s:   g | ]2}|  kr|d  ks*dkrt|d qS )r   r   r"   )getstr)rd   pr{   r   r   r   r   rf   ;  s   "z2Spreadsheet.remove_permissions.<locals>.<listcomp>)r   r   r"   Zremove_permission)r   r   r   Zpermission_listZfiltered_id_listpermission_idr   r   r   remove_permissions&  s    zSpreadsheet.remove_permissions)r   r!   c                 C   s,   d t| j|}ddd}| jjd||dS )a  Transfer the ownership of this file to a new user.

        It is necessary to first create the permission with the new owner's email address,
        get the permission ID then use this method to transfer the ownership.

        .. note::

           You can list all permissions using :meth:`gspread.spreadsheet.Spreadsheet.list_permissions`.

        .. warning::

           You can only transfer ownership to a new user, you cannot transfer ownership to a group
           or a domain email address.
        {}/{}/permissions/{}writerT)r   ZpendingOwnerpatch)jsonr6   r   r"   r   request)r   r   r&   payloadr   r   r   transfer_ownershipF  s    zSpreadsheet.transfer_ownershipc                 C   s4   d t| j|}ddi}ddi}| jjd|||dS )zAccept the pending ownership request on that file.

        It is necessary to edit the permission with the pending ownership.

        .. note::

           You can only accept ownership transfer for the user currently being used.
        r   r   ownerZtransferOwnershipTr   )r   r?   r   )r   r   r&   r   r?   r   r   r   accept_ownershipb  s    
zSpreadsheet.accept_ownership)named_ranger!   c                 C   s   | j |S )zreturn a list of :class:`gspread.cell.Cell` objects from
        the specified named range.

        :param named_range: A string with a named range value to fetch.
        :type named_range: str
        )r3   r>   )r   r   r   r   r   r   |  s    
zSpreadsheet.named_rangec                 C   s   | j ddiddg S )z%Lists the spreadsheet's named ranges.rz   ZnamedRangesrD   )r   r   r$   r   r   r   list_named_ranges  s    zSpreadsheet.list_named_rangesc                 C   s0   ddd|iddigi}|  |}|| jd< |S )zIRenames the spreadsheet.

        :param str title: A new title.
        rl   updateSpreadsheetPropertiesr%   ry   r<   r   )r   r%   r;   resr   r   r   update_title  s    

zSpreadsheet.update_title)r0   r!   c                 C   s0   ddd|iddigi}|  |}|| jd< |S )zUpdates the current spreadsheet timezone.
        Can be any timezone in CLDR format such as "America/New_York"
        or a custom time zone such as GMT-07:00.
        rl   r   r/   ry   r   )r   r0   r;   r   r   r   r   update_timezone  s    

zSpreadsheet.update_timezone)r1   r!   c                 C   s0   ddd|iddigi}|  |}|| jd< |S )a  Update the locale of the spreadsheet.
        Can be any of the ISO 639-1 language codes, such as: de, fr, en, ...
        Or an ISO 639-2 if no ISO 639-1 exists.
        Or a combination of the ISO language code and country code,
        such as en_US, de_CH, fr_FR, ...

        .. note::
            Note: when updating this field, not all locales/languages are supported.
        rl   r   r1   ry   r   )r   r1   r;   r   r   r   r   update_locale  s    

zSpreadsheet.update_locale)sheetidr!   c                    sX   | j ddidd }zt fdd|}W n  tyJ   td Y n0 |dg S )	z.Lists the spreadsheet's protected named rangesrz   z(sheets.properties,sheets.protectedRangesrD   rP   c                    s   | d d  kS rU   r   )sheetr   r   r   r[     r\   z3Spreadsheet.list_protected_ranges.<locals>.<lambda>zworksheet id {} not foundZprotectedRanges)r   r   r_   r   r6   r   )r   r   rP   r   r   r   r   list_protected_ranges  s    z!Spreadsheet.list_protected_rangesc                 C   s   | j | j}|d S )z3Get the lastUpdateTime metadata from the Drive API.r*   )r   get_file_drive_metadatar"   )r   r   r   r   r   get_lastUpdateTime  s    zSpreadsheet.get_lastUpdateTimec                 C   s"   | j | jd }| j| dS )zhFetches the drive metadata from the Drive API
        and updates the cached values in _properties dict.r"   N)r   r   r   r   )r   Zdrive_metadatar   r   r   r'     s    z!Spreadsheet.update_drive_metadata)NN)N)N)NN)N)N)N)F)N)NNN)TNF)r   )Er8   
__module____qualname____doc__r   r   r   r	   r   r    propertyr"   r%   r&   r(   r.   r0   r1   r   r3   r   r5   r:   r   r<   r   r@   rB   r   rC   rE   r   rG   rH   rI   rK   r]   rN   r   r2   rb   boolr4   ri   rn   rs   ru   rw   r   r   r
   r   r   ZPDFbytesr   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r      s         		 
 /   $
*   ." r   )r   r+   typingr   r   r   r   r   r   r   r	   rl   r
   cellr   
exceptionsr   r   r   r   urlsr   r   utilsr   r   ri   r   r   r   r   r   r   <module>   s   (