如何从 Google Sheet API 导出 csv?

How to export a csv from Google Sheet API?

我找不到任何对 API 的引用,它使 Rest API 客户端能够将现有的 Google Sheet 导出到 csv 文件。

https://developers.google.com/sheets/

我相信应该有办法导出它们。

首先,您应该让任何人都可以访问文档。然后你得到 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_id="0"

您可能会遇到的问题与获取的文件中的 strange spaces 有关。我使用第二个脚本来处理它

#!/bin/bash
#Delete all lines beginning with a # from a file
#
sed '/^#/ d' temp.csv | 
# reomve spaces
# 
tr -d "[:blank:]" |
# regexp "1,2" into 1.2
# http://www.funtoo.org/Sed_by_Example,_Part_2
sed 's/\"\([−]\?[0-9]*\),\([0-9]*\)\"/./g' > out.csv

更新

正如 Sam 所说,api 是更好的解决方案。现在有关于地址的很棒的文档:

https://developers.google.com/sheets/quickstart/php

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

您今天可以使用驱动器 API 执行此操作 -- 请参阅 https://developers.google.com/drive/v3/web/manage-downloads#downloading_google_documents,但是这会将您限制为文档的第一个 sheet。表格 API 目前不支持导出为 CSV,但将来可能会提供。

如果您不方便访问或不熟悉 PHP,这里有一个非常准系统 Google Apps 脚本 Web 应用程序,一旦部署并接受调用者权限,应该允许具有适当范围的访问令牌或 api 密钥将现有的 Google Sheet 导出到 csv 文件。它采用 Google Sheets spreadsheet id 和 sheet 名称(以及可选的下载文件名)作为查询参数,并且 returns 相应的理论上符合 RFC 4180 CSV 文件。

有关将 Apps 脚本项目部署为 Web 应用程序的更多说明,请参见此处:https://developers.google.com/apps-script/guides/web#deploying_a_script_as_a_web_app

您只需访问 "Current web app URL"(当您从脚本编辑器发布为 Web 应用程序时所提供的),然后接受同意屏幕,甚至只是接受同意,即可在浏览器中轻松部署和测试它访问我在示例 URL 中部署的那个(配置为作为访问用户执行,并且 unverified/scary 同意)。

棘手的部分(像往常一样)是设置 OAuth 令牌或 API 密钥,但是如果您已经在调用 Google Sheets V4 API,您可能已经拨入了。我使用 CURL 来确保它的行为与 REST api 相同,但我用来获取 OAuth 令牌的技术既有分散注意力,坦率地说,包括在这里有点可怕,因为它真的很容易搞砸。如果您还没有办法获得一个,那么在任何情况下,这可能都是一个单独的 SO 问题的好话题。

一个相关的(也是重要的!)警告:我不是 100% 确定同意和验证如何与纯 Rest 客户端交互(即,如果您不先在浏览器中访问它,它是如何工作的...... .), and/or 此脚本是否需要与使用 Sheets API 的其他代码位于同一个 GCP 项目中。如果有兴趣,and/or 它不是开箱即用的,请告诉我,我会很乐意深入挖掘并跟进。

// 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 为您提供每个 sheet 的 Google 价差 sheet 的 CSV。 sheet 必须可供 public 访问,任何拥有 link(未列出)的人都可以访问。

您需要提供的参数是:

  • sheet ID(就是 Google Spreadsheet https://docs.google.com/spreadsheets/d/{{ID}}/edit 的 URL 中的 ID)
  • sheet 名称(即用户给出的 sheet 的简单名称)
https://docs.google.com/spreadsheets/d/{{ID}}/gviz/tq?tqx=out:csv&sheet={{sheet_name}}

有了它 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)