API Google Sheets en Python, création d'une feuille de calcul puis modification, feuille de calcul introuvable

Sep 03 2020

Ceci est mon code, que j'ai essentiellement copié à partir du texte quickstart.pyfourni par Google.

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()

Cela crée avec succès une feuille de calcul dans Google Spreadsheets. Je peux le voir sur la page d'accueil du lecteur dans mon navigateur Internet. L'erreur se produit après cela, lorsque j'essaie d'importer une feuille à partir d'une autre feuille de calcul.

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

Pour une raison quelconque, j'obtiens l'erreur:

googleapiclient.errors.HttpError: <HttpError 400 lors de la demande de https://sheets.googleapis.com/v4/spreadsheets/ copyFrom / sheets / copyFromE : copyTo? alt = json (Voici où l'ID de feuille de calcul cible doit être) renvoyé "Non valide destinationSpreadsheetId [ID de la feuille de calcul : spreadsheetId ] ">

C'est la partie étrange parce que la feuille de calcul a été créée. Je peux le voir sur la page d'accueil du lecteur dans mon navigateur Internet. Si j'insère le spreadsheetIddans le navigateur, l'URL fonctionne également. Donc, la feuille existe et elle est là. Si je double-clique sur la feuille de calcul créée dans mon pilote, après avoir été créée, elle ouvre une feuille de calcul vierge avec le nom que j'ai attribué nameDocsavec exactement la même URL stockée sur la spreadsheetIdvariable. Fondamentalement, la feuille de calcul est là, stockée dans mon compte, elle a été créée. Les informations sont correctes, mais le programme ne les trouve pas.

La prochaine chose étrange est la suivante: si j'exécute le script qui importe une feuille d'une autre feuille de calcul après avoir ouvert la feuille de calcul créée via le navigateur, le script fonctionne.

J'essaie d'automatiser les rapports de mon travail que je dois faire manuellement et me fera gagner des heures de travail. J'ai essayé d'ouvrir la feuille de calcul créée via Selenium, puis d'exécuter la "copie de la feuille à partir du code spreadsheetId (collé ci-dessus)" mais pour une raison quelconque, Selenium n'ouvre pas l'URL, que le navigateur ouvre si je tape exactement la même chose manuellement, de sorte que est hors de l'image. Des idées pourquoi cela se produit? Ou des idées pour trouver une solution à ce problème?

Réponses

Iamblichus Sep 03 2020 at 16:45

Problème:

Vous ne récupérez pas l'ID de la feuille de calcul, mais une chaîne au format suivant:

Spreadsheet ID: {your-spreadsheet-id}

L'API tente d'accéder à une feuille de calcul dont l'ID est cette chaîne. Logiquement, il ne le trouve pas: jetez un œil à l'erreur que vous obtenez:

DestinationSpreadsheetId [ID de feuille de calcul: spreadsheetId] non valide .

La "Spreadsheet ID: "partie ne devrait pas être là.

Solution:

Après avoir créé la nouvelle feuille de calcul, récupérez l'ID de la feuille de calcul comme suit:

spreadsheetId = spreadsheet.get('spreadsheetId')