下载电子表格Google Drive API的所有选项卡



我正在尝试使用google Drive下载电子表格的全部内容。目前,我的代码是导出,然后写入一个文件从第一个选项卡从给定的电子表格的内容。我怎样才能使它下载文件的全部内容?

这是我当前使用的函数:

def download_file(real_file_id, service):
try:
file_id = real_file_id
request = service.files().export_media(fileId=file_id,
mimeType='text/csv')
file = io.BytesIO()
downloader = MediaIoBaseDownload(file, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print(F'Download {int(status.progress() * 100)}.')
except HttpError as error:
print(F'An error occurred: {error}')
file = None

file_object = open('test.csv', 'a')
file_object.write(file.getvalue().decode("utf-8"))
file_object.close()

return file.getvalue()

通过传递已经初始化的google drive服务和文件id

,我在代码的稍后阶段调用该函数。
download_file(real_file_id='XXXXXXXXXXXXXXXXXXXXX', service=service)

我相信你的目标是这样的。

  • 你想下载谷歌电子表格中的所有表格为CSV数据。
  • 你想用googleapi for python实现这个。

在这种情况下,下面的示例脚本如何?在本例中,为了检索Google Spreadsheet中每个工作表的工作表名称,使用了Sheets API。使用工作表API,检索所有工作表的工作表id。使用这些工作表id,所有工作表将被下载为CSV数据。

示例脚本:

从你的展示脚本,我猜service可能是service = build("drive", "v3", credentials=creds)。如果我的理解是正确的,为了检索访问令牌,请使用creds

spreadsheetId = "###" # Please set the Spreadsheet ID.
sheets = build("sheets", "v4", credentials=creds)
sheetObj = sheets.spreadsheets().get(spreadsheetId=spreadsheetId, fields="sheets(properties(sheetId,title))").execute()
accessToken = creds.token
for s in sheetObj.get("sheets", []):
p = s["properties"]
sheetName = p["title"]
print("Download: " + sheetName)
url = "https://docs.google.com/spreadsheets/export?id=" + spreadsheetId + "&exportFormat=csv&gid=" + str(p["sheetId"])
res = requests.get(url, headers={"Authorization": "Bearer " + accessToken})
with open(sheetName + ".csv", mode="wb") as f:
f.write(res.content)
  • 在这种情况下,请添加import requests

  • 当这个脚本运行时,Google电子表格中的所有工作表都被下载为CSV数据。每个CSV文件的文件名使用Google Spreadsheet中的选项卡名称。

  • 在这种情况下,请添加"https://www.googleapis.com/auth/spreadsheets.readonly"如下。并且,请重新授权范围。

    SCOPES = [
    "https://www.googleapis.com/auth/drive.readonly", # Please use this for your actual situation.
    "https://www.googleapis.com/auth/spreadsheets.readonly",
    ]
    
  • 参考:

  • 方法:spreadsheets.get

Tanaike的答案更简单,更直接,但我已经在这上面花了一些时间,所以我不妨把它作为一个替代。

您最初遇到的问题是CSV文件不支持多个选项卡/工作表,因此Drive的files.export只会导出第一个工作表,并且它没有选择特定工作表的方法。

另一种方法是使用工作表APIcopyTo()方法为每个工作表创建临时文件并将其导出为单个CSV文件。

# need a service for sheets and one for drive
sheetservice = build('sheets', 'v4', credentials=creds) 
driveservice = build('drive', 'v3', credentials=creds)
spreadsheet = sheetservice.spreadsheets()
result = spreadsheet.get(spreadsheetId=YOUR_SPREADSHEET).execute()
sheets = result.get('sheets', []) # the list of sheets within your spreadsheet
# standard metadata to create the blank spreadsheet files
file_metadata = {
"name":"temp",
"mimeType":"application/vnd.google-apps.spreadsheet"
} 
for sheet in sheets:
# create a blank spreadsheet and get its ID
tempfile = driveservice.files().create(body=file_metadata).execute()
tempid = tempfile.get('id')
# copy the sheet to the new file
sheetservice.spreadsheets().sheets().copyTo(spreadsheetId=YOUR_SPREADSHEET, sheetId=sheet['properties']['sheetId'], body={"destinationSpreadsheetId":tempid}).execute()

# need to delete the first sheet since the copy gets added as second
sheetservice.spreadsheets().batchUpdate(spreadsheetId=tempid, body={"requests":{"deleteSheet":{"sheetId":0}}}).execute()
download_file(tempid, driveservice) # runs your original method to download the file
driveservice.files().delete(fileId=tempid).execute() # to clean up the temp file

您还需要https://www.googleapis.com/auth/spreadsheetshttps://www.googleapis.com/auth/drive作用域。这涉及到更多的API调用,所以我只推荐Tanaike的方法,但我希望它能给你一个想法,你可以使用API来满足你的需求。

最新更新