あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Google SpreadSheetからSQLiteに出力する

お手軽にiPhone上からデータをいじれた上で、アプリ向けにそのデータを配信する方法はないかと模索したところ、この組み合わせになった。

最初はSQLiteDBIで出力を考えたけど、モダンに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の面白いところは、ブラウザで該当シートを開いたまま実行してもそのまま反映されるところ。簡易バックアップにも使えそうでイイ。