Как экспортировать CSV из Google Sheet API?

Я не могу найти ссылку на API, который позволяет клиентам Rest API экспортировать существующий лист Google в файл csv.

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

Я считаю, что должен быть способ их экспортировать.


person user1447414    schedule 08.06.2016    source источник


Ответы (5)


Вы можете использовать Drive API для этого сегодня - см. https://developers.google.com/drive/v3/web/manage-downloads#downloading_google_documents, однако это ограничит вас первым листом документа. API Таблиц не поддерживает экспорт в формате CSV сегодня, но может предложить его в будущем.

person Sam Berlin    schedule 08.06.2016

Следующий URL дает вам CSV электронной таблицы Google на лист. Лист должен быть доступен всем, у кого есть ссылка (не в списке).

Вам необходимо указать следующие параметры:

  • идентификатор листа (это просто идентификатор в URL-адресе электронной таблицы Google https://docs.google.com/spreadsheets/d/{{ID}}/edit)
  • имя листа (это просто имя листа, данное пользователем)
https://docs.google.com/spreadsheets/d/{{ID}}/gviz/tq?tqx=out:csv&sheet={{sheet_name}}

С помощью этого URL-адреса вы можете запустить GET-запрос для получения CSV. Или вставьте его в адресную строку браузера.

person Overbryd    schedule 08.04.2020
comment
Удивительный. Я много часов пытался найти эту структуру URL. Это нигде не задокументировано. Большое спасибо за этот ответ. - person Piyush Beli; 09.04.2020
comment
Вот ссылка на более подробный ответ, если кто-то задается вопросом, почему это так: stackoverflow.com/questions/33713084/ - person jean d'arme; 12.02.2021
comment
есть ли способ сделать это с помощью частного листа и аутентификации? - person Andrew; 30.03.2021
comment
@Andrew Этот конкретный API предназначен только для публичных таблиц. Вы можете сделать их общедоступными, но невидимыми для других. Тем не менее, они являются общедоступными, поэтому, как только ссылка будет отключена, данные исчезнут. Определенно не рекомендуется для конфиденциальных данных. - person Overbryd; 31.03.2021

Во-первых, вы должны сделать документ доступным для всех. Тогда вы получите 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
#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

Обновить

Как сказал Сэм, лучше всего подходит api. Теперь есть отличная документация по адресу:

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

С примером, который генерирует вывод, имеющий структуру CSV.

person Daniel    schedule 08.06.2016
comment
Хорошее решение! Дополнительно: вы всегда можете использовать сетевой инспектор в google-chrome (Ctrl + Shift + I, вкладка Network): когда он выполняет запрос на экспорт CSV, мы видим соответствующий URL. Полагаю, вы получаете указанный выше URL таким же образом? ;) - person Alex Medveshchek; 22.06.2017
comment
Это было много лет назад :) Сейчас не помню. - person Daniel; 23.06.2017
comment
я думаю, вы имели в виду $long_id вместо $ling_id в последней части вашего первого блока кода? - person Nikhil VJ; 14.03.2018
comment
Да @nikhilvj. Я исправил это. Спасибо. - person Daniel; 14.03.2018

Никто еще не упомянул 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)
person ScottieB    schedule 04.06.2020

Если у вас нет простого доступа или знакомства с PHP, вот очень простое веб-приложение Google Apps Script, которое после развертывания и принятия разрешения вызывающего абонента должно позволить клиентам с соответствующим токеном доступа или ключом API экспортировать существующий лист Google. в файл csv. Он принимает идентификатор электронной таблицы Google Sheets и имя листа (и необязательное имя файла для загрузки) в качестве параметров запроса и возвращает соответствующий CSV-файл, теоретически совместимый с RFC 4180.

Дополнительные инструкции по развертыванию проекта скрипта приложений в качестве веб-приложения находятся здесь: https://developers.google.com/apps-script/guides/web#deploying_a_script_as_a_web_app.

Вы можете легко развернуть его и протестировать в браузере, просто посетив «Текущий URL-адрес веб-приложения» (как указано при публикации в виде веб-приложения из редактора сценариев) и приняв экран согласия, или даже просто посетив тот, который Я развернул (настроен для выполнения от имени получающего доступ пользователя и непроверенного / пугающего согласия) на примере URL.

Сложная часть (как обычно) - это настроить токен OAuth или ключ API, но если вы уже вызываете API Google Sheets V4, вы, вероятно, уже набрали его. Я использовал CURL, чтобы убедиться, что он работает как REST api, но метод, который я использовал для получения токена OAuth, отвлекает и, честно говоря, немного страшно включать сюда, поскольку это действительно легко испортить. Если у вас еще нет способа получить его, в любом случае это, вероятно, хорошая тема для отдельного вопроса SO.

Одно связанное (и большое!) Предостережение: я не уверен на 100%, как согласие и проверка взаимодействуют с чистым клиентом Rest (то есть как это работает, если вы НЕ заходите сначала в браузер ...), и / или должен ли этот сценарий находиться в том же проекте GCP, что и другой код, использующий API Таблиц. Если есть интерес и / или это не сработает прямо из коробки, пожалуйста, дайте мне знать, и я с радостью копну глубже и свяжусь с вами.

// 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);
}
person Timothy Johns    schedule 01.03.2018