輕鬆建立免費資料庫與RESTful-API服務-儲存篇

接續上篇文章透過Google Apps Script(以下簡稱GAS)建立免費的RESTful服務,將資料儲存至Google試算表中。

撰寫資料接口

同樣使用上篇所使用的Google試算表,使用GAS撰寫接收資料使用的接口,撰寫完成後記得要進行發布。
程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
/**
* 接收資料接口
*/
function doPost(e){
try{
return ContentService.createTextOutput(JSON.stringify(e))
.setMimeType(ContentService.MimeType.JSON); //將傳送至該方法中的參數物件,轉為JSON 字串吐回
}catch(err){
return err
}
}

測試POST接口

POST MAN 軟體

由於瀏覽器只能呼叫GET類型的方法,因此在開發時需要透過POST-MAN模擬服務請求,下列連結為安裝連結在此就不再贅述。

使用POST MAN 呼叫 doPost

安裝完成後新增一筆任務,並依照下圖進行呼叫資料的調配。

  • JSON資料範例
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"method": "addUser",
"data": [
{
"Name": "路人甲",
"Class": "A"
},
{
"Name": "路人乙",
"Class": "B"
}
]
}

送出後我們可以得到GAS回傳的資料如下圖所示,在回傳的資料中我們可以看到postData中的contents夾帶我們剛剛傳送的資料,透過這個方法我們就可以了解,我們實際傳到GAS中的資料到底是長怎樣,這樣有助於我們後續的開法與偵錯。

撰寫程式

串寫儲存資料到Google試算表方法

介紹完上述API接收資料的基本使用方法後,接下來回到今天的正題,如何將資料寫入Google試算表中,不廢話直接上程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var _sheetId='你的Google Sheet id';
var _gid='活頁簿id'

/**
* 接收POST API接口
*/
function doPost(e){
try{
var response =null; //建立回應物件
var data = JSON.parse(e.postData.contents) //將傳入的資料由json字串轉為物件
if(data.method =='addUser'){ //判別方法 ->如果是addUser則進行資料新增
response = addUser(data)
}else{
response={'message':'查無方法'}
}
return ContentService.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON); //將文字轉為JSON格式
}catch(err){
return ContentService.createTextOutput(JSON.stringify(err))
.setMimeType(ContentService.MimeType.JSON); //將文字轉為JSON格式
}
}

/**
* 增加角色方法
*/
function addUser(data){
var sheet =SpreadsheetApp.openById(_sheetId)
var googleSheet = getSheetByGid(sheet ,_gid)
data.data.forEach(x=>{
googleSheet.appendRow([
ReadMaxId(googleSheet)+1,
x.Name,
x.Class
])
})
return {'message':'儲存成功'};
}

/**
* 取得試算表物件
*/
function getSheetByGid(spreadsheet, gid){
gid = +gid || 0;
var res_ = undefined;
var sheets_ = spreadsheet.getSheets();
for(var i = sheets_.length; i--; ){
console.log(sheets_[i].getSheetId() );
if(sheets_[i].getSheetId() === gid){
console.log(sheets_[i].getSheetId());
res_ = sheets_[i];
break;
}
}
console.log(res_.getSheetId());
return res_;
}

/**
* 取得該試算表最左邊欄位最新值
*/
function ReadMaxId(googleSheet){
var allData = googleSheet.getSheetValues( googleSheet.getLastRow(), 1, googleSheet.getLastRow(), 1);
console.log(allData[0][0]) ;
return allData[0][0];
}

上述程式碼中的「_gid」是Google試算表中每個不同試算表的唯一編號,如下圖所示。如果我想將資料儲存至另外的活頁簿中,我就必須將Google幫我們預設的0改為新的「gid」編號。

  • 原先預設的編號(gid)

  • 新增活頁簿後,Google會產生新的gid

ReadMaxId 則是為了建立流水號而使用的一個小方法,取得A欄最下方的資料,也就是最大值的概念,取到目前最大數值後再進行加總,這樣就可以完成建立流水號的功能了,接下來讓我們再回到POST-MAN進行實作的部分。

最後驗收

回到POST-MAN上,我們修改掉最後部屬的網址後,就可以大力地按下送出,如果不出意外的話,我們可以得到下面的訊息:

1
2
3
{
"message": "儲存成功"
}

我們再回到Google試算表中,我們就可以看到剛剛送出的資料,已經乖乖地躺在試算表中了。

有人會問透過Google試算表收集API的好處是啥,我自己架資料庫它不香嗎?我大致總結了下列三點:

  1. 不必處理硬體與網路問題

    當我們可能練習寫一些簡單的網頁或是應用程式時,我們可以用極短的時間完成基本的資料CRUD功能,而且完全不避考慮內網外網還是IP或是DNS等等,聽都沒聽過的問題。

  2. 提高使用者(a.k.a problen maker)的使用彈性

    由於資料是儲存在Google試算表中,這樣使用者就不用透過網頁查看統計報表,只要將試算表權限開放給想要查詢的人員即可。(就不用使用者和開發人員來來回回的鬼打牆了…)

  3. 不受環境影響

    程式開發時的開發環境將會嚴重影響開發進度,但都集中於Google上面的話,我們只要確保瀏覽器可以正常運行的話,不論是Mac還是Windows甚至是iPad都可以愉快地玩耍,何樂不為?

打完收工~感謝你看到最後!

0%