2019年10月19日 星期六

【 .gs 應用】雲端試算表插入資料(Google spreadsheet import json)

這篇文章會教你我的思路,以及我的作法,提供初新者們(我自己也是初新者)一起探討.gs(google script)的應用和學習。 這個計畫是因為我自己有在操作台股,但是選股阿、買點啊、賣點啊一直都是很不科學的用我自己的主觀意識來操作,而且又要自己定時上去追蹤,就覺得很麻煩。剛好最近在使用雲端試算表玩出了一點心得(其實就.gs的教學),就想用雲端試算表【爬台股】加【分析資料】加【定時提醒】,所以就開始上網爬文,找一些資料,到目前是完成一半,但是會持續更新...就持續追蹤我的部落格吧

STEP1 當然是上網查有沒有人已經做過相關的事情

關鍵字打google sheet 就找到這個超簡單台股爬蟲,他裡面的code雖然是用python來做,但是就發現有寫到去『https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + datestr + '&type=ALL』這個網址抓資料,二話不說先把https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=20191018'&type=ALL打進網址列去試試看(把datestr改成一個台股有開盤的日期),真的可以下載一個.csv檔案也!那最簡單的爬蟲目標我們就找到了,以後就天天上來抓資料,或是一次抓好幾個月的資料都可以用這個網址做了

STEP2 有了目標接下來就是想辦法輸入google spreadsheet摟

一樣上網google關鍵字,就發現輸入google試算表的方式有很多,可以用表單內建的函式,也可以用指令編輯器,那我就選擇用指令碼編輯器吧(因為我發現指令碼編輯器是用javascript語法串連google已經寫好的很多函式,都可以直接套用非常方便)。而且他的教學裡面有一個範例檔案裡面的功能很多,就把它一一應用上去吧

STEP3 應用查到的功能:增加工具列選單

先開一個新的試算表,並且為他命名,然後點工具>指令碼編輯器>從function開始把下面這串碼給貼上

function onOpen() {
   var spreadsheet = SpreadsheetApp.getActive();
   var menuItems = [
     {name: '爬今天台股', functionName: 'stockcrowler'}
   ];//增加一個選項
   spreadsheet.addMenu('爬台股', menuItems);//在工具列增加一個選單
}
//下一段放這邊

然後就給他按儲存,他會叫你為他命名,那就叫"台股爬蟲script"吧。存擋好了以後,按執行按鈕,他會要求權限,那就順著步驟把所有存取權限都打開(登入>跳出“這個應用程式未經驗證”>按進階>按"前往「台股爬蟲script」(不安全)">“允許”),接著會跳回原本的編輯頁面,並且出現黃框框,顯示正在執行函式,跑完以後,回到原本的試算表按重新整理,就發現工具列多了一個選單!!

STEP4 應用查到的功能:增加新表單

回到指令碼編輯器,把下面的程式碼貼上在剛剛的下面,要在}之後喔,不是貼在剛剛的函式裡面

function stockcrowler(){
//抓日期
Date.prototype.yyyymmdd = function() {
   var mm = this.getMonth() + 1; // getMonth() is zero-based
   var dd = this.getDate();

   return [this.getFullYear(),
     (mm>9 ? '' : '0') + mm,
     (dd>9 ? '' : '0') + dd
     ].join('');
};
var date = new Date().yyyymmdd();
// Create a new sheet.
   var spreadsheet = SpreadsheetApp.getActive();
   var sheetName = date;
   var directionsSheet = spreadsheet.getSheetByName(sheetName);
   if (directionsSheet) {
     directionsSheet.activate();
     Browser.msgBox('Error', Utilities.formatString('今天資料已經建立!'), Browser.Buttons.OK);
   } else {
   directionsSheet = spreadsheet.insertSheet(sheetName, spreadsheet.getNumSheets());
}
//下一段放這邊 }

接著就是存擋,然後回去試算表重新整理,然後按按看爬蟲,看能不能成功建立新表單了!

STEP5 應用查到的功能:抓取資料

這個part真的比較難,我也是上網查的,如何抓資料,我發現UrlFetchApp有這個功能,反而不是用上面的SpreadsheetApp,這也是為什麼我覺得用指令碼編輯器好的原因

//抓當天資料

   var Url = "https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date="+date+"&type=ALL";
   var response = UrlFetchApp.fetch(Url);
     content=response.getContentText();
   var data = JSON.parse(content);

//貼上試算單
   var data2range =data.data1.length+1;
   var data3range =data.data2.length+1;
   var data4range =data.data3.length+1;
   var data5range =data.data4.length+1;
   var data6range =data.data5.length+1;
   var data7range =data.data6.length+1;
   var data8range =data.data7.length+1;
   var data9range =data.data8.length+1;
   directionsSheet.getRange(1, 1, data.data1.length, data.data1[0].length).setValues(data.data1);
   directionsSheet.getRange(data2range, 1, data.data2.length, data.data2[0].length).setValues(data.data2);
   directionsSheet.getRange(data3range, 1, data.data3.length, data.data3[0].length).setValues(data.data3);
   directionsSheet.getRange(data4range, 1, data.data4.length, data.data4[0].length).setValues(data.data4);
   directionsSheet.getRange(data5range, 1, data.data5.length, data.data5[0].length).setValues(data.data5);
   directionsSheet.getRange(data6range, 1, data.data6.length, data.data6[0].length).setValues(data.data6);
   directionsSheet.getRange(data7range, 1, data.data7.length, data.data7[0].length).setValues(data.data7);
   directionsSheet.getRange(data8range, 1, data.data8.length, data.data8[0].length).setValues(data.data8);
   directionsSheet.getRange(data9range, 1, data.data9.length, data.data9[0].length).setValues(data.data9);
   Logger.log(data.length);

這段要放在上一段的註釋那邊。這邊要講一下因為一開始查的時候那個網址是用.csv的格式,但是輸入的時候要分析資料放進去儲存格裡面,所以後來就把它改成response=json,配上JSON.parse就能把資料分開輸入。後面要注意的是range一定要定義的跟資料長度一樣,才能成功輸入。最後記得一樣要儲存後回去試算表,要把今天日期的頁籤給刪除,因為有寫一個如果有爬過就先不再重新執行的判斷式。然後再按爬蟲,給他新的授權。

p.s.如果它顯示無法開啟網址,有可能是今天沒有開盤喔。

到這邊其實要紀錄的差不多了,接下來要做的是就再陸續更新...

沒有留言:

張貼留言