跳到主要內容

Google 資料庫方案–Spreadsheet–(1)資料呈現

image
HEMiDEMi 的標籤: ,,

早在規劃『教育,意義! 』project時,
便有打算將整個網站建立過程撰寫一篇教學,讓有興趣以google 服務為基礎進行開發的朋友參考。
沒想到這個想法擺著就拖了好幾個月,
好在學生提出了問題,就趁這機會寫一寫吧。

基本上『教育,意義! 』網站的架構完全建立在Google提供的服務,
廣義來說也是個雲端的系統,
所有的資料是分散在不同的服務架構下,再用GAE, Javascrript將服務資訊串接起來,
由Blogspot 統一呈現。

省了租主機的費用,或架站的硬體、電費,
最好的地方在於不用管理主機維運的問題,
只要專心做我的創意、嘗鮮就好了!!   多棒!

若將『教育,意義! 』網站依功能層次來分類,可以分為三層結構,
當中的層次與使用技術大致如下:

  1. UI 介面層
  2. App應用層 
  3. 資料層
本篇文章將著重在介紹以Google Spreadsheet 做為雲端資料庫,
其他主題將會陸續推出。
若對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文件)後建立新項目 - 試算表,

Google 文件 - temp


建立好的試算表中預設為一個工作表,但為求精確,
範例中建立兩個工作表來介紹其連結方式,其內容如下:

image image


資料顯示部份,以下逐一說明,

首先最重要的是取出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) 的方式進行資料分享,

image

隨後便可以選擇要發佈的工作表、資料連結方式與發佈方式,
image

發佈後,便可以進行資料連結,
常用的資料連結方式有兩種,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模式:
工作表一連結
工作表二連結
image

以上為連結顯示的資料內容!
透過線上XML縮排網站( http://xmlindent.com/ ) 整理其內容,
可以清楚瞭解資料結構的呈現關係:
工作表一 RSS Feed縮排內容連結
工作表二 RSS Feed縮排內容 連結
image


以上,
就是Google SpreadSheet的資料顯示模式,
透過URL或RSS Feed資料交換方式,
我們就可以輕鬆利用Google SpreadSheet做為簡易的資料庫使用囉!


BP 2011.04.17

留言

  1. 我所知道的,是GOOGLE的IMPORTRANGE函式,運用每個試算表的KEY值,就可以將資料移轉到另一張工作表上,然後再用已移轉的工作表,以網頁呈現,其實也可以達到線上資料庫的效果。

    以前我就有試過,以多個工作簿的工作表1,設定成線上表單,可以線上直接輸入資料。
    再以A工作簿的工作表1,去連結這些工作簿的工作表1,以網頁呈現。

    回覆刪除
  2. 瑞暘你好,
    你這方法也真不錯呢,
    直接用不同的工作表來取資料後再統一收回,
    可以省下很多介面設計的程序,
    挺不賴的!!

    謝謝你的分享

    回覆刪除
  3. 我可以問一下gae平台的JIQL 你有聽過嗎?
    跟你這個東西有一樣嗎?

    回覆刪除
  4. Hi 你好,

    JIQL指的是一個包裹JDBC與Google Datastore Connector的中介,
    它的概念解決以往我們需要透過Google API來進行連線的手續(GData API),
    讓我們可以採用像以往JDBC連結資料庫的方式來進行資料連結。


    不過它的標的是Google BigTable,
    基本上就是Google Cloud背後的儲存載體,
    透過Map/Reduce , Key/Value的方式進行存取的資料庫。

    而我介紹的不管是Fusion Table, Spreadsheet,
    都是建置於BigTable之上的應用服務。
    (只是使用目的不同)


    BP

    回覆刪除
  5. Hello! BP
    我想請問一下,如果想用Android手機拍照,然後將影像傳送到Google App Engine(GAE) 上, 並且在GAE那端做影像處理的一些運算得到一些數據,然後這數據對應資料庫(datastore)找到對應的值傳回手機.
    找遍了書局的書,書店都是使用python開發,沒看到有用Google App Engine for java
    而網路上的也都只測試到HelloWorld出現,缺少深入的講解
    想請教您不知道這樣可不可行?

    回覆刪除
  6. Hi Damon

    討論當然沒問題囉,互相學習很棒呀 :)

    針對你的東西,
    如果你之前有用Java完成了影像處理跟資料parser的部份,
    那我想是不難的,
    因為GAE本身結構就像JSP的結構,
    你可以把之前寫的程式包成Library 或JavaBean來用,
    這樣就可以不用管是否是雲端平台的問題。

    另外,資料庫的部份就要看你的資料量來選擇哪一種適合你,
    基本上各有各的優點,對於資料量我會選用spreadsheet來做,
    因為簡單,要維護也可以用google docs直接修改,
    但如果是大量資料,那用BigTable也是不錯的作法。

    不過GAE本身也有提供Datastore可以使用,
    作法可以參考
    http://code.google.com/appengine/docs/java/gettingstarted/usingdatastore.html

    回覆刪除
  7. BP你好!

    請問Spreadsheet上面的教學算是已經建好環境了嗎!?

    那要把它當作資料庫的使用方法是怎麼用呢!?例如怎麼存放資料進去,如何新增、修改、刪除、查詢...
    不好意思我是學生所以對這方面沒很研究 謝謝!

    回覆刪除
  8. Hello BP:

    謝謝你的分享!

    回覆刪除
  9. Hello, Unknown !??

    上面的spreadsheet 內容是自己打的,
    我原本也是打算寫一系列的database操作,
    但實在是沒有時間,所以只寫了第一個read就停到現在

    不過若你想要快速的做出一個新增的頁面,
    直接使用google docs裡spreadsheet的表單就可以了!

    至於表單怎麼做,你google一下:google docs 表單
    就會找的到了!

    回覆刪除
  10. 您好,謝謝您的分享。請問我可以在Google Doc 試算表中加入hyperlink,例如台北的目前的氣溫,並設定每一分鐘,讓Google Doc試算表自動更新嗎?未來只要開啟Google Doc 試算表便能夠知道目前台北的氣溫。

    回覆刪除
  11. 藍波斯貓咪主人你好

    這是可以做到的,不過必須透過程式來達成,
    舉例來說:
    在試算表中,你可以選"工具/指令碼編輯器"
    來撰寫想要顯示的功能。

    不過你也可以搜尋別人分享的已經寫好的功能,
    像你想要的天氣,
    你可以在資料格中選"工具/指令碼庫"
    當中就可以找到weather相關的指令,
    匯入後便可以利用指令碼管理員來插入你想要的溫度
    並為他做個label就可以了!

    回覆刪除
  12. BP您好,非常感謝您的指導。

    回覆刪除
  13. 您好~請問一下能使用者能不能在網頁上查詢spreadsheets,並顯示。

    功能入下:
    https://code.google.com/apis/ajax/playground/?type=visualization#stringfilter_control

    回覆刪除
  14. 你好,最近在找一個功能,可以讓google 的spreadshhet內的不同張活頁簿,做內容的同步和修改,例如Sheet1的A1:D10同步Sheet2的A1:D10, 是有找到網友寫的類似的功能,不過他寫的只能同步一個儲存格, 請問要如何把它改成可以偵測range的呢? 感謝知道的人分享一下~~

    http://stackoverflow.com/questions/14106019/bidirectional-content-syncing-between-google-spreadsheets

    回覆刪除
  15. 試著把它改成偵測範圍值,似乎語法有問題...不曉得哪裡出錯了~~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;
    }
    }
    }

    回覆刪除

