2011年10月31日月曜日

.NETからGoogleドキュメントAPIを使ってみる

.NETプログラムからGoogleドキュメントにアクセスするライブラリを使ってみました。
Google CodeからGoogle Data API Setupをダウンロードしてインストールします。



開発環境から.NETのプロジェクトを作成し、
(インストールパス)\Google\Google Data API SDK\RedistにあるマネージDLLを参照に追加します。

今回はとりあえず以下のDLLを使ってみます。
Google.GData.Client
Google.GData.Documents
Google.GData.Spreadsheets

以下はスプレッドシートを開くコードです。
# "Spread sheet Title"が開くドキュメント名です。


Dim ssrv As New SpreadsheetsService("hoge-service")
Dim sq As New SpreadsheetQuery()

ssrv.setUserCredentials(mUserName, mPassword)

sq.Title = "Spread sheet Title" ' 検索対象のスプレッドシート名

Dim feed As SpreadsheetFeed = ssrv.Query(sq)

If 0 < feed.Entries.Count Then
     Dim ss As SpreadsheetEntry = CType(feed.Entries(0), SpreadsheetEntry)

End If


これでスプレッドシートへの参照が取得できました。
次にシートの中のセルを更新してみます。

Protected Overrides Sub UpdateSheet( _
    ByVal srv As SpreadsheetsService, _
ByVal ss As SpreadsheetEntry)

Dim sq As New SpreadsheetQuery()

If ss.Worksheets.Entries.Count = 0 Then Return

Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)

' ワークシート上から範囲にあるセルの集合を取得します
Dim cq As New CellQuery(ws.CellFeedLink)
cq.Range = "A1:C3" ' セル範囲
cq.ReturnEmpty = ReturnEmptyCells.yes ' 空のセルも列挙する

Dim ce As CellFeed = srv.Query(cq)

For i As Integer = 0 To ce.Entries.Count - 1
Dim cell As CellEntry = CType(ce.Entries(i), CellEntry)

' セルの値を表示
If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)

    End If

' 値を変更して更新
cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.Update()
Next

End Sub



上記コードはセルごとにUpdateしています。
Updateメソッドで毎回POST送信するため、いくつものセルを一括更新するには向きません。
そのような場合にはバッチ更新を使います。

Protected Overrides Sub UpdateSheet( _
ByVal srv As SpreadsheetsService, _
ByVal ss As SpreadsheetEntry)

Dim sq As New SpreadsheetQuery()

If ss.Worksheets.Entries.Count = 0 Then Return

Dim ws As WorksheetEntry = CType(ss.Worksheets.Entries(0), WorksheetEntry)
        Dim cq As New CellQuery(ws.CellFeedLink)

cq.Range = "A1:C3"
cq.ReturnEmpty = ReturnEmptyCells.yes

Dim ce As CellFeed = srv.Query(cq)

' 更新バッチ作成

Dim updateCells As CellFeed = ws.QueryCellFeed()
Dim batch As New GDataBatchEntryData(GDataBatchOperationType.update)
Dim batchFeed As AtomFeed = New AtomFeed(updateCells)

For Each cell As CellEntry In ce.Entries

If cell.Value IsNot Nothing Then
MsgBox(cell.Value.ToString)
End If

cell.InputValue = "セル(" & cell.Column.ToString & "," & cell.Row.ToString & ")"
cell.BatchData = batch

batchFeed.Entries.Add(cell)

Next


' バッチ実行
Dim rseult As CellFeed = CType(srv.Batch(batchFeed, New Uri(updateCells.Batch)), CellFeed)

For Each entry As CellEntry In rseult.Entries
If entry.BatchData.Status.Code <> 200 Then
Throw New Exception("Cell update for " + entry.BatchData.Id + " failed!")
    End If
Next

End Sub



開発ガイド(Developer's Guide: .NET)
Javaなど各言語ごとにガイドが用意されています。

0 件のコメント:

コメントを投稿