Google Document では多くの API が提供されており、それを用いる事で Google が提供しているサービスへのアクセスを比較的簡易に行う事ができるようになっています。今回は色々理由があったのもあり、スプレッドシートに書かれている値を取得する、というのを行ってみました。
まず Google Document も含めて、Google の各種サービスにアクセスするためには REST API でダイレクトにあれこれするか、多くの言語用に提供されているライブラリを利用するかのどちらかを選択する必要があります。まぁライブラリが用意されているので、REST を利用する必要性は若干薄くなるかと思われますので、ここではライブラリを利用します。
ライブラリは google-gdata というプロジェクトサイトが用意されており、そこからダウンロードできます。この記事を書いている時点では ver 1.9(Google_Data_API_Setup_1.9.0.0.msi) となっていました。ダウンロードしたセットアップを実行すると、ローカル環境にライブラリがインストールされ、アプリケーションから利用する事が可能になります。
新規に適当なプロジェクトを作成しライブラリへの参照設定を行います。
\Program Files\Google\Google Data API Sdk\Redist フォルダに必要となるライブラリが揃っています。この中から必要な物だけ参照設定を行います。今回スプレッドシートを扱うのに必要なライブラリは次の通りです。
- Google.GData.Client
- Google.GData.Extensions
- Google.GData.SPreadsheets
上記 3 ファイルに参照を行います。
さて、今回は Google ドキュメントのスプレッドシートから値を抽出するのですが、サンプルとして昨日行われた CLR/H の申込み一覧を利用しています。受付フォームで登録した内容が、そのままスプレッドシートに反映するので非常に便利なシロモノです。
一部抜粋するとこのような感じで管理しています。今回はこのシートからメールアドレスの値だけ取得してみようと思います。なお、今回のサンプルについてはあらかじめ Imports にて先程の 3 ライブラリを指定してあるものとして、コードを読んでください。
ログイン・認証
まず必要なのはログインというか認証です。ここは複数方法が用意されていますが、今回は簡単なアカウント(メールアドレス)とパスワードによる認証を行ってみます。
1: Dim usr = "kuma@gmail.com" 'アカウント用メールアドレス
2: Dim pas = "turarenaikuma-" 'パスワード
3: Const appName = "Sample Google Document Spreadsheet Search" '何らかのアプリ名
4: Dim ssService As New SpreadsheetsService(appName)
5: Try
6: ssService.setUserCredentials(usr, pas)
7: Catch ex As Exception
8: MessageBox.Show(ex.Message, Me.Title, MessageBoxButton.OK, MessageBoxImage.Error)
9: Return
10: End Try
ログイン・認証のロジックは上記の通りかなりシンプルです。実際にログインを行う箇所は Try ~ Catch にて囲まれている setUserCredentials メソッド呼び出し部分になります。また、そのメソッドが実装されているのは SpreadsheetsService クラスでスプレッドシート関係専用のクラスになっています。以後の処理はここで利用した SpreadsheetsService クラスのインスタンスを経由して行う形になります。
スプレッドシート(ブック)の取得
認証が行われた次は Excel っぽく言うとブックを取得します。Google Document の仕様上、同一名称のスプレッドシートを作成できるとのこと(試していません)なので、注意する点はそのあたりくらいです。
1: 'シート取得
2: Dim ssQuery As New SpreadsheetQuery()
3: Dim ssFeed = ssService.Query(ssQuery)
4:
5: Dim ssSheet = From x In ssFeed.Entries
6: Where x.Title.Text = SHEET_NAME 'シート名を指定
7: Select x
8:
9: Dim ssSpreadSheet = TryCast(ssSheet.FirstOrDefault, SpreadsheetEntry)
10: If ssSpreadSheet Is Nothing Then Return
最初に SpreadsheetQuery クラスのインスタンスを生成していますが、実際に利用する場合はこのクラスを用いて条件指定を行う形になります。上記サンプルでは「全てのスプレッドシート」を取得してきますので、あまり良いものでもありません。変なところにコメントが入っていますが、これは後付けで記述したものですので実際は構文エラーですw
ワークシートの取得
スプレッドシート(ブック)が取得できれば、次は対象となるワークシートを取得します。
1: Dim ssWorksheetFeed = ssSpreadSheet.Links.FindService(GDataSpreadsheetsNameTable.WorksheetRel, Nothing)
2: Dim ssWorksheetQuery As New WorksheetQuery(ssWorksheetFeed.HRef.ToString)
3: Dim ssWorksheetEntry As WorksheetEntry = Nothing
4: For Each ssWs As WorksheetEntry In ssService.Query(ssWorksheetQuery).Entries
5: ssWorksheetEntry = ssWs 'テスト的に最初のシートを取得
6: Exit For
7: Next
8: If ssWorksheetEntry Is Nothing Then Return
先程は SpreadsheetQuery クラスを利用した抽出を行いましたが、今回はワークシートが対象なので WorksheetQuery クラスを利用します。その部分を除けば、行っている内容は先程のスプレッドシートの取得とさほど違いはありません。
セルの検索
シートまで取得できれば後はセルを抽出するのみです。
1: Dim ssCellFeedLink = ssWorksheetEntry.Links.FindService(GDataSpreadsheetsNameTable.CellRel, Nothing)
2: Dim ssCellQuery As New CellQuery(ssCellFeedLink.HRef.ToString)
3: For Each ssCell As CellEntry In ssService.Query(ssCellQuery).Entries
4: If ssCell.Column <> 3 OrElse ssCell.Row = 1 Then Continue For 'アドレス以外や見出しは不要
5: ListView1.Items.Add(New ListViewItem With {.Content = ssCell.Value}) '結果を ListView に表示
6: Next
LINQ を使えばもう少しすっきりしますが、今回はサンプルということで。抽出した結果は CellEntry クラスとして現されます。セルの値は Value プロパティで、行列番号は Row や Column プロパティで参照できます。
このような形でアクセスすることができます。実際に実行した結果は次のようになります。
このようにかなり簡単に Google スプレッドシートにアクセスできます。Google Code ではサンプルソースも公開されており、そのあたりを見ていただければシートの更新や新規作成なども、かなり簡単に行える思います。
個人的には生の google-gdata を使うよりも、google-gdata の上に構築されたライブラリ GDataDB がオススメ。
返信削除上記でご紹介されているコードの大半が隠蔽され、ブック名、シート名などだけ指定することで容易にアクセス可能です。LINQ プロバイダもある模様。
ちなみに、GDataDB はもちろん、google-gdata も、NuGet パッケージが公開されているので、Visual Studio 上などから容易に自分のプロジェクトに追加できるのもうれしいですね。
ただし、GDataDB を NuGet 経由でインストールすると、google-gdata は ver.1.6 がインストールされ、実際に実行すると例外が発生します。同じく NuGet 使って、google-gdata は最新の ver.1.9 に更新しておきましょう。
GDataDB については全然調べれてないのですが、LINQがあるとかさらに容易にアクセス可能とか面白そうですねー!
返信削除ちなみに Nuget は便利だと理解していても VB Express だけでは利用できないので全然触っていませんw
VWD は Nuget 使えるのになぁ・・・