【问题标题】:How to download a Google Docs excel sheet with a Gspread and access data locally (A1 notation)?如何下载带有 Gspread 的 Google Docs excel 表并在本地访问数据(A1 表示法)?
【发布时间】:2020-07-14 10:11:18
【问题描述】:

我需要通过 Gspread 从 Google Docs 下载一个 Excel 表格,然后我需要多次读取 'A1' 表示法中不同单元格的值。因此,我不能只获取电子表格然后调用val = worksheet.acell('B1').value,因为脚本会因过多的 API 调用而冻结。我现在的解决方案:

def download_hd_sheet():
    worksheet = gc.values().get(spreadsheetId=excel_id, range='variables', valueRenderOption='FORMULA').execute()['values']
    df = pd.DataFrame(worksheet)
    writer = pd.ExcelWriter("Variables.xlsx", engine='xlsxwriter')
    df.to_excel(writer, sheet_name='Sheet1', index=False, header=False)
    workbook = writer.book
    worksheet = writer.sheets['Sheet1']
    writer.save()
    book = openpyxl.load_workbook('Variables.xlsx', data_only=False)
    global hd_sheet
    hd_sheet = book.active

到目前为止,我正在做的是:

  1. 我从工作表下载值。
  2. 将其(列表列表)转换为 pandas 数据框。
  3. 然后我将 df 写入 .xlsx 文件。
  4. 我将 .xlsx 文件读取到全局变量中

在我看来,我做这么多事情只是为了实现可以分两行完成的事情。请让我知道什么比上述更有效。

【问题讨论】:

  • 虽然我不确定我是否能正确理解您的目标,但在您的情况下,例如,通过使用 Drive API 转换直接将 Google 电子表格下载为 XLSX 文件怎么样?如果这不是您期望的方向,我深表歉意。
  • @Tanaike 我的意思是 - 我认为我实际上根本不需要将工作表写入文件。我想做的是获取谷歌表并将其分配给一个对象,这样我在获取单元格的值时就不必进行太多的 API 调用。如果这样的解决方案是不可能的,我真的需要将它写入一个文件 - 请告诉我如何立即下载 XLSX 文件?
  • 感谢您的回复。根据您的回复,我提出了一个示例脚本作为答案。你能确认一下吗?如果我误解了您的目标并且这不是您期望的方向,我深表歉意。
  • 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。

标签: python excel google-sheets google-sheets-api gspread


【解决方案1】:

我相信你的目标如下。

  • 您希望将 Google 电子表格下载为 XLSX 数据。
  • 您想使用下载的 XLSX 数据而不保存为文件。
  • 您已经能够使用 gspread 获取和放置 Google 电子表格的值。
  • 您想使用 python 来实现。

为了实现你的目标,我想提出以下流程。

  1. 使用 Files: export in Drive API 的方法将 Google 电子表格作为 XLSX 数据下载。
  2. 使用下载的二进制数据和openpyxl.load_workbook()打开XLSX数据。

示例脚本:

在此示例脚本中,根据您的情况,访问令牌用于 gspread 的授权。

spreadsheetId = "###"  # Please set the Spreadsheet ID.

client = gspread.authorize(credentials)
access_token = client.auth.token
url = "https://www.googleapis.com/drive/v3/files/" + spreadsheetId + "/export?mimeType=application%2Fvnd.openxmlformats-officedocument.spreadsheetml.sheet"
res = requests.get(url, headers={"Authorization": "Bearer " + access_token})
book = openpyxl.load_workbook(filename=BytesIO(res.content), data_only=False)
hd_sheet = book.active
  • 通过上述脚本,XLSX数据直接从Google Spreadsheet和openpyxl.load_workbook下载

  • 在这种情况下,除了gspread之外,还使用了以下库。

      import openpyxl
      import requests
      from io import BytesIO
    

注意:

  • 在这种情况下,请包括https://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/drive.readonly 的范围。当您修改范围时,请重新授权范围。这样,新的范围就会反映到访问令牌中。所以请注意这一点。

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2022-09-24
    相关资源
    最近更新 更多