57

如果这是一个明显的问题,我很抱歉,我对 API 还是很陌生。我正在使用 python drive api 库,并尝试将 google 电子表格下载为 csv。
当我使用 files.get 时,它会吐出一个没有 downloadUrl 的文件,并且在导出链接字段中没有“text/csv”键。
如果不可能,我可以找到一种解决方法,但我希望它是,因为可以手动执行(文件->下载_as->csv)

我需要使用谷歌文档列表api吗?

谢谢,马特

4

7 回答 7

48

更新:我发布了另一个适用于电子表格 v4 API 的答案

老答案:

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=1813http://code.google.com/a/google.com/p /apps-api-issues/issues/detail?id=3240以获取有关该问题的更多信息。

于 2012-09-20T07:26:45.577 回答
12

正如许多其他人指出的那样,我原来的答案有些过时了。所以这是我为 Google 电子表格 API v4 更新的答案。现在有一种获取 gid 的方法,但我们不能使用驱动器files.export API,因为它只导出电子表格中的第一个工作表(即使您指定了 gid)。

要将所有工作表导出为 CSV 文件,您需要使用电子表格.get API 获取要导出的工作表的 gid 。该 API 调用返回一堆关于电子表格的信息,包括每个工作表。您可以从每个工作表的 properties.sheetId 属性中获取 gid。

一旦你有了它,你就可以在选择 File->Download As->CSV 时构建 Sheets 使用的相同 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)

于 2018-07-08T21:00:18.027 回答
10

exportLinks 集合不公开 CSV 格式,因为这只会导出电子表格的第一个工作表。如果将第一个工作表作为 CSV 检索是您正在寻找的行为,您可以手动构建链接并将?exportFormat=查询参数设置为?exportFormat=csv.

于 2012-07-23T21:28:39.053 回答
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)
于 2012-08-17T18:10:06.050 回答
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/

于 2014-04-05T19:38:24.293 回答
4

(2016 年 7 月)这个问题的措辞正确,但本质上是另一个线程的副本(使用 Python 从 Google Docs 下载电子表格)。虽然下面这个问题的一些先前答案可能仍然有效(尽管答案是在 JS/Apps 脚本而不是 Python 中),但新的Drive API 版本(v3)和新的Sheets API 版本(v4)使它们稍微过时了,尽管以前的版本两者都没有被弃用(还)。现代 Google API 访问使用 API 密钥或 OAuth2 授权,主要使用Google API 客户端库,包括用于 Python 的客户端库。

要执行 OP 中/请求的任务,您可能会查询要下载的特定表格,然后使用 Drive API 执行实际导出。由于这可能是一种常见的操作,我写了一篇博文,分享了一个代码片段,可以为您完成此操作。如果您希望进一步导出,我还有另外一对帖子以及一个视频,其中概述了如何将文件上传到 Google Drive 和从 Google Drive 下载文件。

请注意,还有一个Google Sheets API,但它主要用于面向电子表格的操作,即插入数据、读取电子表格行、单元格格式设置、创建图表、添加数据透视表等,而不是基于文件的请求,例如导出位置Drive API 是正确使用的 API。

于 2016-07-13T01:59:56.977 回答
3

请注意,截至 2015 年 4 月,DocsList 已贬值,并已被 DriveApp 取代。许多 DriveApp 方法与 DocsList 相同。因此,在许多情况下,您可以简单地将 DocsList 替换为 DriveApp。所以用 DriveApp.createFile() 替换 DocsList.createFile()

如何在我的代码中将 DocsList 更新为 DriveApp

于 2015-04-26T11:12:58.403 回答