web-dev-qa-db-ja.com

Pythonを使用してGoogleドキュメントからスプレッドシートをダウンロードします

キーとワークシートID(gid)を指定してPython Googleドキュメントスプレッドシートをダウンロードする方法の例を作成できますか?できません。

APIのバージョン1、2、3を調べました。私は運が悪く、コンパイルされたATOMのようなフィードAPIを理解できません。_gdata.docs.service.DocsService._DownloadFile_プライベートメソッドは私が無許可であり、Googleログイン認証システム全体を書きたくないと言っています私自身。欲求不満で顔を刺そうとしています。

いくつかのスプレッドシートがあり、次のようにしてアクセスしたいと思います。

_username = '[email protected]'
password = getpass.getpass()

def get_spreadsheet(key, gid=0):
    ... (help!) ...

for row in get_spreadsheet('5a3c7f7dcee4b4f'):
    cell1, cell2, cell3 = row
    ...
_

私の顔を保存してください。


更新1:以下を試しましたが、Download()またはExport()の組み合わせが機能しないようです。 (DocsServiceのドキュメント ここ

_import gdata.docs.service
import getpass
import os
import tempfile
import csv

def get_csv(file_path):
  return csv.reader(file(file_path).readlines())

def get_spreadsheet(key, gid=0):
  Gd_client = gdata.docs.service.DocsService()
  Gd_client.email = '[email protected]'
  Gd_client.password = getpass.getpass()
  Gd_client.ssl = False
  Gd_client.source = "My Fancy Spreadsheet Downloader"
  Gd_client.ProgrammaticLogin()

  file_path = tempfile.mktemp(suffix='.csv')
  uri = 'http://docs.google.com/feeds/documents/private/full/%s' % key
  try:
    entry = Gd_client.GetDocumentListEntry(uri)

    # XXXX - The following dies with RequestError "Unauthorized"
    Gd_client.Download(entry, file_path)

    return get_csv(file_path)
  finally:
    try:
      os.remove(file_path)
    except OSError:
      pass
_
34
a paid nerd

誰かがクイックフィックスを探してこれに遭遇した場合、ここに 別の(現在)機能しているソリューション があります。これはgdataクライアントライブラリに依存していません:

#!/usr/bin/python

import re, urllib, urllib2

class Spreadsheet(object):
    def __init__(self, key):
        super(Spreadsheet, self).__init__()
        self.key = key

class Client(object):
    def __init__(self, email, password):
        super(Client, self).__init__()
        self.email = email
        self.password = password

    def _get_auth_token(self, email, password, source, service):
        url = "https://www.google.com/accounts/ClientLogin"
        params = {
            "Email": email, "Passwd": password,
            "service": service,
            "accountType": "HOSTED_OR_GOOGLE",
            "source": source
        }
        req = urllib2.Request(url, urllib.urlencode(params))
        return re.findall(r"Auth=(.*)", urllib2.urlopen(req).read())[0]

    def get_auth_token(self):
        source = type(self).__name__
        return self._get_auth_token(self.email, self.password, source, service="wise")

    def download(self, spreadsheet, gid=0, format="csv"):
        url_format = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=%s&exportFormat=%s&gid=%i"
        headers = {
            "Authorization": "GoogleLogin auth=" + self.get_auth_token(),
            "GData-Version": "3.0"
        }
        req = urllib2.Request(url_format % (spreadsheet.key, format, gid), headers=headers)
        return urllib2.urlopen(req)

if __name__ == "__main__":
    import getpass
    import csv

    email = "" # (your email here)
    password = getpass.getpass()
    spreadsheet_id = "" # (spreadsheet id here)

    # Create client and spreadsheet objects
    gs = Client(email, password)
    ss = Spreadsheet(spreadsheet_id)

    # Request a file-like object containing the spreadsheet's contents
    csv_file = gs.download(ss)

    # Parse as CSV and print the rows
    for row in csv.reader(csv_file):
        print ", ".join(row)
19

https://github.com/burnash/gspread ライブラリは、gdataライブラリを示唆する以前の回答よりも、Googleスプレッドシートを操作するための新しい、より簡単な方法です低すぎるだけでなく、過度に複雑です。

また、サービスアカウントキーを作成して(JSON形式で)ダウンロードする必要があります。 https://console.developers.google.com/apis/credentials/serviceaccountkey

これを使用する方法の例を次に示します。

import csv
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)

