如果这是一个显而易见的问题,我很抱歉,我仍然是API的新手.我正在使用python驱动器api库,并尝试下载谷歌电子表格作为csv.
当我使用files.get时,它会吐出一个没有downloadUrl的文件,并且导出链接字段中没有'text/csv'键.
如果不可能,我可以找到一个解决方法,但我希望它是,因为它可以手动完成(file-> download_as-> csv)
我需要使用谷歌文档列表api吗?
谢谢,马特
Pet*_*ght 45
更新:我发布了另一个适用于Spreadsheets v4 API的答案.
旧答案:
Alain的答案是正确的,但您还需要设置gid=parameter指定要导出的工作表.
例如,如果您的'application/pdf'导出链接是这样的:
docs.google.com/feeds/download/spreadsheets/Export?key=<FILE_ID>&exportFormat=pdf
Run Code Online (Sandbox Code Playgroud)
您可以将其更改为此以下载第一个工作表:
docs.google.com/feeds/download/spreadsheets/Export?key<FILE_ID>&exportFormat=csv&gid=0
Run Code Online (Sandbox Code Playgroud)
虽然没有可靠的方法通过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有关该问题的更多信息.
Pet*_*ght 11
正如许多其他人指出的那样,我原来的回答有些过时了。所以这是我为 Google Spreadsheets API v4 更新的答案。现在有一种获取 gid 的方法,但我们不能使用驱动器files.export API,因为它只导出电子表格中的第一个工作表(即使您指定了 gid)。
要将所有工作表导出为 CSV 文件,您需要使用电子表格.get API获取要导出的工作表的 gid 。该 API 调用会返回一系列有关电子表格的信息,包括每个工作表。您可以从每个工作表的 properties.sheetId 属性中获取 gid。
一旦你有了它,你就可以构建与选择文件->下载为->CSV时表格使用的相同的URL。您可以从电子表格中获取 data.spreadsheetUrl 值并替换/edit为/export,然后添加 gid 作为参数。您还需要Authorization Bearer <auth token>在请求的 HTTP 标头中包含。
这是一个基于他们的快速入门示例的 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)
Run Code Online (Sandbox Code Playgroud)
Ala*_*ain 10
exportLinks集合不会公开CSV格式,因为这只会导出电子表格的第一个工作表.如果将第一个工作表作为CSV检索是您要查找的行为,则可以手动构建链接并将?exportFormat=查询参数设置为?exportFormat=csv.
小智 7
以下是Alain建议的实现对我有用:
downloadUrl = entry.get('exportLinks')['application/pdf']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"
resp, content = drive_service._http.request(downloadUrl)
Run Code Online (Sandbox Code Playgroud)
不确定这是否是 OP 需要的,但在新的 Google Sheets 版本中,热链接电子表格的 csv 版本似乎有点困难。
如果您对 Google 应用程序脚本感兴趣,该脚本会将电子表格中的所有工作表导出到单个csv文件(而不是单独下载每个文件),请执行以下操作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:此脚本使用 DocsList.createFile() 方法,该方法仅适用于 Google Apps 帐户。
如果您需要进一步解释,请到这里:http : //drzon.net/export-all-google-sheets-to-csv/
| 归档时间: |
|
| 查看次数: |
53927 次 |
| 最近记录: |