当前位置: 首页 > 知识库问答 >
问题:

Google Sheets API in Python,创建电子表格然后编辑,未找到电子表格

井礼骞
2023-03-14

这是我的代码,基本上是从文本quickstart中复制的。谷歌提供的py

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电子表格中创建了一个电子表格。我可以在internet浏览器的驱动器主页上看到它。在此之后,当我尝试从另一个电子表格导入工作表时,会发生错误。

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

出于某种原因,我得到了错误:

googleapiclient.errors.HttpError:

这是奇怪的部分,因为电子表格已经创建。我可以从我的互联网浏览器的驱动器主页上看到它。如果我在浏览器中插入spreadsheetId,URL也可以工作。所以工作表存在,它就在那里。如果我在驱动程序中双击创建的电子表格,在创建后,它会打开一个空白的电子表格,其中包含我在nameDocs中分配的名称,并且具有存储在spreadsheetId变量上的完全相同的URL。基本上,电子表格就在那里,存储在我的帐户中,它是创建的。信息是正确的,但是程序找不到。

下一个奇怪的事情是:如果我在通过浏览器打开创建的电子表格后运行从另一个电子表格导入工作表的脚本,脚本就会工作。

我正在尝试从我的工作中自动生成报告,我必须手动完成,这将节省我的工作时间。我曾尝试通过Selenium打开创建的电子表格,然后运行“从电子表格ID代码复制工作表(粘贴在上面)”,但由于某些原因,Selenium没有打开URL,如果我手动键入完全相同的内容,浏览器会打开URL,因此这是不可能的。知道为什么会这样吗?或者有什么办法来解决这个问题?

共有1个答案

麻宜春
2023-03-14

您检索的不是电子表格ID,而是一个格式如下的字符串:

Spreadsheet ID: {your-spreadsheet-id}

API正试图访问ID为此字符串的电子表格。从逻辑上讲,它没有找到它:看看你得到的错误:

无效的destinationSpreadsheetId[电子表格ID:电子表格ID]。

“电子表格ID:”部分不应存在。

创建新电子表格后,如下所示检索电子表格ID:

spreadsheetId = spreadsheet.get('spreadsheetId')
 类似资料:
  • 我已经通过谷歌官方文档《开发者指南》API中提到的一个简单Java代码成功地在我的Google Drive帐户的现有电子表格中创建了一个新的工作表,但我想通过Java代码在我的Google Drive帐户中创建一个新的电子表格。在链接中,他们没有提到这方面的任何示例代码。我已经在Spreadservice类中看到了不同的可用方法。 如何使用Google电子表格API实现这一点?

  • 在谷歌电子表格(不是excel!)中, 我有两张表。一张标题为“公司”,一张标题为“联系人”。“公司”表只是一栏中公司名称的列表,没有别的。“联系人”表是联系人详细信息的电子表格,但他们工作的公司也在A列。 我想弄清楚如何编写一个脚本来查看活动单元格的值(在“公司”表中),然后在“联系人”表的公司列中搜索该值,然后转到第二张表中的单元格让它成为活跃的细胞。 我已经弄明白了其中的一些;在搜索“联系人

  • 人若自洁,脱离卑贱的事,就必作贵重的器皿,成为圣洁,合乎主用,预备行各样的善事。你要逃避少年的私欲,同那清心祷告主的人追求公义、信德、仁爱、和平。惟有那愚拙无学问的辩论,总要弃绝,因为知道这等事是起争竞的。(2 TIMOTHY 2:21-23) 电子表格 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格“历史悠久”,比Word要长久多了。根据维基百科的记载整理一个简史: VisiCal

  • 我什么都试过了,但还是做不到 我试图使用setValues()将数据从一个电子表格复制到另一个电子表格,因为link对我不起作用。我还需要保持触发器的编辑。 因此,我创建了一个名为AddConvocacao的函数,并且总是在有任何更改时运行脚本。 为什么我在编辑时使用不起作用? 非常感谢!=)

  • 本章介绍如何使用Java创建电子表格并对其进行操作。 电子表格是Excel文件中的页面; 它包含具有特定名称的行和列。 完成本章后,您将能够创建电子表格并对其执行读取操作。 创建电子表格 首先,让我们使用前面章节中讨论的引用类创建一个电子表格。 按照上一章的说法,首先创建一个工作簿,然后我们可以继续创建一个工作表。 以下代码段用于创建电子表格。 //Create Blank workbook XS

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd