使用谷歌驱动器API以csv格式下载电子表格
我很抱歉,如果这是一个明显的问题,我还是相当新的API。 我正在使用python驱动api库,并试图下载谷歌电子表格作为csv。
当我使用files.get时,它会popup一个没有downloadUrl的文件,并且在导出链接字段中没有“text / csv”键。
如果这是不可能的,我可以find一个解决方法,但我希望是,因为可以手动(文件 – > download_as-> CSV)
我需要使用谷歌文档列表API?
谢谢,Matt
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=1813和http://code.google.com/a/google.com/p / apps-api-issues / issues / detail?id = 3240了解关于该问题的更多信息。
exportLinks集合不公开CSV格式,因为这只会导出电子表格的第一个工作表。 如果以CSV ?exportFormat=
检索第一个工作表是您正在查找的行为,则可以手动build立链接,并将?exportFormat=
query参数设置为?exportFormat=csv
。
这是阿兰的build议,这对我的作品的实施:
downloadUrl = entry.get('exportLinks')['application/pdf'] # Strip "=pdf" and replace with "=csv" downloadUrl = downloadUrl[:-4] + "=csv" resp, content = drive_service._http.request(downloadUrl)
不知道这是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/
请注意,截至2015年4月,DocsList已折旧,并已被DriveApp取代。 许多DriveApp方法与DocsList相同。 因此,在很多情况下,您可以简单地将DocsListreplace为DriveApp。 所以用DriveApp.createFile()replaceDocsList.createFile()
如何在我的代码中将DocsList更新为DriveApp
(2016年7月)这个问题expression正确,但本质上是另一个线程的重复( 使用Python从Google文档下载电子表格 )。 尽pipe以下对这个问题的一些回答可能仍然有效(虽然答案是在JS / Apps脚本而不是Python中),但是新的Drive API版本(v3)和新的Sheets API版本(v4)使得它们稍微过时,尽pipe以前的版本两者都尚未弃用(尚)。 现代Google API访问使用API密钥或OAuth2授权进行,主要与Google API客户端库 (包括Python的 客户端库) 一起使用 。
要执行OP中/由OP请求的任务,您可能会查询要下载的特定工作表,然后使用Drive API执行实际的导出。 由于这可能是一个常见的操作,我写了一个分享代码片段的博客文章 ,为您做到这一点。 如果您希望进一步进行导出,我还有另外一对post和一段video,概述了如何上传文件并从Google云端硬盘下载文件。
请注意,还有一个Google Sheets API ,但它主要是面向电子表格的操作,即插入数据,读取电子表格行,单元格格式,创build图表,添加数据透视表等,而不是基于文件的请求,如导出Drive API是正确的使用。