用spreadsheet爬資料、配公式,做出有視覺設計的「世大運獎牌數統計」

宋育泰
7 min readJan 27, 2018

--

spreadsheet做世大運獎牌數統計,成果圖

在新聞媒體近期的重要大事就是「世大運」!除了新聞、影片、照片,數據也是重要的一環。做新聞網站難免需要出這種圖,但每天都更新三次,實在是件恐怖瑣碎事。如上表,有三十格數字要改&核對;國旗、國名要挪動;更新截止時間要修改,一次要花掉不少時間。記錄一下要怎麼用spreadsheet公式抓資料、用vlookup把國旗圖檔插入表格、用公式判斷讓更新時間自己變動!

Spreadsheet公式抓資料
=importhtml(網址,清單/表格,第幾個內容)

這次的公式長這樣:=importhtml(“https://data.2017.gov.taipei/atos/prod/eng/zz/engzz_general-zzm095v.htm”,“table”,0)

獎牌數的網址可在官網上找到,但大家看到的頁面A是用iframe嵌入一個頁面B,頁面B又是用javascript去頁面C把數據讀進來。所以要找到頁面C需要花一點時間摸索。做爬蟲也是這樣子,需要「觀察」與「摸索」。

然後,你可以取得一個如官網的spreadsheet表格 [1]:

對世大運獎牌數網頁 importhtml 的結果

Spreadsheet公式 知道英文國名,要搭配中文名、圖片位址 =vlookup(被比對項目,比對範圍,範圍的第幾欄,false)

接著整理一份表格,第一欄是已知的英國國名,然後搭配中文名、國旗圖片的網址:

vlookup要用的 英文國名 圖片位址 中文國名表格

這個清單不用準備太多,前十名大概也就前15名在更動吧,先準備這些起來。用意:

  1. 我們從官網抓資料,一定會知道英文國名,是我們重要的key值。但是排名一定會調換,所以要用=vlookup() 即時把國旗圖位址、中文國名帶著跑。
  2. 例如第二名是Japan的話,找出圖片位址就是 =vlookup(“Japan”,$T$1:$W$15,2,false)
  3. 要找出Japan的中文名的話就是 =vlookup(“Japan”,$T$1:$W$15,3,false)
  4. Japan在實際使用會是指定儲存格的方式,因為我們跑資料的時候,我們確切知道那個儲存格是放第二名的英文國名就好,不需要知道第二名是誰,反正,公式會自動幫我們跑好。
  5. $T$1:$W$15是指完全鎖定在這個範圍,把公式往下、往左複製都不會跑掉。
  6. 找圖片網址是2、找中文國名是3,代表他們分別在T、U、W這1 , 2, 3欄的順序 (sorry我中間隱藏了一欄)
  7. false代表精準比對,true代表模糊比對,但我始終不知道什麼時候用得上模糊比對,或許沒緣吧。

實際看一下使用狀況吧:

vlookup公式運用
  1. 第一列是去轉置importhtml抓來的最新資料,所以排名會隨時更動
  2. 第二、三列是用vlookup依據第一列的英文國名,把對應的國旗圖檔位址、中文國名抓出來

利用這個參照對應,做出會依數據更動的插入圖片、中文國名的功能。

Spreadsheet公式把直表格轉成橫表格
=transpose(範圍)

上圖有看到一個 =transpose()。這公式不會很複雜,輸入要轉向的範圍。我得到了一個如主圖一樣的橫表格,我把vlookup插在第二列、第三列:

還沒美化的圖表表格資料

運用想像力,是不是跟主圖很像了?!

spreadsheet做世大運獎牌數統計成果

有人會說,轉置資料我也會啊!右鍵 > 選擇性貼上 > 轉置資料 就好了!但這代表每更新一次資料,也得手動轉置一次……

Spreadsheet公式插入圖片
=image(網址,4,高度,寬度)

我把還沒美化的資料用參照的方式放到新的分頁來做美工,這樣就不怕動到公式了 [2]。也趁機把圖片網址用公式引入成圖片。

例如南韓國旗圖的位置就是「Sheet!你去raw這個分頁的I3這一格找連結!」然後圖片是高60、寬70(4代表可以修改圖片尺寸的模式)

=image(raw!I3,4,60,70)

拆解一下過程:

raw!I3 =
vlookup($I1,$T$3:$V$22,2,false) =
“http://img5.cna.com.tw/www/WebPhotos/400/20170822/5456834.png” [3]

=image() 跟用功能列 插入 > 圖片有什麼不一樣?!用公式是把圖設定在儲存格中,不能移動,但是插入圖片功能像是在畫面上貼了一張圖,可以方便移動排版,但沒有依名次變動的可能性。

關於資料更新時間
=text(時間, 顯示格式)
=concatenate(句子第一部分,句子第二部分…)

圖片最上方有一句:「資料更新至:8/22 22:30」也可以用公式處理。簡單點來做就是:

=concatenate(“獎牌數更新至:”,text(now(),“mm/dd hh:mm”))

=concatenate() 是接句子的公式,可以用來接文字、數字、公式,讓你的spreadsheet變化超大的,非常推薦認識這個公式!

=text()是用來清整時間格式的公式,時間包含年、月、日、時、分、秒…記一下格式的寫法可以很方便讓公式算出來的日期符合你要的樣子。例如:

“yy/mm/dd” -> 17/08/23

“yyyy/m/d” -> 2017/8/23

“yymmdd hhmm”-> 170823 0851

有人可能會想,那我用兩個儲存格一格寫字,一格抓時間不行嗎?當然可以啊,只是排版可能比較要花功夫調整了。

剩下的就是像一般的excel、word一樣了,插入logo、設定底色、表格邊線等樣式設定囉!就交給專業的設計吧吧吧…

之後要用圖片,就螢幕截圖…還蠻快的…

注1:importhtml() 使用Google服務去網站抓資料,如果一直開著試算表,定時會自動去抓一次資料;或是重複開啟檔案、反覆設定importhtml公式,都會被算到使用量。如果短時間內使用過多,Google會暫時暫停服務。遇到就知道了。

注2:transpose() 是陣列公式的一種,如果它輸出範圍的任一儲存格有資料,會出現錯誤,所以換頁利用是保險的做法(經驗談)。

注3:=’raw’!I3 是換頁參照儲存格的寫法,寫法: 分頁名 ! 儲存格號,英數分頁名可以不用引號

--

--

宋育泰
宋育泰

Written by 宋育泰

a.k.a 宋卡波,想要寫些python、spreadsheet、ga & gtm,以及一些數據清理的自學大叔。

No responses yet