docid = "0zjVQXjJixf-SdGpLKnJtcmQhNjVUTk1hNTRpc0x5b9c"

client = gspread.authorize(credentials)
spreadsheet = client.open_by_key(docid)
for i, worksheet in enumerate(spreadsheet.worksheets()):
    filename = docid + '-worksheet' + str(i) + '.csv'
    with open(filename, 'wb') as f:
        writer = csv.writer(f)
        writer.writerows(worksheet.get_all_values())
33
aculich

ドキュメントの Exporting Spreadsheets セクションで説明されているAuthSubメソッドを使用してみてください。

スプレッドシートサービス用に別のログイントークンを取得し、エクスポート用に置き換えます。これをget_spreadsheetコードに追加するとうまくいきました:

import gdata.spreadsheet.service

def get_spreadsheet(key, gid=0):
    # ...
    spreadsheets_client = gdata.spreadsheet.service.SpreadsheetsService()
    spreadsheets_client.email = Gd_client.email
    spreadsheets_client.password = Gd_client.password
    spreadsheets_client.source = "My Fancy Spreadsheet Downloader"
    spreadsheets_client.ProgrammaticLogin()

    # ...
    entry = Gd_client.GetDocumentListEntry(uri)
    docs_auth_token = Gd_client.GetClientLoginToken()
    Gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())
    Gd_client.Export(entry, file_path)
    Gd_client.SetClientLoginToken(docs_auth_token) # reset the DocList auth token

ExportはPDFファイルのみを提供するようであるので、私はDownloadも使用したことに注意してください。

18
tcarobruce

(2016年7月)現在の用語で言い換える: " GoogleからCSVまたはXLSX形式のGoogleシートをダウンロードするにはDrivePython ?を使用して」 (現在、Googleドキュメントは、Googleスプレッドシートへのアクセスを提供しないクラウドベースのワープロ/テキストエディタのみを指します。)

まず、他のすべての回答は、古い GData ( " Google Data")プロトコルClientLogin を使用しているため、かなり古くなっているか、古くなります。 、または AuthSub 。これらはすべて廃止されています。同じことが、Google Sheets API v3以前を使用するすべてのコードまたはライブラリにも当てはまります。

最新のGoogle APIアクセスは、主に Google APIs Client Libraries を含むAPIキー(公開データ)またはOAuth2認証(承認済みデータ)を使用して行われ、 Python用のもの を含みます。 (そして、いいえ、APIにアクセスするためだけに認証システム全体を構築する必要はありません...以下のブログ投稿を参照してください。)

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

新しい Google Sheets API v4 もありますが、これは主に spreadsheet-oriented operations 、つまり、データの挿入、スプレッドシートの行の読み取り、セルの書式設定のためのものです。 、グラフの作成、ピボットテーブルの追加など、ファイルベースのリクエストではなく、Drive APIが使用する適切な場所でのエクスポート。

ドライブからGoogleスプレッドシートをCSVとしてエクスポートする例を確認するには、 this blog post を確認してください。 PythonでのGoogleスプレッドシートの使用の詳細については、同様の質問について この回答を書いた を参照してください。 XLSXやその他の ドライブでサポートされている形式 でシートをダウンロードすることもできます。

Google APIを完全に初めて使用する場合は、さらに一歩戻ってこれらのビデオを最初に確認する必要があります。

すでにG Suite APIの経験があり、両方のAPIの使用に関するビデオをもっと見たい場合:

4
wescpy

これはgdata 2.0.1.4以降は機能しません。

Gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())

代わりに、次のことを行う必要があります。

Gd_client.SetClientLoginToken(gdata.gauth.ClientLoginToken(spreadsheets_client.GetClientLoginToken()))
3
KPax

次のコードは私の場合に機能します(Ubuntu 10.4、python 2.6.5 gdata 2.0.14)

import gdata.docs.service
import gdata.spreadsheet.service
Gd_client = gdata.docs.service.DocsService()
Gd_client.ClientLogin(email,password)
spreadsheets_client = gdata.spreadsheet.service.SpreadsheetsService()
spreadsheets_client.ClientLogin(email,password)
#...
file_path = file_path.strip()+".xls"
docs_token = Gd_client.auth_token
Gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())
Gd_client.Export(entry, file_path)  
Gd_client.auth_token = docs_token
2
grin

