Google SpreadSheetからSQLiteに出力する
お手軽にiPhone上からデータをいじれた上で、アプリ向けにそのデータを配信する方法はないかと模索したところ、この組み合わせになった。
最初はSQLiteにDBIで出力を考えたけど、モダンにDBIx::Classを使うことにした。
use strict; use warnings; use lib 'lib'; use SLDB::Schema; use Net::Google::Spreadsheets; use Data::Dumper; my $Schema = SLDB::Schema->connect("dbi:SQLite:dbname=db/xxx.sqlite","",""); my $GoogleService = Net::Google::Spreadsheets->new( username => 'username', password => 'password', ); my $WorkSheet = $GoogleService->spreadsheet({ title => 'title' })->worksheet({title => 'Sheet1'}); my $Row_Count = 2; my $Max_Row_Count = $WorkSheet->cell({ col => 3, row => 2 })->content; my $Col_Count = 1; if($Max_Row_Count > 0){ for (my $DelCount = 1;$DelCount < $Max_Row_Count + 1;$DelCount ++){ my $Dictionary = $Schema->resultset('Dictionary')->search({ id => { like => $DelCount }, })->delete; } } for (my $AddCount = 3;$AddCount < $Max_Row_Count + 3;$AddCount ++){ $Schema->resultset('Dictionary')->create({ id => $WorkSheet->cell({ col => 1, row => $AddCount })->content, word => $WorkSheet->cell({ col => 2, row => $AddCount })->content, desc => $WorkSheet->cell({ col => 3, row => $AddCount })->content, }); }
やってることは至極単純。初期化処理がまずいやりかたなので書き直す必要あるけど、SpreadSheet上の総行数を収めたセルを参照して、その行数分だけSQLiteに出力の繰り返し。タイトル列を変更しない前提なため、SpreadSheet上にはデータ列のみ参照にいってる。
SpreadSheetの1行目が夫々の列タイトルだと言う事を忘れてて、rowを1から指定して何度もエラーでてた。
Net::Google::Spreadsheetsの面白いところは、ブラウザで該当シートを開いたまま実行してもそのまま反映されるところ。簡易バックアップにも使えそうでイイ。