使用谷歌API驱动下载CSV格式的表格(Using the google drive API to

2019-06-17 12:21发布

我很抱歉,如果这是一个明显的问题,我还是很新的API。 我使用了Python驱动API库,并尝试下载一个谷歌电子表格为CSV。
当我用files.get,它吐出来,没有downloadUrl文件,且没有“文本/ CSV”在出口环节领域关键。
如果这是不可能的,我能找到一个解决办法,但我希望它是,因为它是可以手动做(文件 - > download_as-> CSV)

我是否需要使用谷歌文档列表API?

谢谢,马特

Answer 1:

更新:我已经发布了另一个答案 ,与电子表格V4 API的工作。

老答案:

从阿兰的答案是正确的,但你也需要设置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

有一个有点问题,但因为没有可靠的办法让GID为通过API给定的工作表,他们不是从零开始的索引。 如果删除工作表中,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 /应用程序的API-问题/问题/细节?ID = 3240对这个问题的详细信息。



Answer 2:

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



Answer 3:

下面是对我的作品阿兰的建议的实现:

downloadUrl = entry.get('exportLinks')['application/pdf']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"

resp, content = drive_service._http.request(downloadUrl)


Answer 4:

不知道,如果是需要什么的OP,但在新的谷歌表的版本似乎成了一个有点难以热链接您的电子表格的CSV版本。

如果你有兴趣在谷歌Apps脚本,将在电子表格导出所有图纸到单独的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()方法,该方法仅适用于谷歌Apps帐户。

如果您需要进一步的解释,去这里: http://drzon.net/export-all-google-sheets-to-csv/



Answer 5:

注意,如2015年4月的已超出DocsList被贬值,并通过DriveApp已被替换。 许多DriveApp方法是相同的已超出DocsList。 所以,在很多情况下,你可以简单地用DriveApp替换已超出DocsList。 所以更换DocsList.createFile()与DriveApp.createFile()

如何更新已超出DocsList到DriveApp在我的代码



Answer 6:

(JUL 2016)这个问题是正确的措辞,但在本质上是另一个线程的副本( 下载使用Python从谷歌文档电子表格 )。 虽然以前的一些回答以下这个问题仍然可以工作,(虽然答案都在JS /应用脚本而不是Python),一个新的驱动器API版本(V3)和新床单API版本(V4)让他们略显陈旧,尽管以前的版本双方尚未被弃用(还)。 现代谷歌API访问时使用API密钥或授权的OAuth2,主要是与谷歌API客户端库 ,其中包括一个为Python 。

为了执行由OP中/请求的任务,你或许会查询特定的表格下载,然后执行实际出口(S)与驱动器API。 由于这可能是一个常见的操作,我写了一个博客帖子共享的代码片段,这是否适合你。 如果你想追求进一步的出口,我有另一对职位与概述了如何上传文件,并从谷歌驱动器下载文件的视频一起。

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



Answer 7:

正如其他很多人都指出,我原来的答复是有些过时。 因此,这里是我的答案更新的谷歌电子表格的API v4的。 现在有一种方式来获得的GID,但我们不能用驱动files.export因为只有出口第一个工作表电子表格中的API(即使您指定的GID)。

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

一旦你有,你可以建立相同的URL,该表,当你选择File->下载AS-> CSV使用。 您可以从spreadsheets.get采取data.spreadsheetUrl值和替换/edit/export ,然后添加GID作为参数。 你还需要包括Authorization Bearer <auth token>在请求的HTTP标头。

下面是下载所有片材与指定ID的电子表格基于其快速启动例如一个Python脚本。 您需要替换<spreadsheet id>与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)


文章来源: Using the google drive API to download a spreadsheet in csv format