Skip to content

Instantly share code, notes, and snippets.

@shikajiro
Created July 3, 2012 17:15
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shikajiro/3041123 to your computer and use it in GitHub Desktop.
Save shikajiro/3041123 to your computer and use it in GitHub Desktop.
Google SpreadsheetをJSONを返すダミーサーバーとして利用する方法
###
GoogleShpreadsheetのシートに記述されたデータをDBのテーブルに見立て取得し、
JSONに変換するスクリプト。
このソースはTitanium Mobileを想定しているが、コンバートの処理は流用できる。
テストに使用しているShpreadsheetは以下
https://docs.google.com/spreadsheet/ccc?key=0AuCUD7G5hGZrdGlBbHBDVElfUXdsbWRkRThVcmdCalE
条件:1行目をカラム名にすること
LEFT JOINなどの処理は別途本気出して実装する必要あり。
サンプルとして、テーブル間をidで連携させたJSONを返している。
@author shikajiro
###
module.exports = ()->
url = "https://spreadsheets.google.com/feeds/cells/%s/%s/public/values?alt=json"
###
ここに利用するspreadsheetのIDを記載する。idはspreadsheetのリンクに表示される文字列。
###
sheetId = "0AuCUD7G5hGZrdGlBbHBDVElfUXdsbWRkRThVcmdCalE"
self = this
convertTable = (spreadsheet)->
# 配列の構造
# records[row][col]
# keys[col]
records = []
keys = []
for entry in spreadsheet.feed.entry
row = parseInt(entry.gs$cell.row)
col = parseInt(entry.gs$cell.col)
if row == 1
key = entry.content.$t
keys[col-1] = key
else
records[row-2] = {} unless records[row-2]
value = entry.content.$t
records[row-2][keys[col-1]] = value
records
# HTTPでspreadsheetにアクセスする
# Titanium依存しているので、プラットフォームに合わせて書き換えてください。
request = (url, callback)->
client = Ti.Network.createHTTPClient
onload:(e)->
table = convertTable JSON.parse this.responseText
Ti.API.info "get table : "+ JSON.stringify(table)
callback table
onerror:(e)->
Ti.API.info e.error
client.open 'GET', url
client.send()
#それぞれのテーブルのJSONを返す。
self.requestGetUser = (callback)->
###
'od6'の部分がシートになる。
1番目のシートはod6だが、それ以降は不定。
ブラウザで一度確認する必要あり。
###
request Json.format(url,sheetId,'od6'), callback
self.requestGetArticle = (callback)->
request Json.format(url,sheetId,'od7'), callback
self.requestGetComment = (callback)->
request Json.format(url,sheetId,'od4'), callback
###
テーブルを複合したJSONを帰す
shreadsheetのapiはLEFT JOINなどはできないので、実装でごまかす。
サンプルとして、テーブル間をidで連携させたJSONを返している。
###
self.requestGetTimeline = (callback)->
self.requestGetArticle (articles)->
self.requestGetComment (comments)->
blogs = []
for article in articles
article.comments = []
article.comments.push c for c in comments when article.id == c.article_id
blogs.push article
callback blogs
self
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment