Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets 如何从Google Sheet API导出csv?_Google Sheets_R Googlesheets_Google Sheets Api - Fatal编程技术网

Google sheets 如何从Google Sheet API导出csv?

Google sheets 如何从Google Sheet API导出csv?,google-sheets,r-googlesheets,google-sheets-api,Google Sheets,R Googlesheets,Google Sheets Api,我找不到任何API的引用,该API允许RESTAPI客户端将现有的Google工作表导出到csv文件 我认为应该有一种方法来导出它们。首先,您应该让任何人都可以访问文档。然后你会得到url。从这个url中,您应该提取由大小字母和数字组成的长id。然后使用这个脚本 #!/bin/bash long_id="id_assigned_to_your_document" g_id="number_assigned_to_card_in_google_sheet" wget --output-doc

我找不到任何API的引用,该API允许RESTAPI客户端将现有的Google工作表导出到csv文件


我认为应该有一种方法来导出它们。

首先,您应该让任何人都可以访问文档。然后你会得到
url
。从这个
url
中,您应该提取由大小字母和数字组成的长
id
。然后使用这个脚本

#!/bin/bash

long_id="id_assigned_to_your_document"
g_id="number_assigned_to_card_in_google_sheet"

wget --output-document=temp.csv "https://docs.google.com/spreadsheets/d/$long_id/export?gid=$g_id&format=csv&id=$long_id"
如果您在文档中仅使用一张卡,则其编号为:
g\u id=“0”

您可能遇到的问题与文件中的
奇怪空格
有关。我使用第二个脚本来处理它

#!/bin/bash
#Delete all lines beginning with a # from a file
#http://stackoverflow.com/questions/8206280/delete-all-lines-beginning-with-a-from-a-file
sed '/^#/ d' temp.csv | 
# reomve spaces
# http://stackoverflow.com/questions/9953448/how-to-remove-all-white-spaces-from-a-given-text-file
tr -d "[:blank:]" |
# regexp "1,2" into 1.2
# http://www.funtoo.org/Sed_by_Example,_Part_2
sed 's/\"\([−]\?[0-9]*\),\([0-9]*\)\"/\1.\2/g' > out.csv
更新 正如Sam提到的,api是更好的解决方案。现在有很多关于地址的文档:


以生成具有CSV结构的输出为例

您现在可以使用驱动器API来完成此操作——请参阅,但这将限制您使用文档的第一页。Sheets API今天没有公开导出为CSV,但将来可能会提供它。

如果您不容易访问或熟悉PHP,这里有一个非常简单的Google Apps脚本Web应用程序,一旦部署并接受调用方权限,应允许具有适当范围的访问令牌或api密钥的客户端将现有Google工作表导出到csv文件。它将Google Sheets电子表格id和工作表名称(以及可选下载文件名)作为查询参数,并返回相应的理论上符合RFC 4180的CSV文件

有关将应用程序脚本项目部署为web应用程序的更多说明,请参见:

您可以在浏览器中轻松部署和测试它,只需访问“当前web应用URL”(在脚本编辑器中发布为web应用时提供),并接受同意屏幕,甚至只需访问我在示例URL处部署的(配置为作为访问用户执行,且未经验证/可怕同意)即可

棘手的部分(像往常一样)是设置OAuth令牌或API密钥,但是如果您已经在调用GoogleSheetsV4API,那么您可能已经拨入了它。我使用CURL来确保它的行为与restapi一样,但是我使用的获取OAuth令牌的技术在这里既分散了注意力,而且坦白说有点可怕,因为它很容易出错。如果你还没有办法得到一个答案,那么在任何情况下,这可能是一个单独的SO问题的好话题

一个相关的(大的!)警告:我不能100%确定同意和验证是如何与纯Rest客户端交互的(即,如果您不首先在浏览器中访问它,它是如何工作的…),和/或该脚本是否需要与使用Sheets API的其他代码位于同一个GCP项目中。如果有兴趣,和/或它不能立即运行,请让我知道,我会很高兴地深入挖掘并跟进

// Example URL, assuming:
// "Current web app URL": https://script.google.com/a/tillerhq.com/macros/s/AKfycbyZlWAW6bpCpnFoPjbdjznDomFRbTNluG4siCBMgOy2qU2AGoA/exec
// spreadsheetId: 1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E
// sheet name: Sheet1
// (optional) filename: mycsv.csv
//
// https://script.google.com/a/tillerhq.com/macros/s/AKfycbyZlWAW6bpCpnFoPjbdjznDomFRbTNluG4siCBMgOy2qU2AGoA/exec?spreadsheetid=1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E&sheetname=Sheet1&filename=mycsv.csv?spreadsheetid=1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E&sheetname=Sheet1&filename=mycsv.csv
//


