Google Sheets API dengan Python, Membuat Spreadsheet lalu mengedit, Spreadsheet tidak ditemukan

Sep 03 2020

Ini adalah kode saya, yang pada dasarnya saya salin dari teks quickstart.pyyang disediakan 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()

Ini berhasil membuat Spreadsheet di Google Spreadsheets. Saya dapat melihatnya dari beranda drive di browser internet saya. Kesalahan terjadi setelah ini, ketika saya mencoba mengimpor lembar dari Spreadsheet lain.

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

Untuk beberapa alasan saya mendapatkan kesalahan:

googleapiclient.errors.HttpError: <HttpError 400 saat meminta https://sheets.googleapis.com/v4/spreadsheets/ copyFrom / sheets / copyFromE : copyTo? alt = json (Di sinilah id Target Spreadsheet seharusnya) dikembalikan "Tidak valid destinationSpreadsheetId [ID Spreadsheet: spreadsheetId ] ">

Ini adalah bagian yang aneh karena Spreadsheet telah dibuat. Saya dapat melihatnya dari beranda drive di browser internet saya. Jika saya memasukkan spreadsheetIddi browser, URL juga berfungsi. Jadi lembaran itu ada dan itu ada. Jika saya mengklik dua kali spreadsheet yang dibuat di driver saya, setelah dibuat, ini membuka spreadsheet kosong dengan nama yang telah saya tetapkan nameDocsdengan URL yang sama persis yang disimpan pada spreadsheetIdvariabel. Pada dasarnya, Spreadsheet ada di sana, disimpan di akun saya, SUDAH dibuat. Informasinya benar, tetapi program tidak dapat menemukannya.

Hal aneh berikutnya adalah ini: jika saya menjalankan skrip yang mengimpor lembar dari Spreadsheet lain setelah membuka Spreadsheet yang dibuat melalui browser, skrip tersebut berfungsi.

Saya mencoba mengotomatiskan laporan dari pekerjaan saya yang harus saya lakukan secara manual, dan akan menghemat waktu kerja saya. Saya telah mencoba membuka spreadsheet yang dibuat melalui Selenium dan kemudian menjalankan "lembar salinan dari kode spreadsheetId (ditempel di atas)" tetapi untuk beberapa alasan Selenium tidak membuka URL, yang dibuka browser jika saya mengetik hal yang sama persis secara manual, sehingga di luar gambaran. Ada ide mengapa ini terjadi? Atau ada ide untuk menemukan solusi untuk masalah ini?

Jawaban

Iamblichus Sep 03 2020 at 16:45

Isu:

Anda tidak mengambil ID spreadsheet, tetapi string yang diformat seperti ini:

Spreadsheet ID: {your-spreadsheet-id}

API mencoba mengakses spreadsheet yang ID-nya adalah string ini. Secara logis, ini tidak menemukannya: lihat kesalahan yang Anda dapatkan:

DestinationSpreadsheetId [ID Spreadsheet: spreadsheetId] tidak valid .

Bagian itu "Spreadsheet ID: "seharusnya tidak ada.

Larutan:

Setelah membuat spreadsheet baru, ambil ID spreadsheet seperti ini:

spreadsheetId = spreadsheet.get('spreadsheetId')