- 以下のような JSON 情報が記録されたオブジェクトがある
- 以下のようなスクリプトを書いて突っ込む
- 実行
- メモ
— Google Drive API の認証設定
— gspread
— gspread でデータを挿入 - 以上
— 後は…
— メモでした
以下のような JSON 情報が記録されたオブジェクトがある
{ "name": "山田太郎", "mail": "yamada@example.com", "comment": "お疲れさまです", "sex": "男", "fuman": "感じる", "hawks": "優勝する", "date": "2017/2/5 16:46:48" }
そして、そのオブジェクトが以下のように複数個 ${_S3_BUCKET_NAME}/data/201702/${unixtime}.txt というパスに保存されているとします。
$ aws --profile ${_PROFILE} s3 ls s3://${_S3_BUCKET_NAME}/data/201702/ 2017-02-05 15:36:20 148 1486276579239.txt 2017-02-05 16:04:42 148 1486278280803.txt 2017-02-05 16:24:37 168 1486279476153.txt 2017-02-05 16:26:15 168 1486279574347.txt 2017-02-05 16:31:04 145 1486279862898.txt 2017-02-05 16:33:16 146 1486279994983.txt 2017-02-05 16:43:53 148 1486280632615.txt 2017-02-05 16:44:07 148 1486280645908.txt 2017-02-05 16:45:24 148 1486280722595.txt 2017-02-05 16:46:50 148 1486280808743.txt 2017-02-05 16:47:27 148 1486280844808.txt 2017-02-05 16:47:34 148 1486280852756.txt
なんかのアンケートのデータだと思って下さい。
以下のようなスクリプトを書いて突っ込む
Google Drive API を利用して以下のようなスクリプトを書いてみました。
# -*- coding: utf-8 -*- from boto3 import Session import gspread from oauth2client.service_account import ServiceAccountCredentials import json S3_BUCKET_NAME = 'バケット名' S3_PREFIX = 'オブジェクトへのプレフィックス' SP_CREDNTIAL_FILE = 'OAuth 認証情報 JSON ファイル' SP_SCOPE = 'https://spreadsheets.google.com/feeds' SP_SHEET_KEY = 'スプレットシートの ID' SP_SHEET = 'スプレッドシートの名前' # オブジェクト一覧を取得 s3 = Session().resource('s3') bucket = s3.Bucket(S3_BUCKET_NAME) keys = [obj.key for obj in bucket.objects.all() if obj.key.startswith(S3_PREFIX)] # スプレッドシートへの挿入準備(認証) scope = [SP_SCOPE] credentials = ServiceAccountCredentials.from_json_keyfile_name(SP_CREDNTIAL_FILE, scope) client = gspread.authorize(credentials) sp = client.open_by_key(SP_SHEET_KEY) wks = sp.worksheet(SP_SHEET) # records = wks.get_all_values() # last_row = len(records) # スプレッドシートに挿入する headers = ['name', 'mail', 'comment', 'sex', 'fuman', 'hawks', 'date'] for key in keys: obj = s3.Object(S3_BUCKET_NAME, key) response = obj.get() body = response['Body'].read() data = json.loads(body) # データの生成 column = [] for header in headers: column.append(data[header]) # データの挿入 wks.append_row(column)
実行
以下のように実行します。
$ python script.py
以下のように突っ込まれました。
めでたし、めでたし。
メモ
Google Drive API の認証設定
以下の記事を参考にさせて頂きました。
qiita.com
有難うございます。
上記の記事に倣いつつ、以下のように実施しました。
1.https://console.developers.google.com/project にアクセス
2.[プロジェクト作成] にてプロジェクトを作成
3.作成したプロジェクトの API Manager から [Drive API] をクリック
4.Google Drive API にて [有効にする] をクリック
5.API Manager のメニューから [認証情報] をクリック
6.[サービス アカウント] プルダウンより [新しいサービスアカウント] をクリック
7.[サービス アカウント名] に任意の名前を入力
8.[役割] にて [Project] の [編集者] をクリック
9.[キーのタイプ] は [JSON] を選択
10.最後に [作成] ボタンをクリック
[作成] ボタンをクリックすると、以下のような JSON ファイルがダウンロードされる。
{ "type": "service_account", "project_id": "oreno-project-xxxxxxxxxxx", "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n", "client_email": "oreno-project@oreno-project-xxxxxxxxxxx.iam.gserviceaccount.com", "client_id": "123456789012345789", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/oreno-project%40oreno-project-xxxxxxxxxxx.iam.gserviceaccount.com" }
あとは、API 経由でアクセスしたいスプレッドシートの共有先に client_email に記載されているメールアドレス(上記の例だと oreno-project@oreno-project-xxxxxxxxxxx.iam.gserviceaccount.com になる)を追加するだけ(権限は編集者権限を付与した。)
gspread
Google SparedSheet にアクセスする為、以下の gspread というモジュールを利用しました。
github.com
以下のように書いています。
SP_CREDNTIAL_FILE = 'OAuth 認証情報 JSON ファイル(ダウンロードした JSON ファイル)' SP_SCOPE = 'https://spreadsheets.google.com/feeds' SP_SHEET_KEY = 'スプレットシートの ID' SP_SHEET = 'スプレッドシートの名前' (略) # スプレッドシートへの挿入準備(認証) scope = [SP_SCOPE] credentials = ServiceAccountCredentials.from_json_keyfile_name(SP_CREDNTIAL_FILE, scope) client = gspread.authorize(credentials) sp = client.open_by_key(SP_SHEET_KEY) wks = sp.worksheet(SP_SHEET)
gspread でデータを挿入
データが記録されている最終行の次の行にデータを突っ込む必要があるんだけど、そのあたりは gspread がよしなに頑張ってくれて、以下のように書くだけでちゃんと最終行にデータを挿入してくれます。
wks.append_row(column)
有難うございます、嬉しいです。
以上
後は…
- Google SpreadSheet に挿入済みのデータをどうするかを考える必要がある
- なんか遅い
メモでした
メモでした。