Я не могу найти ссылку на API, который позволяет клиентам Rest API экспортировать существующий лист Google в файл csv.
https://developers.google.com/sheets/
Я считаю, что должен быть способ их экспортировать.
Я не могу найти ссылку на API, который позволяет клиентам Rest API экспортировать существующий лист Google в файл csv.
https://developers.google.com/sheets/
Я считаю, что должен быть способ их экспортировать.
Вы можете использовать Drive API для этого сегодня - см. https://developers.google.com/drive/v3/web/manage-downloads#downloading_google_documents, однако это ограничит вас первым листом документа. API Таблиц не поддерживает экспорт в формате CSV сегодня, но может предложить его в будущем.
Следующий URL дает вам CSV электронной таблицы 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. Или вставьте его в адресную строку браузера.
Во-первых, вы должны сделать документ доступным для всех. Тогда вы получите 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. Теперь есть отличная документация по адресу:
С примером, который генерирует вывод, имеющий структуру CSV.
$long_id
вместо $ling_id
в последней части вашего первого блока кода?
- person Nikhil VJ; 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)
Если у вас нет простого доступа или знакомства с 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);
}