如何使用 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
到目前为止我正在做的是:
- 我从作品中下载值sheet。
- 将其(列表列表)转换为 pandas 数据框。
- 然后我将 df 写入 .xlsx 文件。
- 我把.xlsx文件读取到一个全局变量
在我看来,我做这么多事情只是为了实现一个可以在两条线上完成的事情。请让我知道什么比上面的更有效。
我相信你的目标如下。
- 您想下载 Google 电子表格作为 XLSX 数据。
- 您想使用下载的 XLSX 数据而不另存为文件。
- 您已经能够使用 gspread 为 Google 电子表格获取和放置值。
- 您想使用 python 实现此目的。
为了达到你的目的,我提出以下流程。
- 使用文件方法将 Google 电子表格下载为 XLSX 数据:导出到云端硬盘 API。
- 使用下载的二进制数据打开 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/drive
或 https://www.googleapis.com/auth/drive.readonly
的范围。当您修改范围时,请重新授权范围。这样,新的范围就会反映到访问令牌中。所以请注意这一点。
参考文献:
- Files: export
- Using openpyxl to read file from memory
- 我认为此线程可能对您的情况有用。
我需要通过 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
到目前为止我正在做的是:
- 我从作品中下载值sheet。
- 将其(列表列表)转换为 pandas 数据框。
- 然后我将 df 写入 .xlsx 文件。
- 我把.xlsx文件读取到一个全局变量
在我看来,我做这么多事情只是为了实现一个可以在两条线上完成的事情。请让我知道什么比上面的更有效。
我相信你的目标如下。
- 您想下载 Google 电子表格作为 XLSX 数据。
- 您想使用下载的 XLSX 数据而不另存为文件。
- 您已经能够使用 gspread 为 Google 电子表格获取和放置值。
- 您想使用 python 实现此目的。
为了达到你的目的,我提出以下流程。
- 使用文件方法将 Google 电子表格下载为 XLSX 数据:导出到云端硬盘 API。
- 使用下载的二进制数据打开 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/drive
或https://www.googleapis.com/auth/drive.readonly
的范围。当您修改范围时,请重新授权范围。这样,新的范围就会反映到访问令牌中。所以请注意这一点。
参考文献:
- Files: export
- Using openpyxl to read file from memory
- 我认为此线程可能对您的情况有用。