使用google drive API以csv格式下载电子表格

时间:2012-07-23 20:13:50

标签: google-drive-api

如果这是一个显而易见的问题,我很抱歉,我仍然是API的新手。 我正在使用python驱动器api库,并尝试下载谷歌电子表格作为csv 当我使用files.get时,它会吐出一个没有downloadUrl的文件,并且导出链接字段中没有'text / csv'键。
如果不可能,我可以找到一个解决方法,但我希望它是,因为它可以手动完成(file-> download_as-> csv)

我是否需要使用google文档列表api?

感谢, 马特

7 个答案:

答案 0 :(得分:45)

更新:我发布了适用于Spreadsheets v4 API的another answer

旧答案:

Alain的答案是正确的,但您还需要设置gid=parameter以指定要导出的工作表。

例如,如果您的'application / 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

答案 1 :(得分:10)

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

答案 2 :(得分: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)

答案 3 :(得分:4)

不确定OP是否需要,但在新的Google表格版本中,似乎有点难以热链接电子表格的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);
  }
}

注意:此脚本使用DocsList.createFile()方法,该方法仅适用于Google Apps帐户。

如果您需要进一步说明,请转到此处:http://drzon.net/export-all-google-sheets-to-csv/

答案 4 :(得分:3)

请注意,截至2015年4月,DocsList已弃用,已被DriveApp取代。许多DriveApp方法与DocsList完全相同。因此,在许多情况下,您只需使用DriveApp替换DocsList即可。因此,用DriveApp.createFile()

替换DocsList.createFile()

How to update DocsList to DriveApp in my code

答案 5 :(得分:3)

(2016年7月)这个问题措辞正确,但实质上是另一个主题(Download a spreadsheet from Google Docs using Python)的副本。虽然以下对问题的一些回答可能仍然有效(尽管答案是在JS / Apps脚本而不是Python中),但新的Drive API version (v3)和新的Sheets API version (v4)会使它们略有不同尽管两者的先前版​​本尚未弃用(但尚未过时)。使用API​​密钥或OAuth2授权进行现代Google API访问,主要使用Google APIs Client Libraries,包括the one for Python

要执行OP中/请求的任务,您可能会查询要下载的特定表格,然后使用Drive API执行实际导出。由于这可能是一项常见的操作,我写了一个blogpost共享代码片段,为您执行此操作。如果您希望继续进行导出,我还有另外一对posts以及一段视频,其中概述了如何将文件上传到Google云端硬盘并从Google云端硬盘下载文件。

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

答案 6 :(得分:3)

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

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

一旦有了,您就可以构建与Sheets相同的URL,当您选择File-> Download As-> CSV时。您可以从电子表格中获取data.spreadsheetUrl值,并将/edit替换为/export,然后将gid添加为参数。您还需要在请求的HTTP标头中包含Authorization Bearer <auth token>

这是一个基于他们的快速入门示例的python脚本,该脚本下载具有指定ID的电子表格的所有工作表。您需要用有权访问的电子表格的ID替换<spreadsheet id>

import apiclient.discovery
import httplib2
import oauth2client
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()
spreadsheetUrl = result['spreadsheetUrl']
exportUrl = re.sub("\/edit$", '/export', spreadsheetUrl)
headers = {
  'Authorization': 'Bearer ' + creds.access_token,
}
for sheet in result['sheets']:
  params = {
    'format': 'csv',
    'gid': sheet['properties']['sheetId'],
  } 
  queryParams = urllib.parse.urlencode(params)
  url = exportUrl + '?' + queryParams
  response = requests.get(url, headers = headers)
  filePath = '/tmp/foo-%s.csv' % (+ params['gid'])
  with open(filePath, 'wb') as csvFile:
    csvFile.write(response.content)