張貼留言

這個網誌中的熱門文章

醫學健康跨領域合作的開始:資料工程

一直都很喜歡在會議上與跨領域的專家、醫師、學者分享我們在數據工程與分析應用上的發展經驗。 許多的專家學者,對於大數據應用的認知都仍侷限在一個超大型結構化資料集的子集合應用,在規劃好的條件設定下,針對特定的目標(疾病、行為)進行篩選,將數據narrow down到可以被個人電腦或是單一伺服器架構處理的小型資料集。 這樣的半手工處理方式,對於專一(Specific)領域主題的資料追蹤計算或許已經十分足夠,但當中倘若資料清理方式有改變、篩選條件增減,所有的數據都要從raw重新處理,不僅造成大量的時間與人力浪費,對於專案計畫進度的延宕更是麻煩。這些還不包含

別再期末談臨終

『在那六年多的時間,我常常反省、後悔、卻也培養勇氣,問自己再遇到時要做什麼決定?.......回想我要簽同意書的時候,真的會抖-我有資格決定人家生死嗎?』 面對死亡,我們都很害怕,更何況是家人的臨終。 但究竟我們的選擇,是為了給家人最後的尊嚴? 還是填補自己的罪惡感? 學習勇敢面對、學習放下, 更要學著為自己的未來做好規劃,不成為子女的負擔。 希望大家一起鼓勵這個勇敢的朋友, 因為她的經驗分享,讓我們更加了解, 面對家人臨終,我們該如何做好準備。 『末期才談臨終太遲』 https://www.wacare.live/health-forum/q/1984983840830?topicId=25049764537230&fbclid=IwAR1ei-zrfSj9w5kbvBW5ecSbqWrI408fJ1qjXhisZwLxYdbON_jJbNKMAyY 更多的失智照護課程 https://www.wahere.wapro.live/udnxwacare Pan 2020.12.22 #臨終 #失智 #善終 #放棄急救 #預立醫療 #病人自主