(12月16日)私が書いた別のライブラリを試してください: pygsheets 。 gspreadに似ていますが、google api v4を使用します。スプレッドシートをエクスポートするためのexportメソッドがあります。

import pygsheets

gc = pygsheets.authorize()

# Open spreadsheet and then workseet
sh = gc.open('my new ssheet')
wks = sh.sheet1

#export as csv
wks.export(pygsheets.ExportType.CSV)
2
Nithin

不要なオブジェクトの方向を削除することで、@ Cameronの答えをさらに簡略化しました。これにより、コードが小さくなり、理解しやすくなります。また、URLを編集しました。

#!/usr/bin/python
import re, urllib, urllib2

def get_auth_token(email, password):
    url = "https://www.google.com/accounts/ClientLogin"
    params = {
        "Email": email, "Passwd": password,
        "service": 'wise',
        "accountType": "HOSTED_OR_GOOGLE",
        "source": 'Client'
    }
    req = urllib2.Request(url, urllib.urlencode(params))
    return re.findall(r"Auth=(.*)", urllib2.urlopen(req).read())[0]

def download(spreadsheet, worksheet, email, password, format="csv"):
    url_format = 'https://docs.google.com/spreadsheets/d/%s/export?exportFormat=%s#gid=%s'

    headers = {
        "Authorization": "GoogleLogin auth=" + get_auth_token(email, password),
        "GData-Version": "3.0"
    }
    req = urllib2.Request(url_format % (spreadsheet, format, worksheet), headers=headers)
    return urllib2.urlopen(req)


if __name__ == "__main__":
    import getpass
    import csv

    spreadsheet_id = ""             # (spreadsheet id here)
    worksheet_id = ''               # (gid here)
    email = ""                      # (your email here)
    password = getpass.getpass()

    # Request a file-like object containing the spreadsheet's contents
    csv_file = download(spreadsheet_id, worksheet_id, email, password)

    # Parse as CSV and print the rows
    for row in csv.reader(csv_file):
        print ", ".join(row)

私はこれを使用しています:シート上のcurl ' https://docs.google.com/spreadsheets/d/1-lqLuYJyHAKix-T8NR8wV8ZUUbVOJrZTysccid2-ycs/gviz/tq?tqx=out:csv 'シートこれは一般公開されます。

したがって、パブリックシートで作業できる場合は、python curlのバージョンが必要です。

表示したくないタブがあるシートがある場合は、新しいシートを作成し、パブリッシュする範囲をそのタブにインポートします。

1

Gspreadは確かに、GoogleCLとGdata(どちらも使用しており、ありがたいことにGspreadのおかげで段階的に廃止されました)よりも大幅に改善されています。このコードは、シートのコンテンツを取得するための以前の回答よりもさらに速いと思います。

username = '[email protected]'
password = 'sdfsdfsadfsdw'
sheetname = "Sheety Sheet"

client = gspread.login(username, password)
spreadsheet = client.open(sheetname)

worksheet = spreadsheet.sheet1
contents = []
for rows in worksheet.get_all_values():
    contents.append(rows)
0
DeltaG

これは完全な答えではありませんが、 Andreas Kahler は、Googleドキュメント+ Google App Engline + Pythonを使用した興味深いCMSソリューションを作成しました。この分野での経験がないので、コードのどの部分が役立つか正確にはわかりませんが、チェックしてください。私はそれがGoogleドキュメントアカウントと連動してファイルを操作することを知っているので、あなたは何が起こっているのか理解できると思います。それは少なくともあなたを正しい方向に向けるべきです。

Google AppEngine + Google Docs + Some Python = Simple CMS

0
nearlymonolith

(2019年3月、Python 3)私のデータは通常機密ではなく、CSVに似た通常のテーブル形式を使用します。

このような場合、シートを単純に_publish to the web_して、サーバーでCSVファイルとして使用できます。

File-> _Publish to the web ..._-> _Sheet 1_-> Comma separated values (.csv)-> Publishを使用して公開します)。

_import csv
import io
import requests

url = "https://docs.google.com/spreadsheets/d/e/<GOOGLE_ID>/pub?gid=0&single=true&output=csv"  # you can get the whole link in the 'Publish to the web' dialog
r = requests.get(url)
r.encoding = 'utf-8'
csvio = io.StringIO(r.text, newline="")
data = []
for row in csv.DictReader(csvio):
    data.append(row)
_
0
Michal Skop