如何使用 Gspread 下载 Google Docs excel sheet 并在本地访问数据(A1 表示法)?

How to download a Google Docs excel sheet with a Gspread and access data locally (A1 notation)?

我需要通过 Gspread 从 Google 文档下载 excel sheet,然后我需要多次读取 中不同单元格的值'A1' 符号。因此,我不能只获取 spreadsheet 然后调用 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. 我从作品中下载值sheet。
  2. 将其(列表列表)转换为 pandas 数据框。
  3. 然后我将 df 写入 .xlsx 文件。
  4. 我把.xlsx文件读取到一个全局变量

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

我相信你的目标如下。

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

为了达到你的目的,我提出以下流程。

  1. 使用文件方法将 Google 电子表格下载为 XLSX 数据:导出到云端硬盘 API。
  2. 使用下载的二进制数据打开 XLSX 数据 openpyxl.load_workbook()

示例脚本:

在此示例脚本中,根据您的情况,访问令牌用于 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电子表格和openpyxl.load_workbook

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

      import openpyxl
      import requests
      from io import BytesIO
    

注:

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

参考文献:

  • Files: export
  • Using openpyxl to read file from memory
    • 我认为此线程可能对您的情况有用。