以下のような 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 の認証設定

以下の記事を参考にさせて頂きました。

# 背景Google APIの利用について、GoogleのユーザーIDとパスワードでのアクセスが2015年5月に禁止された。現在はOAuth2.0を利用してアクセスしなければならない。PythonからOAuth2.0での認証に関...

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 というモジュールを利用しました。

gspread - Google Spreadsheets Python API

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 に挿入済みのデータをどうするかを考える必要がある
  • なんか遅い

メモでした

メモでした。

元記事はこちら

Python で JSON データを Google SpreadSheet に突っ込むメモ