使用 google drive API 下载 csv 格式的电子表格
Posted
技术标签:
【中文标题】使用 google drive API 下载 csv 格式的电子表格【英文标题】:Using the google drive API to download a spreadsheet in csv format 【发布时间】:2012-07-22 02:50:13 【问题描述】:如果这是一个显而易见的问题,我很抱歉,我对 API 还是很陌生。 我正在使用 python drive api 库,并尝试将 google 电子表格下载为 csv。 当我使用 files.get 时,它会吐出一个没有 downloadUrl 的文件,并且在导出链接字段中没有“text/csv”键。 如果不可能,我可以找到一个解决方法,但我希望它是,因为可以手动执行 (file->download_as->csv)
我需要使用谷歌文档列表api吗?
谢谢, 马特
【问题讨论】:
【参考方案1】:更新:我发布了与电子表格 v4 API 配合使用的 another answer。
旧答案:
Alain 的回答是正确的,但您还需要设置gid=parameter
来指定要导出哪个工作表。
例如,如果您的“应用程序/pdf”导出链接是这样的:
docs.google.com/feeds/download/spreadsheets/Export?key=<FILE_ID>&exportFormat=pdf
您可以将其更改为下载第一个工作表:
docs.google.com/feeds/download/spreadsheets/Export?key<FILE_ID>&exportFormat=csv&gid=0
虽然没有可靠的方法通过 API 获取给定工作表的 gid 并且它们不是基于零的索引,但存在一些问题。如果您删除工作表,则该 gid 不会被重用。不过,您可以在浏览器的 URL 中看到 gid,因此如果您的工作表信息是不变的,您可以从那里获取。有关该问题的更多信息,请参阅 http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=1813 和 http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3240。
【讨论】:
我仍在获取电子表格的 html 导出。 gid 是正确的,只有一张纸;我很困惑。 这太棒了!伙计们!在 php 中使用了这个。 有什么消息吗?另外,有错别字吗?当然,键后应该有一个“=”。 这适用于我当前的谷歌文档:docs.google.com/spreadsheets/d/SECRET/… @JustAGuy 我提出了一个适用于最新 API 的新答案。此外,access_token 需要进入 HTTP 请求的 Authorization 标头。如果您使用的是通常会为您处理的库,但是我刚刚发布的 python 脚本中有一个示例可以直接设置它。【参考方案2】:正如许多其他人指出的那样,我最初的答案有些过时了。所以这是我为 Google 电子表格 API v4 更新的答案。现在有一种获取 gid 的方法,但我们不能使用驱动器 files.export API,因为它只导出电子表格中的第一个工作表(即使您指定了 gid)。
要将所有工作表导出为 CSV 文件,您需要使用 spreadsheets.get API 获取要导出的工作表的 gid。该 API 调用返回一堆关于电子表格的信息,包括每个工作表。您可以从每个工作表的 properties.sheetId 属性中获取 gid。
一旦你有了它,你就可以建立在你选择 File->Download As->CSV 时 Sheets 使用的相同 URL。您可以从电子表格中获取 data.spreadsheetUrl 值并将 /edit
替换为 /export
,然后添加 gid 作为参数。您还需要在请求的 HTTP 标头中包含 Authorization Bearer <auth token>
。
这是一个基于 quickstart 示例的 Python 脚本,它下载具有指定 ID 的电子表格的所有工作表。您需要将 <spreadsheet id>
替换为您有权访问的电子表格的 ID:
import apiclient.discovery
import httplib2
import oauth2client.file
import oauth2client.tools
import re
import requests
import shutil
import urllib.parse
SCOPES = 'https://www.googleapis.com/auth/drive.readonly'
SPREADSHEET_ID = '<spreadsheet id>'
store = oauth2client.file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
flow = oauth2client.client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = oauth2client.tools.run_flow(flow, store)
service = apiclient.discovery.build('sheets', 'v4', http=creds.authorize(httplib2.Http()))
result = service.spreadsheets().get(spreadsheetId = SPREADSHEET_ID).execute()
urlParts = urllib.parse.urlparse(result['spreadsheetUrl'])
path = re.sub("\/edit$", '/export', urlParts.path)
urlParts = urlParts._replace(path=path)
headers =
'Authorization': 'Bearer ' + creds.access_token,
for sheet in result['sheets']:
params =
'id': SPREADSHEET_ID,
'format': 'csv',
'gid': sheet['properties']['sheetId'],
queryParams = urllib.parse.urlencode(params)
urlParts = urlParts._replace(query=queryParams)
url = urllib.parse.urlunparse(urlParts)
response = requests.get(url, headers = headers)
filePath = '/tmp/foo-%s.csv' % (+ params['gid'])
with open(filePath, 'wb') as csvFile:
csvFile.write(response.content)
【讨论】:
您能否为 credentials.json 和 client_secret.json 文件添加示例数据。这对像我这样的人会有帮助。 @Jagath 我知道已经过去了一段时间,但从长远来看,这可能会对人们有所帮助:您可以找到一些指导in here "gid" 查询参数不起作用 - 它重定向到 404 页面 Google 似乎稍微更改了导出 URL。我已经更新了上面的示例以处理更改。上面的示例现在适用于 Python 3.9.5。【参考方案3】:exportLinks 集合不公开 CSV 格式,因为这只会导出电子表格的第一个工作表。如果将第一个工作表作为 CSV 检索是您正在寻找的行为,您可以手动构建链接并将 ?exportFormat=
查询参数设置为 ?exportFormat=csv
。
【讨论】:
【参考方案4】:这是对我有用的 Alain 建议的实现:
downloadUrl = entry.get('exportLinks')['application/pdf']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"
resp, content = drive_service._http.request(downloadUrl)
【讨论】:
【参考方案5】:不确定这是否是 OP 需要的,但在新的 Google 表格版本中,热链接电子表格的 csv 版本似乎有点困难。
如果您对将电子表格中的所有工作表导出到单独的 csv
文件(而不是单独下载每个文件)的 Google 应用程序脚本感兴趣,请点击:
function onOpen()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var csvMenuEntries = [name: "export as csv files", functionName: "saveAsCSV"];
ss.addMenu("csv", csvMenuEntries);
;
function saveAsCSV()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
// create a folder from the name of the spreadsheet
var folder = DocsList.createFolder(ss.getName().toLowerCase().replace(/ /g,'_') + '_csv_' + new Date().getTime());
for (var i = 0 ; i < sheets.length ; i++)
var sheet = sheets[i];
// append ".csv" extension to the sheet name
fileName = sheet.getName() + ".csv";
// convert all available sheet data to csv format
var csvFile = convertRangeToCsvFile_(fileName, sheet);
// create a file in the Docs List with the given name and the csv data
folder.createFile(fileName, csvFile);
Browser.msgBox('Files are waiting in a folder named ' + folder.getName());
function convertRangeToCsvFile_(csvFileName, sheet)
// get available data range in the spreadsheet
var activeRange = sheet.getDataRange();
try
var data = activeRange.getValues();
var csvFile = undefined;
// loop through the data in the range and build a string with the csv data
if (data.length > 1)
var csv = "";
for (var row = 0; row < data.length; row++)
for (var col = 0; col < data[row].length; col++)
if (data[row][col].toString().indexOf(",") != -1)
data[row][col] = "\"" + data[row][col] + "\"";
// join each row's columns
// add a carriage return to end of each row, except for the last one
if (row < data.length-1)
csv += data[row].join(",") + "\r\n";
else
csv += data[row];
csvFile = csv;
return csvFile;
catch(err)
Logger.log(err);
Browser.msgBox(err);
注意:此脚本使用 DocsList.createFile() 方法,该方法仅适用于 Google Apps 帐户。
如果您需要进一步解释,请到这里:http://drzon.net/export-all-google-sheets-to-csv/
【讨论】:
【参考方案6】:(2016 年 7 月) 这个问题的措辞是正确的,但本质上是另一个线程 (Download a spreadsheet from Google Docs using Python) 的重复。虽然之前对 this 问题的一些答案可能仍然有效(尽管答案是在 JS/Apps 脚本而不是 Python 中),但新的Drive API version (v3) 和新的Sheets API version (v4) 使它们稍微过时了,尽管之前的两者的版本都没有被弃用(还)。现代 Google API 访问使用 API 密钥或 OAuth2 授权,主要使用 Google APIs Client Libraries,包括 the one for Python。
要执行 OP 中/请求的任务,您可能会查询要下载的特定表格,然后使用 Drive API 执行实际导出。由于这可能是一个常见的操作,我写了一个 blogpost 共享一个代码 sn-p 为您执行此操作。如果您希望进一步导出,我还有一对posts 以及一个概述如何将文件上传到 Google Drive 和从 Google Drive 下载文件的视频。
请注意,还有一个Google Sheets API,但它主要用于面向电子表格的操作,即插入数据、读取电子表格行、单元格格式、创建图表、添加数据透视表等,而不是基于文件的请求,例如将 Drive API 导出到正确使用的位置。
【讨论】:
谢谢,韦斯皮。你的博客文章和代码示例帮助了我!【参考方案7】:请注意,自 2015 年 4 月起,DocsList 已贬值,并已被 DriveApp 取代。许多 DriveApp 方法与 DocsList 相同。因此,在许多情况下,您可以简单地将 DocsList 替换为 DriveApp。所以用 DriveApp.createFile() 替换 DocsList.createFile()
How to update DocsList to DriveApp in my code
【讨论】:
以上是关于使用 google drive API 下载 csv 格式的电子表格的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - 如何使用 Google Drive API 下载公共文件
如何从 Google Drive 上传和下载文件(使用 Rest Api v3)
Node.js Google Drive api 下载文件错误
Google Drive API v3:没有任何方法可以获取 google 文档的下载 url?