事の発端
ある日、後輩ぽいやつに声を掛けられた。
私には、コミュ力がなかった。
止められなかった。あの発言を...
「せんぱーい。wikipediaの記事タイトルでしりとりしませんか?」
何だそれ。
回答時間は10秒、モバイル端末使用可(ただしオフライン)という鬼畜なしりとりだ。
存在するかは、wikipediaの”https://ja.wikipedia.org/wiki/”
の後ろに回答した文字を入れて、ページを開けたらセーフらしい。
準備時間は30分(オンライン可)。
私は今持つプログラミング能力で、191万ぐらいの記事を用意することにした。
本編
以上茶番(現実)でした。
今回は、かる~くgoogleのスプレッドシートの約191万セルに、短い時間に書き込んだ時の話です。
上の茶番は、90%が現実で、
**「せんぱーい。wikipediaの記事タイトルでしりとりしませんか?」**だけが違いました。
それはさておき、今回私が30分で行ったことは
1.スプレッドシートの機能である、.txtのインポート=>失敗
2.GASでなんとか書き込む=>方法知らない、JSやったことない。諦め。
3.API叩く=>なんとかなった。
です。一個ずつ見ていきましょう。
注意
今回の方法は、多分効率がよくありません。
また、本記事によって起こった損害等は、当方は責任を持ちませんのであしからず。
APIのご利用は計画的に...
環境
windows10 ver1903
7z
python3
下準備
wikipediaでは、クローラは禁止されており、代わりにdumpファイルが有りました。
今回はタイトルのみのやつを落としてきました。約1分
LINK:(https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz)
そしたら、7zで展開し”jawiki-latest-all-titles-in-ns0”ファイルを出し、これの拡張子を.txtにします。
すると、1行一つの記事タイトルの書かれているファイルの出来上がり。
(ここで皆様、お気づきでしょうが、ただしりとりするだけなら、実はこれで事足りていたのです。
しかし、当時の私はポンコツだったため、全く気づいていません。
どうぞ、若干の哀れみの目で御覧ください。)
1.スプレッドシートの機能である、.txtのインポート=>失敗
まず、新しいシートを作成し、
ファイル>インポート>アップロードの順に進みインポート画面を出し以下のように設定しました。
しかし大きすぎたのか、だめと言われました。(ロスタイム約3分)
ちなみにメモ帳だとファイルは正常に開けました。
(なぜエクセルにコピペしなかったのかというと、単純に行が足りませんでした)
2.GASでなんとか書き込む=>方法知らない、JSやったことない。諦め。
これについては、スクリプトエディター開いた瞬間諦めました。
さっぱりです。
勉強します。
(勉強しなさい。ロスタイム約1分)
3.API叩く=>なんとかなった。
絶望状態の私は、pythonで書き込めないか調べました。
すると、書き込めるのではありませんか。
ということで、どんなふうにやっていったか書いていきます。
初期設定(クラウド側)
【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ
様の記事をもとにサクサクやっていきます。
1Google Cloud Platformでプロジェクトを作成
これは画面に従ってササッとできました(30秒)
2.APIの有効化
左上の”三”ボタンから、「APIとサービス」を開き、
「ライブラリ」を選択し、
”Google Drive API”と入力し、有効化、
もう一回同じ操作を、今度は”Google Sheets API”と入力し有効化します。(1分30秒)
3.左上の”三”ボタンから、「APIとサービス」を開き、認証情報を作成します。
今回は”サービスアカウントキー”を選択し、
画面に従い入力していきます。
キーのタイプはJSONで、役割にはproject内の編集者を選択。
秘密鍵(キー)を取得したら、適当に開いて「client_email」の値をコピーします。(2分)
4.シートに書き込ませるために、
書き込むシートの共有設定を開き、ユーザーのところに、
先程のメアド(?)をペーストします。その時権限には、編集者と与えておきましょう。(30秒)
初期設定(Python側)
1.pipでライブラリを入れます。(1分)
pip install gspread
pip install oauth2client
2.記事を参考に適当にコード作成(5分)
import gspread
import json
from time import sleep
# ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from oauth2client.service_account import ServiceAccountCredentials
# 2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
# 認証情報設定
# ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)
credentials = ServiceAccountCredentials.from_json_keyfile_name('./鍵のファイル名', scope)
# OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
# ここから下にスプレッドシートを操作する記述を書くよ
workbook = gc.open_by_key('ワークブックのID')
worksheet = workbook.worksheet('シート名')
data_set=[]
for line in open("text.txt", "r",encoding="utf-8"):
data_set.append(line)
i=1
for x in range(0,19):
start_cell=str(i)
end_cell=str(i+99999)
cell_range="A"+start_cell+":A"+end_cell
cell_list = worksheet.range(cell_range)
for cell in cell_list:
cell.value = data_set[i]
i=i+1
worksheet.update_cells(cell_list)
del cell_list
sleep(1)
print(i)
start_cell=str(i)
end_cell=str(1919643)
cell_range="A"+start_cell+":A"+end_cell
cell_list = worksheet.range(cell_range)
for cell in cell_list:
cell.value = data_set[i]
i=i+1
worksheet.update_cells(cell_list)
print("Finish!")
今回は使い捨てなので適当です
(記事から適当にいる部分貼っつけただけかも)
1~17行目までは認証部分なので、記事からコードを拝借し、適宜改変しました。
ワークブックのIDは
スプレッドシートのURLの*のところです。
https://docs.google.com/spreadsheets/d/***************************/edit#gid=0
シート名は設定したものを自由にどうぞ。
その後、txtファイルの1行ずつ配列に入れる処理があります(23~26行目)
28~40行目で、配列の中身を100000個ずつセルに詰めてAPIで更新しています。
なぜ一気に全部詰めないのかというと、
なぜか詰めれず、エラーになってしまいました。
また10万ずつなのは、
APIの制限に引っかからないようにするためだったりします。
(はじめは1秒1セルでやろうとして22日ぐらいかかりそうだったのでやめました。)
42行目以降は残った中途半端な配列を片付けるコードで終わっています。
とかなり説明を省きましたが、
詳細は【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめを見ていただいたほうがわかりやすいのではないかと思います。
サクッと実行(4分)
ちゃんとできてた
実行結果のシート
結論
この記事で言いたいことは唯一つ。
Googleスプレッドシートなら、大量のデータも短時間で書き込める
ということです。
もちろん制約はありますが、APIなどでかなり楽ができました。
ただ欠点として、オフライン時の機能がしょぼいって言うのは感じました。
それでも、Excelと違ってセルの行数制限があまりないのは普通にありがたかったです。
茶番の結末
私は一つ重大なミスを犯した。
それは...
後輩との対峙のとき、調子に乗ってスマホで参加してしまった。
結果、ファイルがおもすぎて10秒で開くことはできなかった。
Richなファイルほど重いということは確かであった。