API do Planilhas Google em Python, criação de planilha e edição, planilha não encontrada

Sep 03 2020

Este é o meu código, que basicamente copiei do texto quickstart.pyque o Google fornece.

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import os

SCOPES = ["https://www.googleapis.com/auth/spreadsheets"]
CLIENT_SECRET_FILE = 'creds.json'
copyFromE = 'sheetIdGoesHere'
copyFromId = 'spreadsheetIdGoesHere'


def createSheet():
    global service, spreadsheetId

    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'client_secretfile.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('sheets', 'v4', credentials=creds)

    # Call the Sheets API
    spreadsheet = {
        'properties': {
        'title': nameDoc,
        'locale': 'en_US',  # optional
        'autoRecalc': 'ON_CHANGE',
        # calculation setting #https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#RecalculationInterval
        'timeZone': 'CDT-05:00'},
    }
    spreadsheet = service.spreadsheets().create(body=spreadsheet,
                                                fields='spreadsheetId').execute()
    spreadsheetId = 'Spreadsheet ID: {0}'.format(spreadsheet.get('spreadsheetId'))
    print(spreadsheetId)

if __name__ == '__main__':
    createSheet()

Isso cria com sucesso uma planilha no Google Spreadsheets. Posso vê-lo na página inicial do drive em meu navegador de Internet. O erro acontece depois disso, quando tento importar uma planilha de outra planilha.

request = service.spreadsheets().sheets().copyTo(spreadsheetId=copyFromId, sheetId=copyFromE,
                                                  body={'destinationSpreadsheetId': spreadsheetId}).execute()

Por algum motivo, recebo o erro:

googleapiclient.errors.HttpError: <HttpError 400 ao solicitar https://sheets.googleapis.com/v4/spreadsheets/ copyFrom / sheets / copyFromE : copyTo? alt = json (Aqui é onde o ID da planilha de destino deve estar) retornou "Inválido destinationSpreadsheetId [Spreadsheet ID: spreadsheetId ] ">

Esta é a parte estranha porque a planilha foi criada. Posso vê-lo na página inicial do drive em meu navegador de Internet. Se eu inserir spreadsheetIdno navegador, a URL também funcionará. Então a folha existe e está aí. Se eu clicar duas vezes na planilha criada em meu driver, depois de criada, ele abre uma planilha em branco com o nome que atribuí nameDocscom a mesma URL armazenada na spreadsheetIdvariável. Basicamente, a planilha está lá, armazenada na minha conta, foi criada. A informação está correta, mas o programa não consegue encontrá-la.

A próxima coisa estranha é esta: se eu executar o script que importa uma planilha de outra planilha após abrir a planilha criada via navegador, o script funciona.

Estou tentando automatizar relatórios do meu trabalho, que tenho que fazer manualmente, e vou economizar horas de trabalho. Eu tentei abrir a planilha criada através do Selenium e, em seguida, executar o "copy sheet from spreadsheetId code (colado acima)", mas por algum motivo o Selenium não abre o URL, que o navegador abre se eu digitar exatamente a mesma coisa manualmente, para que está fora de cogitação. Alguma ideia de por que isso está acontecendo? Ou alguma ideia para encontrar uma solução para este problema?

Respostas

Iamblichus Sep 03 2020 at 16:45

Questão:

Você não está recuperando o ID da planilha, mas uma string formatada assim:

Spreadsheet ID: {your-spreadsheet-id}

A API está tentando acessar uma planilha cujo ID é esta string. Logicamente, não está encontrando: dê uma olhada no erro que você está obtendo:

DestinationSpreadsheetId inválido [Spreadsheet ID: spreadsheetId] .

A "Spreadsheet ID: "parte não deveria estar lá.

Solução:

Depois de criar a nova planilha, recupere o ID da planilha assim:

spreadsheetId = spreadsheet.get('spreadsheetId')