從 Google 試算表 讀取資料至 App Inventor
前天介紹了如何將資料寫入至 Google Sheets(使用 App Inventor 將文字欄位資料寫入 Google 試算表),今天要來介紹如何讀取 Google Sheets 的資料,並顯示在 App Inventor 上。
2022/11/14 更新
做了一個新的 App「雲端留言板」,欄位只有暱稱和留言內容,做法和文章教學一樣!
*2021/08/10 更新
因為原本的表單突然不能用了!(可以讀但不能寫)
所以這邊附上最新版的 aia 檔案
更新的部份只有表單網址和試算表網址,其它都保持不動!
要讀取 Google Sheets 的資料很簡單,今天提供兩種做法,給各位參考:
- 將 Google Sheets 發布到網路,再透過 Inventor 的網路元件執行 Get 請求,取得回應文字。
- 透過 Google 的 Visualization API 簡易呼叫法去讀取資料,使用此方法還能下 SQL 語法,非常得好用!
以下就來各別介紹:
一、將 Google Sheets 發布至網路
1. 首先登入 Google 雲端硬碟 開啟 Google 試算表,點選左上角的檔案,選擇「發布到網路」。
選擇第二個「.csv」後按發布
將網址儲存到記事本等等會用到
2. 開啟 App Inventor 專案,新增一個標籤、按鈕和網路元件。
功能為當按下按鈕,就將讀取的資料透過標籤顯示。
3. 開始撰寫程式方塊,新增一個 清單變數 datas,當 讀取按鈕 被點選時,要設定 讀取標籤 的文字、設定 網路2 的網址,和呼叫 網路2 執行Get請求。
4. 當讀取到文字時,判斷回應程式碼是否為 200,如果是就代表讀取成功。讀取成功後,要將回應內容指派給變數 datas,但中間要插入「CSV表格轉清單」的方塊,然後再設定標籤的文字為 datas。
這樣即可成功顯示資料
這樣顯示是一個二維陣列的資料,Inventor 的清單(陣列)是用 “[” 和 “]” 包起來的,各個資料間再用逗號隔開,例如:[1, 3, 5, 7, 8] –> 這是一維陣列;但如果各個資料又分別再是清單的話,例如:[[1, 3, 5, 7], [2, 4, 6, 8]] –> 這樣就是二維陣列。
直接顯示清單資料,這樣在閱讀上十分不便,所以我們要再將資料做拆解,使資料能夠更方便我們進行閱讀。
5. 先建立三個變數清單,名稱分別為:帳號ID、使用暱稱和密碼。
6. 接著要來寫副程式(請拖拉紫色的定義程序,取名:拆解資料);從流程控制拖拉「對於任意清單項目的清單……執行」,右方要放變數清單 datas,這個方塊的功能類似迴圈,清單變數裡有幾項資料它就會執行幾次!每執行一次,會將變數裡的資料給暫存變數「清單項目」。
現在要將資料個別存到剛剛建立的三個清單變數裡,這裡為了方便稱呼,我將試算表的橫欄稱為 “列“,直欄就稱為 “欄“,以 Google Sheets 來說,第一列的資料為:時間戳記、帳號 ID、使用暱稱和密碼;第三欄(C 欄)的資料為:使用暱稱、神鵰大俠和JBNotes。(清單項目的資料就是一列一列的)
7. 拖拉一個增加清單項目和選擇清單中索引為…的方塊;每一列的第二項資料為帳號 ID、第三項資料為使用暱稱、第四項是密碼,依序新增到清單變數裡,如下:
8. 修改當網路元件取得文字的程式碼,設定變數 datas 的底下拖拉一個呼叫拆解資料副程式,再來放一個迴圈方塊,範圍從 1 到變數 datas 的長度,將設定文字的方塊放在裡面。如下:
到這資料已可正常顯示
如果不太了解上面的程式方塊在幹嘛,可以先記著要怎麼做就好!用自己的方式,嘗試不同的拆解法;說不定哪天走在路上哼著歌,就突然想通了!!
二、使用 Visualization API 簡易呼叫法 讀取資料
最近在 Google 查 Google Sheets 和 SQL 的關鍵字時,無意間發現了這個方法,用 Inventor 測試後真的可以顯示資料,最重要的還是可以下 SQL 語法,非常好用。
1. 登入 Google 雲端硬碟 開啟 Google 試算表,複製網址到記事本。右邊點選開啟共用,讓知道連結的使用著可以檢視。
我們需要用到 d/………/edit 之間的試算表代號
2. 複製以下資料到記事本
https://spreadsheets.google.com/tq?
tqx=out:csv
key=填入試算表代號
tq=填入SQL語法
這是網路元件要設定的網址,如下:
https://spreadsheets.google.com/tq?tqx=out:csv&key=填入試算表代號&tq=填入SQL語法
tqx、tq 和 key 之間要用 & 符號連結
3. 開啟 Inventor 專案,新增一個變數,取名為:資料呈現網址,內容為上面的網址資料,一直到 tq= 就好。
4. 將 讀取按鈕被點選時,的方塊裡的網路元件網址,改成變數 資料呈現網址;還要合併網路元件裡的URL編碼方塊,方塊右邊是 SQL 語法。
因為 SQL 語法會用到比較特殊的符號或中文…等等,所以得經過編碼處理。
select B, C, D 是只要取這三個欄項的資料
5. 在網路元件取得文字的方塊裡,將資料結果的文字,設定為回應內容。
這樣就可以讀取到資料了!
6. 這個資料也可以用剛剛的副程式拆解,不過清單項的索引要改成 1、2、3,因為這次沒有時間戳記的資料了!
網路元件取得文字裡的程式,要改成跟剛剛一樣,呼叫副程式、迴圈顯示文字。
至此 整個 App 已製作完成!
如果先讀取後,要再測試寫入和讀取,記得將三個變數清空,清空方式為「設置變數為空清單」即可,否則資料呈現會變成如下所示:
50 則留言
cokeiceff
您好,想請教增加一筆資料後,是不是不能馬上讀取出來,必須從開APP才行。
JamesBang
你好,不用重開 App,剛剛測試過連續輸入好幾筆,是可以馬上讀出來的,不過之前我也遇過幾次,資料已經寫進去,卻讀不出來的狀況,不知道是網路還是試算表的問題?但通常我都是等待一段時間後就可以正常輸出了。
COKEICEFF
謝謝大大。
COKEICEFF
請教一下讀取按鈕抓的網址要修改為export?format=csv
還是原先的就好,我兩種都試過讀取失敗。
JamesBang
妳好,讀取的網址我都是用原先的沒有修改,剛剛用新的資料表測試過,抓得到資料,資料表網址 –> 「https://docs.google.com/spreadsheets/d/e/2PACX-1vTNqY5mMt-B8Zbbk81hiK0BVpDOYUJTHS2nJ923mgVvaTWTF90FfO2Kq1xI1OKHh-GrTsTpmUetbpip/pub?output=csv」。
我順便把 aia 檔案給妳:https://drive.google.com/file/d/10RldLwP0n-AI3p5gLQdSvrgQpWseCchR/view?usp=sharing
COKEICEFF
案子讀取按鈕後跳出以下
執行錯誤
Select list item: Attempt to get item number 0, of the list [“時間戳記”, “2021/4/23 上午 7:34:54”, “2021/4/23 上午 7:44:57”, “2021/4/23 上午 7:56:59”, “2021/4/23 下午 7:14:47”]. The minimum valid item number is 1.
注意: 5秒鐘之內不會再次顯示錯誤訊息。
JamesBang
因為在 Inventor,清單的最小索引值為 1,你應該有個「選擇清單…索引值為…」的方塊,妳改成 1 看看。
COKEICEFF
1.被你說重了,我裡面有寫一個偷吃步的FOR迴圈,
只顯示最近五筆資料的那種,然而我今天的試算表內只有四筆資料,絕對跑錯誤訊息。
先謝謝了。
2.我有寫一個HTML的遊戲執行黨都弄好了,我想問除了把檔案放到GOOGLE雲端然後讀取之外
,還有哪些國內的免費空間可以使用。(可以執行HTML的免費空間,不單單只是備份)
JamesBang
如果只是單純的 HTML 檔案,其實放在 Google Drive 也可以執行喔!有一個方法可以把雲端硬碟變成網站伺服器,文淵閣的茶米老師有教過,很有趣,給妳參考看看「http://blog.e-happy.com.tw/%e7%b6%b2%e7%ab%99%e6%9e%b6%e8%a8%ad-%e6%89%8b%e6%8a%8a%e6%89%8b%e6%95%99%e4%bd%a0%e6%8a%8a%e7%b6%b2%e7%ab%99%e6%9e%b6%e8%a8%ad%e5%88%b0-google-drive-%e9%9b%b2%e7%ab%af%e7%a9%ba%e9%96%93%e4%b8%8a/」。
我沒聽過有國內的免費空間,不過國外倒是一堆,像是 000webhost、byethost……等,這兩個都是我用過非常不錯的免費虛擬主機,特別是 000webhost,我現在這個網站是用 hostinger,它的底下就是 000webhost,簡單辦個帳戶就能使用了!會給妳一個網址
官網:「https://www.000webhost.com/」
COKEICEFF
謝謝你,改天來研究看看。
JamesBang
不客氣,有任何問題歡迎再留言討論!
MOE
您好,想請問用這樣的方式將資料讀取到APP裡,可以用下拉式選單或輸入的方式去篩選我要的資料嗎?
例如我想只想要找小明的ID﹑密碼等,能不能在標籤輸入小明(或是下拉式選單選取小明)後,按下讀取,然後只跑出小明的資料呢?
謝謝您
JamesBang
您好!
這兩種方法都可以做到,如果是用下拉式選單選擇姓名的話,在網路元件讀取到資料時,就可以先設定下拉式選單的元素字串,各個姓名間用逗號隔開,我有寫一篇「查詢 YouBike 站點資料」,裡面有用到這個方法,可以參考看看!
在清單的方塊裡,有一個「求對象…在清單…中的位置」方法,利用這個方塊,就可以找到這個人在清單中是第幾號,例如 “小明” 在姓名的清單中是第四號,那麼「ID」和「密碼」,這兩個清單變數的第四項資料,就是小明的,因為當初在新增資料時,都是按照順序的,所以在設定標籤文字那,將「求對象…在清單…中的位置」方法,放到「選擇清單…中索引值為…的清單項」方法的索引值那裡就可以了!
當然如果對二維陣列熟悉的話,也不用像我這麼麻煩,還把各個資料再存到變數裡!直接用兩個「選擇清單…中索引值為…的清單項」方法就可以輕鬆辦到!
如果對 SQL 熟悉的話,透過「Visualization API 簡易呼叫法」,其實在一開始就可以只獲取特定人士的資料,而且還不限單一筆,假如小明總共有四筆資料,那這四筆就都能一次抓出來。
如還有任何問題都歡迎提問!
MOE
您好,我同樣在搜尋時遇到了Select list item: Attempt to get item number 0, of the list [中間省略]. The minimum valid item number is 1.的情況,但我的式子中那邊要出現的應該是您說{「求對象…在清單…中的位置」方法,放到「選擇清單…中索引值為…的清單項」方法的索引值那裡}這個部分,不確定是哪裡沒有調整到
避免我說不清楚,我在下面有附上我正在寫的aia檔案,該式子的位子在Screen3,我希望他呈現出的方式應該是當我選單選定姓名後,第一欄+選定的那一欄會顯示出來……還是我的清單定義方式錯誤了,不好意思問題有點多!
https://docs.google.com/spreadsheets/d/1X-XCCeauilNylx2Gu1_JM3FjNoG5SKCc0DWRnE_HoWI/edit#gid=1331193330
JamesBang
那一句的意思是,「在 App Inventor 中,清單的最小索引值是 1」,不是 0 喔!跟其它程式語言不太一樣。
你最底下附的不是 aia 檔案,是試算表的連結,你可以把檔案寄給我,我有空再幫你看看!
信箱:[email protected]
haa
你好 如果我只想要讀取google sheets其中一格的話 要怎麼用
JamesBang
你好,不論是直欄還是橫列,都能透過下 SQL 語法,抓取我們想要的特定資料,我有另外寫一篇教學,歡迎參考看看。
https://jbprogramnotes.com/2021/06/app-inventor-%e5%bf%ab%e9%80%9f%e7%af%a9%e9%81%b8%e6%83%b3%e8%ae%80%e5%8f%96%e7%9a%84%e8%b3%87%e6%96%99/
haa
謝謝 我再參考看看
樂咩
請問為什麼我的資料只會顯示一個(在試算表是第3列 我的第2列都出不來)
JamesBang
嗯~~ 沒有實際看到也不太清楚,如果方便的話,可以把 aia 檔案和試算表給我看看!
我的信箱:[email protected]
樂咩
好的 已經寄出 麻煩您了
JamesBang
收到,已回信,如有問題歡迎再留言提問!
JustinLiu
同樓上發問者
APP Inventor錯誤:Cannot parse text argument to “list from csv table” as a CSV-formatted table
不確定是否為程式碼錯誤還是根本就沒讀取到表單
這是程式的截圖:
https://prnt.sc/1tc1abi
JamesBang
應該是因為,你讀取到的不是 CSV 表格。
JustinLiu
同 JustinLiu 發問
您好,Visualization API的網址格式是否有變更,我照上面的格式更改成我自己的表單,會顯示錯誤
我的表單(已開共用):
https://docs.google.com/spreadsheets/d/1P7N4SERKPjkcIElyNogacTE18qny94xQ/edit#gid=629008799
照上面更改成:
https://spreadsheets.google.com/tq?tqx=out:csv&key=1P7N4SERKPjkcIElyNogacTE18qny94xQ&tq=
不知道是否有哪出錯?
JamesBang
你好!我剛剛測試我的範例,還是可以執行的,但是測你的,程式碼回應都是 404,不知道是不是因為,你的檔案是 .xlsx 的關係!?我也是第一次遇到這種情況!!
所以我到妳的試算表頁面,在上方的 “檔案” 按鈕裡,有一個 “儲存為 Google 試算表” 選項。
https://i.imgur.com/rIt2HOX.png
點下去後會開一個新的試算表頁面,那個頁面的試算表代號會跟你本來的不一樣,我這裡是:
https://docs.google.com/spreadsheets/d/1Tw5JP1Cka2-jjpNw8zf2_UKD7YamWVvKNmMxXI_BCaM/edit#gid=629008799
開啟共用後,到 App Inventor 更改成這個的代碼就能讀取了!
https://i.imgur.com/WkNwdIj.png
P.S. 你自己要再 “儲存為 Google 試算表” 一次喔!因為上面那個是存到我自己的試算表了!!
JustinLiu
謝謝您的教學,問題解決了
JamesBang
不客氣!有任何問題歡迎再留言討論
學生
請問清單項的索引改成 1、2、3那部分,如果我索引有20幾個很多咬怎麼修改呢?
JamesBang
使用此方法讀取時,只有少第一直欄的「時間戳記」,所以假設你寫入的資料有二十個項目,那麼修改時就是直接從 1 開始到 20。
可以使用「迴圈方塊」,範圍從 1 開始,一直到看你有幾個項目,把這個「迴圈方塊」放到「清單迴圈」裡,然後「增加清單項目」的方塊,就拉一個放到「迴圈方塊」裡就好,索引值就設為「迴圈變數」;
那麼清單空格的部份呢
以我的為例,我有 帳號ID、暱稱和密碼,我只要把這三個變數再放到一個「清單變數」裡,我就從這個「清單變數」裡抓就好,這個的實作方式有很多。
(使用二維清單)
不過最簡單的方式就是一個一個拉出來設定,只是很耗時,如果你有一百個項目,可能會拉到放棄 😂
學生
請問回圈內增加清單項目後面的變數都是同一個嗎?
JamesBang
是,也不是!
像我上面講的,你可以將欄位的變數,全部再放到一個清單變數裡(二維清單),這樣一來你「增加清單項目」後面的變數,就可以用同一個。
如果你只用一個一維清單變數的話,就會變成所有欄位的資料都在同一個變數裡,這樣會亂掉!
所以你可以修改如下:
一、再建立一個清單變數
二、在拆解資料時,直接將欄位變數加入進去。
三、最後「增加清單項目」後面的變數,就都用同一個就好,索引值就用迴圈變數。
https://i.imgur.com/wmgGcPb.png
P.S. 如果覺得方塊太長,再拉個副程式放進去。
執行結果:
https://i.imgur.com/w2dN5op.png
範例檔案:
https://drive.google.com/file/d/1AN3ooL_WsbGH9dUIz_nuks6fcrkxWGnM/view?usp=sharing
學生
我有39個欄位變數全部拉進去建立二為清單的意思嗎?
JamesBang
沒錯!就像我上面留言附的圖那樣
JACK
請問一下,我把EXCEL檔案裡的資料手動刪除後按讀取資料,被我刪除的就不會顯示出來了剩|||,這樣要怎麼處理?
JamesBang
在字串方塊裡有一個「是否為空值」的方塊,你可以在合併字串前,先用這個方塊判斷讀取的資料是否為空,如果不為空再將資料合併印出來。
JACK
解決了 謝謝!!
另外還有一個地方是我把資料送出到試算表裡,但是它顯示出來的會變成重複2個標題如下圖
https://cdn.discordapp.com/attachments/638972074056089600/978651184174882866/8711.jpg
JamesBang
你好!
因為在第一次讀取時,已經將你試算表的所有資料(包含標題),都存進變數裡了,第二次讀取時一樣會再將所有資料存一次,這樣就變成你的變數裡有重複的資料,像我文章最後講的那樣。
所以在讀取時,可以將變數都清空後再新增資料進去,這樣就不會看到有重複標題的情形了!
清空方式為「設置變數為空清單」即可
JamesBang
如果你的情況跟我講的不一樣,可以截程式方塊的圖給我看看,或寄 aia 檔案我有空再幫你做測試。
我的信箱:[email protected]
Shrimp
老師 您好
想請教一個問題,就是我可以用甚麼方式同時讀取及更新某一個試算表?
例如下表:
https://docs.google.com/spreadsheets/d/1T4WeZCHxL4m2r4eDZSVqCgQVpuZjN4bt6w9NUTydlhs/edit#gid=0
我想做的是,app每次運行都會下載此表的資料 (A),並且每當我app操作完得到最新的金額(B) 後上傳,但我想上傳到此表以達到更新目的,下次app運行時,會下載到最新的資料 (B)。
Shrimp
不好意思…我不知道怎麼把上面的網址弄成超連結@.@
JamesBang
你好,這件事非常簡單!你可以參考「試算表寫入篇」的教學文章,讀取和寫入都使用同一個試算表,所以只要資料寫入成功後,再做讀取自然就會抓到最後一筆的更新資料了!
https://jbprogramnotes.com/2020/11/%e4%bd%bf%e7%94%a8-app-inventor-%e5%b0%87%e6%96%87%e5%ad%97%e6%ac%84%e4%bd%8d%e8%b3%87%e6%96%99%e5%af%ab%e5%85%a5-google-%e8%a9%a6%e7%ae%97%e8%a1%a8/
不過如果你是要將儲存格 A1 的資料做更新的話,就要用到 Google Apps Script,但那又是另一門技術了!
Shrimp
是的,其實我現在就是在傷腦筋這塊….本來我想讓表格資料直觀上乾淨一點,不過老師的建議我會先用。
我會另外抽時間去研究需要Google Apps Script的部分,這部分我有在國外的MIT APP INVENTOR的論壇上看到過,有點複雜….看不懂~”~
Shrimp
老師,我試過了,但是會把所有的資料通通載下來,包含時間戳記、各個欄位名以及其內容,如下圖:
https://drive.google.com/file/d/1Mwjl5SP3uDsrLZ58TXCQUqjxQyfxfbG1/view?usp=sharing
傷腦筋,這樣APP會無法運作~”~
JamesBang
你好,在圖片中的 “現金” 那一列,你想要顯示的是 “30000” 嗎?
這樣的話,如果是使用文章中的第一種讀取方法:
當你將 “回傳內容” 使用 “CSV 表格轉清單” 方塊轉換後,應該會是一個二維清單(清單裡再放清單),這時再用兩個 “選擇清單…索引值…” 方塊,就可以抓到你要的資料了!
其中,第一個方塊的索引值內容就用 “求清單的長度…” 方塊,因為你不知道總共有幾筆資料;最後第二個方塊的索引值內容就填入 2,因為你試算表只有兩個欄位,而你要的現金資料在第二個欄位。
https://i.imgur.com/Kn9prMY.png
———————————
如果是用第二種 Visualization API 簡易呼叫法 :
因為你只要求 B 直欄 的現金資料,所以在設定網址時,SQL 語法就下 “select B” 即可;執行 GET 請求後,取得的回應內容,用 “CSV 表格轉清單” 方塊轉換一樣會是二維清單,但因為只有讀取一欄,所以可能不容易察覺。
https://i.imgur.com/qeFiCdo.png
解析方式就跟剛剛一樣,唯一不同的是,這一次只有一欄的資料,所以第二個 “選擇清單…索引值…” 方塊的索引值就填 1。
https://i.imgur.com/KAPgM5G.png
你再試試看可不可行
Shrimp
老師 您好
跟您報告一下,您指導的兩個方法,第一個方法我試過了,是可行的…唯一的缺點是,資料面實際上雖然是馬上更新的,但是用APP抓取資料多多少少會延遲,請看下圖:
https://imgur.com/a/OT8PUIw
這個問題您的文章有提到過,我之前自己做其他APP抓取資料的時候也有發現,用google sheet當後台的會有這個缺點,影響是不大。
———————————-
至於第二個方法,其實我還是不懂原理,為何索引值是填1? 第一個方法原理我懂,其實就是因為我有兩個欄位,實際要抓取金額的在第二個欄位,所以索引值填2,這沒有問題,再來就是為何可以持續抓取最新資料? 原因是因為有先求清單的長度,每次更新後,清單長度就會有變化,清單長度4,在抓取資料的時候索引值2 且長度為4的資料,自然就是最新資料; 不知道我這樣理解正不正確…
其實我本來的打算是11個科目金額各建立一個sheet,各自隨時上傳及抓取資料,但是自己經由你的第一個方法指導之後,其實我可以用一個sheet就好,只要索引值依序加1就好,2、3、4…..
再次感謝老師指導。
JamesBang
你好,其實第二種方法的原理和第一種的一模一樣,差別就在第一種方法會讀取所有欄位的資料,但第二種方法我們可以自己選擇要讀取哪些欄位。
這兩種方法所讀取到的資料格式都是相同的,都是二維清單,也就是清單裡再放清單,範例如下:
[[“時間”,”金額”], [“09/26″,”1000”], [“09/27″,”3000”]]
你的理解大致沒錯!第一個方塊的索引值用「求清單的長度…」,是為了抓到最後一筆資料,因為是二維清單,所以我們抓到的最後一筆資料也是一個清單,以上述範例為例:
第一個方塊執行後會抓到最後一筆清單資料,如下:
[“09/27″,”3000”]
然後你想要顯示的資料,是這個清單的第 2 項的金額,所以我們在第二個方塊的索引值就填 2,最後就會顯示 3000。
那麼使用第二種方法,因為我只有抓金額欄位的資料,所以讀取到的資料就是:
[[“金額”], [“1000”], [“3000”]]
要記住這也是二維清單
第一個方塊會抓到:
[“3000”]
因為這一筆清單只有一個資料,所以我們在第二個方塊的索引填 1,就會抓到 3000。
—————————————–
最後……
如果第一種方法你可以用在專案的話,那麼第二種方法也一定可以,而且第二種更加方便!如果今天你只要抓欄位 B、D 的資料,SQL 語法只要下 select B,D 就可以了!你就不用把所有資料都讀進來再做篩選。
如果第二種方法熟悉之後,你甚至不需要把所有資料都讀進來再抓最後一筆,你可以在下 SQL 語法時,就直接抓最後一筆資料!!
Shrimp
老師
十分感謝你的指導,我已經成功熟練第一種方法了,第二種方法找時間研究,原本我的專案需求的是11個科目能做到即時顯示最新餘額,現在擴增到專案首頁的公告顯示,請看下圖(兩張):
https://imgur.com/a/SLiNdOJ
我的公告最多支援4條,可以新增或刪除,但又不是真正意義上的新增、刪除,套用你教我的方法變通,刪除的話傳空字串上去即可,下載的時候自由會有一條公告是下載到空字串,其實不是作者本來根本看不出來是空字串,跟刪除差不多意思了,哈
JamesBang
水喔!只要能達到需求,任何方法都是好方法,如有不足之處再慢慢修改。😄
有任何 App Inventor 的問題都歡迎再來留言詢問
祝你順心如意!!👍
Shrimp
要來研究先前你說的需要用到java script 的方法,這才是我最想用的方法😂
如果成功了,我會再來分享給你