自製臺灣新冠肺炎即時疫情資料圖報表

/自製臺灣新冠肺炎疫情資料圖報表/每日本土確診.png

臺灣新冠肺炎疫情資料圖報表(自動更新):https://docs.google.com/spreadsheets/u/1/d/1-a1njGi0h-j5sO80rhmgQZfpI8c2oA_sY5tuXGCNRjo/edit

前言

五月中情爆發以後,每日各家媒體報導的資訊雖更新飛快,但又十分紛亂。每篇報導內的資料,格式與詳盡程度各有不一,讓人不好消化。因此便蒙生了自己製做圖表來呈現制式的資料,讓自己可以不需要再收看吵雜的新聞報導。

原始資料

在行政院衛生福利部疾病管制署的資料開放平臺上,有公布新冠肺炎疫情的原始資料

原始資料可直接匯入 Google 試算表,如下圖所示:

自製臺灣新冠肺炎疫情資料圖報表/原始資料.png

製做圖表

原始資料的資訊量過於龐大,透過一些公式濃縮統整並以圖表呈現,可以讓資料更容易被閱讀。我將原始資料匯入自製的試算表後,另外又開了三張表單,分別在裡面呈現「每日新增本土確診數」、「縣市分布」及「年齡分布」。

自製臺灣新冠肺炎疫情資料圖報表/每日本土確診.png

自製臺灣新冠肺炎疫情資料圖報表/縣市分布.png

自製臺灣新冠肺炎疫情資料圖報表/年齡分布.png

至此,對於掌握疫情數據,已經不需要收看新聞了。不過因為原始資料每日都會更新,所以還需要想辦法自動定期將最新的資料匯入這份試算表,才能保持這份試算表內資訊的時效性。

自動更新原始資料

Google 在 Apps Script 提供了定時執行自訂程式的服務。可以透過這個服務,自動定時執行匯入最新原始資料的工作。

下面是用以更新試算表內原始資料的程式碼:

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
var spreadsheetSourceUrl = "https://docs.google.com/spreadsheets/d/1-a1njGi0h-j5sO80rhmgQZfpI8c2oA_sY5tuXGCNRjo/edit";
var csvDataSourceUrl = "https://data.cdc.gov.tw/download?resourceid=3c1e263d-16ec-4d70-b56c-21c9e2171fc7&dataurl=https://od.cdc.gov.tw/eic/Day_Confirmation_Age_County_Gender_19CoV.csv";
var dataSheetName = "原始資料";

function getParsedContents(csvUrl) {
return Utilities.parseCsv(UrlFetchApp.fetch(csvUrl));
}

function clearSheetContentsByUrl(spreadsheet, sheetName) {
let sheet = spreadsheet.getSheetByName(sheetName);
sheet.clearContents();
}

function updateSheet(spreadsheet, sheetName, rangeDescription, contents) {
let sheet = spreadsheet.getSheetByName(sheetName);
let range = sheet.getRange(rangeDescription);
range.setValues(contents);
}

function tweakFormat(spreadsheet, sheetName, contents) {
let sheet = spreadsheet.getSheetByName(sheetName);

let range = sheet.getRange(`${String.fromCharCode(64+contents[0].length-1)}2:${String.fromCharCode(64+contents[0].length-1)}${contents.length}`);
range.setNumberFormat("@");

range = sheet.getRange("B2:B");
range.setNumberFormat("yyyymmdd");
range.setNumberFormat("@");
range.setNumberFormat("########");
}

function main() {
Logger.log("Getting source data");
let parsedContents = getParsedContents(csvDataSourceUrl);
Logger.log(parsedContents);
Logger.log(`Source data got, number of rows in the CSV: ${parsedContents.length}`);

if (parsedContents.length == 0) {
Logger.log("ERROR: source is empty");
return;
}

let spreadsheet = SpreadsheetApp.openByUrl(spreadsheetSourceUrl);

Logger.log("Clearing the existing contents from the sheet");
clearSheetContentsByUrl(spreadsheet, dataSheetName)
Logger.log("Content cleared from the sheet");

Logger.log("Updating the sheet");
updateSheet(
spreadsheet,
dataSheetName,
`A1:${String.fromCharCode(64+parsedContents[0].length)}${parsedContents.length}`,
parsedContents);
Logger.log("Sheet updated");

Logger.log("Post update tweak started");
tweakFormat(spreadsheet, dataSheetName, parsedContents)
Logger.log("Post update tweak completed");
}

在 Apps Script 中創建一個 Project,並將程式碼貼上:

自製臺灣新冠肺炎疫情資料圖報表/Apps-Script-1.png

自製臺灣新冠肺炎疫情資料圖報表/Apps-Script-2.png

或直接在此取得。

再到 Triggers 頁籤加入一個每小時的觸發工作:

自製臺灣新冠肺炎疫情資料圖報表/Apps-Script-3.png

如此一來,試算表內的原始資料就會一小時自動更新一次,以後都不用再手動更新資料了。