早在規劃『教育,意義! 』project時,
便有打算將整個網站建立過程撰寫一篇教學,讓有興趣以google 服務為基礎進行開發的朋友參考。
沒想到這個想法擺著就拖了好幾個月,
好在學生提出了問題,就趁這機會寫一寫吧。
基本上『教育,意義! 』網站的架構完全建立在Google提供的服務,
廣義來說也是個雲端的系統,
所有的資料是分散在不同的服務架構下,再用GAE, Javascrript將服務資訊串接起來,
由Blogspot 統一呈現。
省了租主機的費用,或架站的硬體、電費,
最好的地方在於不用管理主機維運的問題,
只要專心做我的創意、嘗鮮就好了!! 多棒!
若將『教育,意義! 』網站依功能層次來分類,可以分為三層結構,
當中的層次與使用技術大致如下:
- UI 介面層
- App應用層
- 服務 : Google App Engine (GAE)
- 技術 : Java, Java Server Page (JSP)
- 資料層
- 服務 : Google Docs (文件), Google Spreadsheet (試算表)
- 技術/函式庫 : Java, Google Data APIs
其他主題將會陸續推出。
若對Google API 與 Google App Engine 初步建置有興趣,
可以參考之前文章:
佛心來著的 Google Data API – for JAVA
雲端的開始:Netbeans 無痛 Google App Engine Java 服務開發
Google Spreadsheet 做為資料庫系統
對於小型的資料系統來說,
採用Google Spreadsheet做為應用程式資料庫(如問卷調查或線上系統) 也算堪用,
目前的儲存限制為 :
- 40 萬個儲存格
- 每張工作表最多 256 欄
而Google Spreadsheet 的資料存取則有許多種做法,
可以透過Google Data API 函式以RSS feed進行存取,亦可以URL方式呈現直接匯入程式。
本文首先介紹如何呈現Spreadsheet資料,
並介紹在使用Google Data API前如何設定 Spread Sheet RSS Feed以供程式讀取。
首先,建立一Spreadsheet 試算表為範例,命名為TestSheet
Spreadsheet的建立方法可以直接進入Google Docs (Google文件)後建立新項目 - 試算表,
建立好的試算表中預設為一個工作表,但為求精確,
範例中建立兩個工作表來介紹其連結方式,其內容如下:
資料顯示部份,以下逐一說明,
首先最重要的是取出Spreadsheet的 key 值做為將來連結指定的標的,
但一如Google 以往的Geek作法,這個key只能從網址上找到,
此外要注意,這個Key是登入帳號後進入該試算表(spreadsheet)的key,
不是設定共用後所提供的網址裡面的key!!
設定共用後提供的key必需在”發佈(publish)後才可使用,切記!
以本範例為例:
登入後連結link為
https://spreadsheets1.google.com/ccc?hl=zh_TW&key=tRfatqc-LjJEiTknzgX85Fg&hl=zh_TW#gid=0
( key值為:tRfatqc-LjJEiTknzgX85Fg )
而共用分享的Link為:
https://spreadsheets.google.com/ccc?key=0AsoQevXXmTncdFJmYXRxYy1MakpFaVRrbnpnWDg1Rmc&hl=zh_TW
( key值為:0AsoQevXXmTncdFJmYXRxYy1MakpFaVRrbnpnWDg1Rmc )
故使用的key值為:tRfatqc-LjJEiTknzgX85Fg
這個key便會用在之後資料接收時所要對應的spreadsheet連結。
隨後,便可以開始資料的連結與截取:
1. Spreadsheet 直接資料呈現
Spreadsheet 除了以共享方式讓其他人使用外,
還可以透過發佈(Publish) 的方式進行資料分享,
隨後便可以選擇要發佈的工作表、資料連結方式與發佈方式,
發佈後,便可以進行資料連結,
常用的資料連結方式有兩種,html與文字檔(csv)
其連結方式可用下面網址:
https://spreadsheets.google.com/pub?key=你的key值&output=html
https://spreadsheets.google.com/pub?key=你的key值&output=csv
如範例:
https://spreadsheets.google.com/pub?key=tRfatqc-LjJEiTknzgX85Fg&output=html
https://spreadsheets.google.com/pub?key=tRfatqc-LjJEiTknzgX85Fg&output=csv
csv的連結會帶回一個csv檔,內容便是以逗點隔開資料的方式儲存如:
MID,Artist,Album
M0001,Elliott Smith,Either Or
M0002,Jeff Buckley,Grace
M0003,Arab Strap,Philophobia
M0004,Mogwai ,Happy Songs For Happy People
此外若spreadsheet有多個工作表,在使用時便要指定目標工作表,
方法為在網址上加上工作表ID: gid = ?
如範例: (工作表一gid=0,工作表二gid=1)
https://spreadsheets.google.com/pub?key=tRfatqc-LjJEiTknzgX85Fg&output=csv&gid=0
https://spreadsheets.google.com/pub?key=tRfatqc-LjJEiTknzgX85Fg&output=csv&gid=1
透過文字檔的網址連結方式,
只要在撰寫程式時設計一個Buffer,將網址回傳的csv資料存入buffer,
再轉為String 或 StringBuffer物件 (java),
便可以直接取回資料庫內容。
2. RSS Feed (XML) 呈現
在RSS Feed (XML)呈現方式上,
好處是直接以XML顯示,在程式上只要套上XML parser就可以依序取出,
而且若採用Google Data API 進行連結,
無需使用發佈(publish)功能,便可以直接取用 (因API需要先行進行帳號密碼認證)。
針對已經Publish的spreadsheet,可以使用以下連結來檢視你的spreadsheet資訊,
當中有該spreadsheet資訊與各個工作表名稱,但不含各工作表資料內容:
https://spreadsheets.google.com/feeds/worksheets/你的key值/public/basic
此外RSS Feed提供三種不同的資料表示方式:
Worksheet-based feed
List-based feed
Cell-based feed
標準連結設定格式如下 (標註藍色為需修改項目):
Worksheet-based feed
List-based feed
Cell-based feed
當中各別參數代表意義為:
key : SpreadSheet key
worksheetId : 工作表編號
visibility : 檢視權限 , 分為public與private,若有開起公佈(publish)才能使用public,一般private則為google data API連結時使用。
projection : 顯示內容形態,分為full/values/basic。 full 模式中除了顯示欄位資料外亦包含公式內容,values則不含公式資料(以值取代)但含有Data API項目,basic模式則僅含有欄位值。
詳細資料可參考 Google Spreadsheets Data API Reference Guide (v3.0) :http://code.google.com/apis/spreadsheets/data/3.0/reference.html#Feeds
基本上,使用private模式時都是透過Google Data API進行連結,
因此在full 模式下是允許更新資料的,然而在values/basic模式下則為唯讀。
以下使用範例介紹RSS Feed 結果,
因為設定public ,故無需透過API進行身份認證,以下使用 List-based feed模式:
工作表一連結
工作表二連結
以上為連結顯示的資料內容!
透過線上XML縮排網站( http://xmlindent.com/ ) 整理其內容,
可以清楚瞭解資料結構的呈現關係:
工作表一 RSS Feed縮排內容連結
工作表二 RSS Feed縮排內容 連結
以上,
就是Google SpreadSheet的資料顯示模式,
透過URL或RSS Feed資料交換方式,
我們就可以輕鬆利用Google SpreadSheet做為簡易的資料庫使用囉!
BP 2011.04.17
我所知道的,是GOOGLE的IMPORTRANGE函式,運用每個試算表的KEY值,就可以將資料移轉到另一張工作表上,然後再用已移轉的工作表,以網頁呈現,其實也可以達到線上資料庫的效果。
回覆刪除以前我就有試過,以多個工作簿的工作表1,設定成線上表單,可以線上直接輸入資料。
再以A工作簿的工作表1,去連結這些工作簿的工作表1,以網頁呈現。
瑞暘你好,
回覆刪除你這方法也真不錯呢,
直接用不同的工作表來取資料後再統一收回,
可以省下很多介面設計的程序,
挺不賴的!!
謝謝你的分享
我可以問一下gae平台的JIQL 你有聽過嗎?
回覆刪除跟你這個東西有一樣嗎?
Hi 你好,
回覆刪除JIQL指的是一個包裹JDBC與Google Datastore Connector的中介,
它的概念解決以往我們需要透過Google API來進行連線的手續(GData API),
讓我們可以採用像以往JDBC連結資料庫的方式來進行資料連結。
不過它的標的是Google BigTable,
基本上就是Google Cloud背後的儲存載體,
透過Map/Reduce , Key/Value的方式進行存取的資料庫。
而我介紹的不管是Fusion Table, Spreadsheet,
都是建置於BigTable之上的應用服務。
(只是使用目的不同)
BP
Hello! BP
回覆刪除我想請問一下,如果想用Android手機拍照,然後將影像傳送到Google App Engine(GAE) 上, 並且在GAE那端做影像處理的一些運算得到一些數據,然後這數據對應資料庫(datastore)找到對應的值傳回手機.
找遍了書局的書,書店都是使用python開發,沒看到有用Google App Engine for java
而網路上的也都只測試到HelloWorld出現,缺少深入的講解
想請教您不知道這樣可不可行?
Hi Damon
回覆刪除討論當然沒問題囉,互相學習很棒呀 :)
針對你的東西,
如果你之前有用Java完成了影像處理跟資料parser的部份,
那我想是不難的,
因為GAE本身結構就像JSP的結構,
你可以把之前寫的程式包成Library 或JavaBean來用,
這樣就可以不用管是否是雲端平台的問題。
另外,資料庫的部份就要看你的資料量來選擇哪一種適合你,
基本上各有各的優點,對於資料量我會選用spreadsheet來做,
因為簡單,要維護也可以用google docs直接修改,
但如果是大量資料,那用BigTable也是不錯的作法。
不過GAE本身也有提供Datastore可以使用,
作法可以參考
http://code.google.com/appengine/docs/java/gettingstarted/usingdatastore.html
BP你好!
回覆刪除請問Spreadsheet上面的教學算是已經建好環境了嗎!?
那要把它當作資料庫的使用方法是怎麼用呢!?例如怎麼存放資料進去,如何新增、修改、刪除、查詢...
不好意思我是學生所以對這方面沒很研究 謝謝!
Hello BP:
回覆刪除謝謝你的分享!
Hello, Unknown !??
回覆刪除上面的spreadsheet 內容是自己打的,
我原本也是打算寫一系列的database操作,
但實在是沒有時間,所以只寫了第一個read就停到現在
不過若你想要快速的做出一個新增的頁面,
直接使用google docs裡spreadsheet的表單就可以了!
至於表單怎麼做,你google一下:google docs 表單
就會找的到了!
您好,謝謝您的分享。請問我可以在Google Doc 試算表中加入hyperlink,例如台北的目前的氣溫,並設定每一分鐘,讓Google Doc試算表自動更新嗎?未來只要開啟Google Doc 試算表便能夠知道目前台北的氣溫。
回覆刪除藍波斯貓咪主人你好
回覆刪除這是可以做到的,不過必須透過程式來達成,
舉例來說:
在試算表中,你可以選"工具/指令碼編輯器"
來撰寫想要顯示的功能。
不過你也可以搜尋別人分享的已經寫好的功能,
像你想要的天氣,
你可以在資料格中選"工具/指令碼庫"
當中就可以找到weather相關的指令,
匯入後便可以利用指令碼管理員來插入你想要的溫度
並為他做個label就可以了!
BP您好,非常感謝您的指導。
回覆刪除您好~請問一下能使用者能不能在網頁上查詢spreadsheets,並顯示。
回覆刪除功能入下:
https://code.google.com/apis/ajax/playground/?type=visualization#stringfilter_control
你好,最近在找一個功能,可以讓google 的spreadshhet內的不同張活頁簿,做內容的同步和修改,例如Sheet1的A1:D10同步Sheet2的A1:D10, 是有找到網友寫的類似的功能,不過他寫的只能同步一個儲存格, 請問要如何把它改成可以偵測range的呢? 感謝知道的人分享一下~~
回覆刪除http://stackoverflow.com/questions/14106019/bidirectional-content-syncing-between-google-spreadsheets
試著把它改成偵測範圍值,似乎語法有問題...不曉得哪裡出錯了~~a
回覆刪除function onEdit()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetRange(targetName,int)
var activeSheet = ss.getActiveSheet();
var activeSheetName = ss.getActiveSheet().getSheetName();
var tgSheet = ss.getSheetByName(targetName);
var output;
if(targetName == activeSheetName)
{
if( activeSheetName == "Sheet1" || activeSheetName == "Sheet2" )
{
if( activeSheetName == "Sheet1" )
{
output = "Error: target sheet is active sheet !!";
}
else {
switch(int)
{
case 1:
output = getSheetByName("Sheet2").getDataRange().getValues();
break;
case 2:
output = getSheetByName("Sheet2").getSheetValues(1, 1, getSheetByName("Sheet2").getMaxRows(), getSheetByName("Sheet2").getMaxColumns());
break;
default:
output = "Choose int to be 1 or 2 !!";
}
}
return output;
}
}
}