web-dev-qa-db-ja.com

Google Drive APIを使用してスプレッドシートをCSV形式でダウンロードする

これが明らかな質問である場合、申し訳ありませんが、私はまだAPIを初めて使用します。 pythonドライブAPIライブラリを使用し、Googleスプレッドシートをcsvとしてダウンロードしようとしています。
files.getを使用すると、downloadUrlがなく、エクスポートリンクフィールドに「text/csv」キーがないファイルが吐き出されます。
それが不可能な場合、回避策を見つけることができますが、手動で行うことができるので、それが望んでいます(file-> download_as-> csv)

GoogleドキュメントリストAPIを使用する必要がありますか?

ありがとう、マット

46
user1546842

更新:スプレッドシートv4 APIで動作する 別の回答 を投稿しました。

古い回答:

Alainからの答えは正しいですが、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でgidを確認できます。したがって、ワークシート情報が一定である場合は、そこから取得できます。 http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=181 および http:// code。その問題の詳細については、google.com/a/google.com/p/apps-api-issues/issues/detail?id = 324 をご覧ください。

45
Peter Haight

ExportLinksコレクションは、スプレッドシートの最初のワークシートのみをエクスポートするため、CSV形式を公開しません。最初のワークシートをCSVとして取得することが目的の動作である場合、リンクを手動で作成し、?exportFormat=クエリパラメータ?exportFormat=csv

10
Alain

以下は、私にとって有効なAlainの提案の実装です。

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

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

(2016年7月)この質問は正確に表現されていますが、本質的には別のスレッドの複製です( Pythonを使用してGoogleドキュメントからスプレッドシートをダウンロードする )。以下のthisの質問に対する以前の回答の一部はまだ機能する可能性がありますが(回答はPythonではなくJS/Appsスクリプトにあります)、新しい Drive APIバージョン(v3) および新しい Sheets APIバージョン(v4) 両方の以前のバージョンは非推奨ではありませんが、それらをわずかに時代遅れにします(まだ)。最新のGoogle APIアクセスは、主に Google APIクライアントライブラリ を含むAPIキーまたはOAuth2承認を使用して発生します。これには Pythonの場合 が含まれます。

OPで要求されたタスクを実行するには、ダウンロードする特定のシートを照会してから、Drive APIで実際のエクスポートを実行します。これは一般的な操作である可能性が高いため、これを行うコードスニペットを共有する blogpost を作成しました。さらにエクスポートを進めたい場合は、別の posts のペアと、GoogleドライブへのファイルのアップロードとGoogleドライブからのファイルのダウンロードの方法を説明したビデオがあります。

Google Sheets API もありますが、主にスプレッドシート指向の操作、つまりデータの挿入、スプレッドシートの行の読み取り、セルの書式設定、グラフの作成、ピボットテーブルの追加などのためのものであり、ファイルではありませんドライブAPIが使用するのに適したものである場合のエクスポートなどのベースのリクエスト。

4
wescpy

他の多くの人が指摘しているように、私の最初の答えはやや時代遅れです。そこで、Google Spreadsheets API v4向けに更新された私の回答を以下に示します。現在、GIDを取得する方法がありますが、ドライブ files.export APIは使用できません(スプレッドシートの最初のワークシートのみをエクスポートするためです(gidを指定した場合でも)。

すべてのワークシートをCSVファイルとしてエクスポートするには、 spreadsheets.get API を使用してエクスポートするワークシートのGIDを取得する必要があります。そのAPI呼び出しは、各ワークシートを含むスプレッドシートに関する一連の情報を返します。各ワークシートのproperties.sheetIdプロパティからgidを取得できます。

それができたら、File-> Download As-> CSVを選択したときにSheetsが使用するのと同じURLを作成するだけです。 Spreadsheets.getからdata.spreadsheetUrl値を取得し、/edit/exportに置き換えてから、パラメーターとしてgidを追加できます。また、リクエストのHTTPヘッダーにAuthorization Bearer <auth token>を含める必要があります。

指定されたIDを持つスプレッドシートのすべてのシートをダウンロードするクイックスタートの例に基づいたpythonスクリプトです。<spreadsheet id>をアクセスできるスプレッドシートの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)
4
Peter Haight

OPが必要なものかどうかはわかりませんが、新しいGoogleスプレッドシートバージョンでは、スプレッドシートのcsvバージョンをホットリンクするのが少し難しくなったようです。

スプレッドシート内のすべてのシートを個々のcsvファイルにエクスポートする(各ファイルを個別にダウンロードするのではなく)Googleアプリスクリプトに興味がある場合は、次のとおりです。

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's 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);
  }
}

:このスクリプトは、Google Appsアカウントでのみ使用可能なDocsList.createFile()メソッドを使用します。

さらに説明が必要な場合は、ここにアクセスしてください: http://drzon.net/export-all-google-sheets-to-csv/

4
Michael

2015年4月現在、DocsListは減価償却され、DriveAppに置き換えられています。 DriveAppメソッドの多くはDocsListと同じです。そのため、多くの場合、DocsListをDriveAppに置き換えるだけです。 DocsList.createFile()をDriveApp.createFile()に置き換えてください

私のコードでDocsListをDriveAppに更新する方法

3
user3000439