Подтвердить что ты не робот

Использование API-интерфейса Google для загрузки электронной таблицы в формате csv

Извините, если это очевидный вопрос, я все еще довольно новичок в API. Я использую api-библиотеку python drive и пытаюсь загрузить таблицу Google как csv.
Когда я использовал files.get, он выплюнул файл без downloadUrl и без ключа "text/csv" в поле ссылок на экспорт.
Если это невозможно, я могу найти обходное решение, но я надеюсь, что это возможно, так как это можно сделать вручную (file- > download_as- > csv)

Нужно ли использовать список документов Google api?

спасибо, Matt

4b9b3361

Ответ 1

Обновление: я опубликовал еще один ответ, который работает с API Spreadsheets v4.

Старый ответ:

Ответ Алена верный, но вам также нужно установить параметр 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 в вашем браузере, поэтому, если информация на вашем рабочем столе постоянна, вы можете просто получить ее оттуда. См. 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-проблемы/проблемы/подробно? id = 3240 для получения дополнительной информации об этой проблеме.

Ответ 2

Коллекция exportLinks не предоставляет формат CSV, так как это будет экспортировать только первый лист электронной таблицы. Если получение первого листа в качестве CSV - это поведение, которое вы ищете, вы можете создать ссылку вручную и установить параметр запроса ?exportFormat= на ?exportFormat=csv.

Ответ 3

Вот реализация предложения Алена, который работает для меня:

downloadUrl = entry.get('exportLinks')['application/pdf']
# Strip "=pdf" and replace with "=csv"
downloadUrl = downloadUrl[:-4] + "=csv"

resp, content = drive_service._http.request(downloadUrl)

Ответ 4

Не уверен, что это нужно OP, но в новой версии Google Таблиц кажется, что немного упростить ссылку на версию csv вашей таблицы.

Если вы заинтересованы в приложениях Google script, которые будут экспортировать все листы в электронную таблицу в отдельные файлы 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 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);
  }
}

Примечание. Этот script использует метод DocsList.createFile(), доступный только для аккаунтов Google Apps.

Если вам нужны дополнительные объяснения, перейдите сюда: http://drzon.net/export-all-google-sheets-to-csv/

Ответ 5

Как отмечали многие другие люди, мой первоначальный ответ несколько устарел. Итак, вот мой обновленный ответ для v4 API Google Spreadsheets. Теперь есть способ получить gids, но мы не можем использовать API-интерфейс drive files.export, потому что он экспортирует только первый лист в электронную таблицу (даже если вы задаете gid).

Чтобы экспортировать все рабочие листы в виде CSV файлов, вам необходимо получить gids для рабочих листов, которые вы хотите экспортировать, используя API spreadsheets.get. Этот вызов API возвращает кучу информации о электронной таблице, включая каждую из рабочих таблиц. Вы можете получить gid из свойства properties.sheetId для каждого рабочего листа.

Получив это, вы можете просто создать тот же URL-адрес, который использует Sheets при выборе File-> Загрузить As-> CSV. Вы можете взять значение data.spreadsheetUrl из spreadsheets.get и заменить /edit на /export а затем добавить gid в качестве параметра. Вам также необходимо будет включить Authorization Bearer <auth token> в заголовок HTTP в запросе.

Здесь скрипт Python, основанный на их примере быстрого запуска, который загружает все листы для электронной таблицы с указанным идентификатором. Вам нужно заменить <spreadsheet id> идентификатором таблицы, к которой у вас есть доступ:

import apiclient.discovery
import httplib2
import oauth2client
import re
import requests
import shutil
import urllib.parse

SCOPES = 'https://www.googleapis.com/auth/drive.readonly'
SPREADSHEET_ID = '<spreadsheet id>'

store = oauth2client.file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
  flow = oauth2client.client.flow_from_clientsecrets('client_secret.json', SCOPES)
  creds = oauth2client.tools.run_flow(flow, store)

service = apiclient.discovery.build('sheets', 'v4', http=creds.authorize(httplib2.Http()))

result = service.spreadsheets().get(spreadsheetId = SPREADSHEET_ID).execute()
spreadsheetUrl = result['spreadsheetUrl']
exportUrl = re.sub("\/edit$", '/export', spreadsheetUrl)
headers = {
  'Authorization': 'Bearer ' + creds.access_token,
}
for sheet in result['sheets']:
  params = {
    'format': 'csv',
    'gid': sheet['properties']['sheetId'],
  } 
  queryParams = urllib.parse.urlencode(params)
  url = exportUrl + '?' + queryParams
  response = requests.get(url, headers = headers)
  filePath = '/tmp/foo-%s.csv' % (+ params['gid'])
  with open(filePath, 'wb') as csvFile:
    csvFile.write(response.content)

Ответ 6

Примечание. По состоянию на апрель 2015 года DocsList обесценился и был заменен на DriveApp. Многие из методов DriveApp идентичны DocsList. Таким образом, во многих случаях вы можете просто заменить DocsList на DriveApp. Поэтому замените DocsList.createFile() на DriveApp.createFile()

Как обновить DocsList до DriveApp в моем коде

Ответ 7

(июль 2016) Этот вопрос сформулирован правильно, но по сути является дубликатом другого потока (Загрузка электронной таблицы из Документов Google с использованием Python). Хотя некоторые из предыдущих ответов на этот вопрос ниже могут по-прежнему работать (хотя ответы в JS/Apps Script not Python), новая версия Drive API ( v3) и новая Версия API листов (v4) делают их немного устаревшими, хотя предыдущие версии обоих не были устаревшими (пока). Современный доступ к API Google осуществляется с использованием ключей API или авторизации OAuth2, в первую очередь с клиентскими библиотеками API Google, включая для Python.

Чтобы выполнить задачу, запрошенную в/из OP, вы, возможно, запросите конкретные таблицы для загрузки, а затем выполните фактический экспорт (экспорт) с помощью API-интерфейса Drive. Поскольку это, скорее всего, общая операция, я написал blogpost, используя фрагмент кода, который делает это для вас. Если вы хотите продолжить экспорт, у меня есть еще одна пара posts вместе с видео, в котором описывается, как загружать файлы и скачивать файлы с Google Диска.

Обратите внимание, что существует также API Google Таблиц, но в первую очередь это касается операций с таблицами, то есть вставки данных, чтения строк таблицы, форматирование ячеек, создание диаграмм, добавление сводных таблиц и т.д., а не запросы на основе файлов, такие как экспорт, где API-интерфейс Drive является правильным для использования.