Google Sheets API ใน Python สร้างสเปรดชีตแล้วแก้ไขสเปรดชีตไม่พบ

Sep 03 2020

นี่คือรหัสของฉันซึ่งโดยพื้นฐานแล้วฉันคัดลอกมาจากข้อความquickstart.pyที่ 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()

สร้างสเปรดชีตใน Google สเปรดชีตสำเร็จ ฉันสามารถดูได้จากหน้าแรกของไดรฟ์ในอินเทอร์เน็ตเบราว์เซอร์ของฉัน ข้อผิดพลาดเกิดขึ้นหลังจากนี้เมื่อฉันพยายามนำเข้าแผ่นงานจากสเปรดชีตอื่น

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

ด้วยเหตุผลบางประการฉันได้รับข้อผิดพลาด:

googleapiclient.errors.HttpError: <HttpError 400 เมื่อขอ https://sheets.googleapis.com/v4/spreadsheets/ copyFrom / sheets / copyFromE : copyTo? alt = json (ต่อไปนี้เป็นที่ที่ควรส่งรหัสสเปรดชีตเป้าหมาย) "ไม่ถูกต้อง destinationSpreadsheetId [รหัสสเปรดชีต : spreadsheetId ] ">

นี่เป็นส่วนที่แปลกเพราะมีการสร้างสเปรดชีต ฉันสามารถดูได้จากหน้าแรกของไดรฟ์ในอินเทอร์เน็ตเบราว์เซอร์ของฉัน ถ้าฉันใส่spreadsheetIdในเบราว์เซอร์ URL ก็ใช้งานได้เช่นกัน มีแผ่นงานอยู่ตรงนั้น ถ้าฉันคลิกสองครั้งที่สเปรดชีตที่สร้างขึ้นในไดรเวอร์ของฉันหลังจากที่สร้างแล้วมันจะเปิดสเปรดชีตเปล่าที่มีชื่อที่ฉันกำหนดไว้nameDocsพร้อมกับ URL เดียวกันทั้งหมดที่เก็บไว้ในspreadsheetIdตัวแปร โดยทั่วไปสเปรดชีตจะอยู่ที่นั่นเก็บไว้ในบัญชีของฉันมันถูกสร้างขึ้น ข้อมูลถูกต้อง แต่โปรแกรมไม่พบ

สิ่งที่แปลกต่อไปคือ: ถ้าฉันเรียกใช้สคริปต์ที่นำเข้าแผ่นงานจากสเปรดชีตอื่นหลังจากเปิดสเปรดชีตที่สร้างขึ้นผ่านเบราว์เซอร์สคริปต์จะทำงาน

ฉันพยายามทำรายงานอัตโนมัติจากงานของฉันซึ่งฉันต้องทำด้วยตนเองและจะช่วยประหยัดเวลาในการทำงาน ฉันได้ลองเปิดสเปรดชีตที่สร้างขึ้นผ่าน Selenium แล้วเรียกใช้ "copy sheet from spreadsheetId code (วางด้านบน)" แต่ด้วยเหตุผลบางประการ Selenium ไม่เปิด URL ซึ่งเบราว์เซอร์จะเปิดขึ้นหากฉันพิมพ์สิ่งเดียวกันทั้งหมดด้วยตนเองดังนั้น อยู่นอกภาพ มีความคิดว่าเหตุใดจึงเกิดขึ้น หรือแนวคิดใด ๆ ที่จะหาวิธีแก้ปัญหานี้?

คำตอบ

Iamblichus Sep 03 2020 at 16:45

ปัญหา:

คุณไม่ได้เรียกรหัสสเปรดชีต แต่มีการจัดรูปแบบสตริงดังนี้:

Spreadsheet ID: {your-spreadsheet-id}

API พยายามเข้าถึงสเปรดชีตที่มี ID เป็นสตริงนี้ เหตุผลมันไม่พบลองดูข้อผิดพลาดที่คุณได้รับ:

ไม่ถูกต้อง destinationSpreadsheetId [Spreadsheet ID: spreadsheetId]

"Spreadsheet ID: "ส่วนหนึ่งไม่ควรจะมี

สารละลาย:

หลังจากสร้างสเปรดชีตใหม่แล้วให้ดึงรหัสสเปรดชีตดังนี้:

spreadsheetId = spreadsheet.get('spreadsheetId')