var REQUIRED_PARAMS = [
  'spreadsheetid', // example: "1xNDWJXOekpBBV2hPseQwCRR8Qs4LcLOcSLDadVqDA0E"
  'sheetname'      // Case-sensitive; example: "Sheet1"
];

// Returns an RFC 4180 compliant CSV for the specified sheet in the specified spreadsheet
function doGet(e) {

  REQUIRED_PARAMS.forEach(function(requiredParam) {
    if (!e.parameters[requiredParam]) throw new Error('Missing required parameter ' + requiredParam);
  });

  var spreadsheet = SpreadsheetApp.openById(e.parameters.spreadsheetid);
  var sheet = spreadsheet.getSheetByName(e.parameters.sheetname);
  if (!sheet) throw new Error("Could not find sheet " + e.parameters.sheetname + " in spreadsheet " + e.parameters.spreadsheetid);

  var filename = e.parameters.filename || (spreadsheet.getName() + "_" + e.parameters.sheetname + ".csv");


  var numRows = sheet.getLastRow();
  var numColumns = sheet.getLastColumn();

  var values = sheet.getSheetValues(1, 1, numRows, numColumns);

  function quote(s) {

    s = s.toString();

    if ((s.indexOf("\r") == -1)
       && (s.indexOf("\n") == -1)
       && (s.indexOf(",") == -1)
       && (s.indexOf("\"") == -1)) return s;

    // Fields containing line breaks (CRLF)*, double quotes, and commas should be enclosed in double-quotes;
    // anything other than that we already returned, so if we get here -- escape it and quote it.

    // *That's what the text of the RFC says, but the ABNF (...and Excel) treat EITHER CR or LF as requiring quotes.

    // Replace any double quote with a double double quote, and wrap the whole thing in quotes
    return "\"" + s.replace(/"/g, '""') + "\"";
  };

  var csv = values.map(function(row) {
    return row.map(quote).join();
  }).join("\r\n") + "\r\n";


  return ContentService
  .createTextOutput(csv)
  .setMimeType(ContentService.MimeType.CSV)
  .downloadAsFile(filename);
}

下面的URL为您提供了每张谷歌电子表格的CSV。该表必须可供公众、任何具有链接(未列出)的人访问

您需要提供的参数包括:

  • 工作表ID(即谷歌电子表格URL中的ID
    https://docs.google.com/spreadsheets/d/{{ID}}/edit
  • 图纸名称(即用户给定的图纸名称)
使用该URL,您可以运行GET请求来获取CSV。
或者将其粘贴到浏览器地址栏中。

还没有人提到过
gspread
,下面是我的做法:

#open sheet
sheet = gc.open_by_key(sheet_id)

#select worksheet
worksheet = sheet.get_worksheet(0)

#download values into a dataframe
df = pd.DataFrame(worksheet.get_all_records())

#save dataframe as a csv, using the spreadsheet name
filename = sheet.title + '.csv'
df.to_csv(filename, index=False)

很好的解决方案!此外:您可以始终在谷歌浏览器中使用网络检查器(Ctrl+Shift+I,网络选项卡):当它执行CSV导出请求时,我们可以看到相应的URL。我猜您也可以通过同样的方式获得上述URL?;)那是很多年前的事了:)我现在不记得了。我想你指的是
$long\u id
,而不是第一个代码块最后一部分的
$ling\u id
?是的@nikhilvj。我把这个修好了。谢谢,太棒了。我花了好几个小时试图找到这个URL结构。任何地方都没有记录。非常感谢您的回答。如果有人想知道为什么会是这样,这里有一个链接指向更详细的解释:有没有一种方法可以通过私有表单和身份验证来实现这一点?@Andrew该特定API仅适用于公共表单。你可以把它们公开,但别人看不见。然而,它们是公开的,所以一旦链接断开,数据就断开了。绝对不建议用于敏感数据。
#open sheet
sheet = gc.open_by_key(sheet_id)

#select worksheet
worksheet = sheet.get_worksheet(0)

#download values into a dataframe
df = pd.DataFrame(worksheet.get_all_records())

#save dataframe as a csv, using the spreadsheet name
filename = sheet.title + '.csv'
df.to_csv(filename, index=False)