【祿】邁向財務「自由」之路:建立專屬且免費的自動化軍隊1(下篇)

副題:Google Sheets自動六合彩彩池到價電郵提示 Step-by-Step 更可引發無限應用可能

續上篇

2. 建立一段能將彩池及日期以電郵發出的程式碼

上回講到我們已經建立了一張 Google Sheet 能自動從馬會網頁取得下期六合彩的彩池金額以及下期搞珠日期的資訊。

要讓 Google Sheets 發出電郵,需要在 Google Sheets 寫幾行簡單的程式碼,告訴 Sheets 電郵的受文者、主旨和內容。

首先打開「Tools」之下的「Script Editor…」:



在新頁面的左上方先隨便給予這個 Script File 一個新名字,就叫 MarkSix Email 吧。也可以同時將程式碼編輯空間內預設的子程式名稱,改成自己喜歡的名字。例如筆者叫它做 sendMarkSix



程序第一步,是指示 Script 需要存取的是哪個 Google Sheet 試算表的哪一張 Sheet。這時我們回到 Google Sheets並留意網址列,當中能找到Locate 這張 Sheet SheetID(讀者的 SheetID 肯定跟這張是不同的,每一張試算表的 ID 都是唯一的):



回到 Script Editor,在 sendMarkSix 子程式內輸入以下兩行,定義 Script 存取的試算表 sheet

    var spreadsheet = SpreadsheetApp.openById("1b9trFT7cQgft0h4kkhLIQ1_b56kzUWj2_k1cez6_70g");
    var sheet = spreadsheet.getSheetByName("Sheet1");

其中第一行紅色的部分是剛才取得的SheetID,而第二行則是試算表的名稱,可在試算表底部找到。

之後就是根據試算表的內容撰寫自動化電郵了。定義以下的變數(受文者、主旨、內容):

    var Receiver = "xxx@xx.com";
    var Subject = "下期六合彩彩池 " + sheet.getRange("A1").getValue() + " @ " + sheet.getRange("A2").getValue();
    var Body = "";

主旨中的 A1 A2 分別就是彩池金額和下期搞珠日期。由於這電郵很簡單,資訊一句就能交代完成,所以筆者並不介意將所有資訊放在主旨列,內容留白。

好了,現在萬事區備,只欠一聲發送電郵的號令:

    MailApp.sendEmail(Receiver, Subject, Body);

整個發送電郵的程序就寫完了。現在可以按動 Run(並容許程序取得相關的資源執行,例如以你的名義發送電郵),一切順利的話,你應該能在Receiver 所指定的電郵郵箱收到一封電郵:



不過筆者還有一個要求。筆者對獎金太低的六合彩搞珠沒有興趣,所以不希望每一期都收到電郵提示,只有彩池達到 4千萬以上的才通知我(要不然要私人秘書來做甚麼?)

這時候我們可以定義一個獎金的變數,然後指示當獎金超過某個數額的時候才發電郵(股票到價提示就是用這個技巧了):

    var Jackpot = sheet.getRange("B1").getValue();
 
    if (Jackpot > 40000000){ 
        MailApp.sendEmail(Receiver, Subject, Body);
    }
               
最後,作為一位有責任的編程員,記得寫下 Comments 方便日後參考。





3. 建立指示讓程式碼在搞珠日後的午夜運行

最後這一步是最簡單的。六合彩搞珠在每星期二、四、六的晚上舉行,所以在搞珠日後的午夜執行程式,應該可以確保馬會已更新下期六合彩資訊,同時給予我們足夠的時間購買下一期六合彩。

Script Editor 介面按下時鐘 icon [Current Project's Triggers]。新增三個 Trigger,分別指示程序自動在星期三、五及日的子夜執行:



按「儲存」就可以。


至此,整個系統已經大功告成!當然這只是一個很簡單的系統,若然當下幫得上忙的話筆者固然高興,但筆者更希望見到的是這小小的兩篇介紹,能啟發讀者開發更深入的系統,將日常的投資和生活重複的工序自動化,以騰出寶貴的時間予做運動和其他讓身體健康的事情,以享受與家人朋友共聚的心靈富足時間,以及財務自由應所帶來真正的自由。


如果讀者希望直接取得原檔,可以在本頁留言處留下電郵地址,也歡迎彼此切磋交流。

36 則留言:

  1. very interesting, 呢兩篇文章配合 ETNET應該好有用, 先收下來珍藏。

    回覆刪除
  2. 我之前都想用 GOOGLE SHEET 去監測一D股票, 不過 GOOGLE 自定既 FUNCTION 有好多都有 限制又或者有D資料 MISSING 左 (例如 NAV)
    用IMPORTXML呢個方法只要搵到個 SOURCE, 就有可能做製作到一D自動監測工具。

    BTW, 我都係先生果班既學生, 得閒交流下 (我有你WHATSAPP XP)

    回覆刪除
    回覆
    1. 感謝二當家留言支持!名師果然出高徒 :)

      是的,Google Finance 的資料不盡齊全,尤其是港股,所以我現在只會用 GOOGLEFINANCE 函數取現價。嘗試過 AAStock 和 ETNet 都未能成功,我懷疑港交所有限制即時報價不可再轉射至第三方網站。至於有些不知為何 Google 不支援的外國股票、基金價格等等,我會用 XML 取 Bloomberg 報價。

      IMPORTXML 也有限制的,好像一頁不能超過1000個函數,幸好我似乎還沒有超出這個限制 ;)

      刪除
  3. 只要現價的話 GOOGLE FINANCE 便足夠了, 做得市場先生學生既應該都唔係即日鮮。
    只是在研究股票時我通常會參考過往價格, 過往P/E, P/B, 一些RATIO 等, GOOGLE FINANCE 在這方便的支援並不足夠。
    現在我是先用一些 SCREENING 的網站 (e.g. https://hk.investing.com/stock-screener/) 選一些股票後, 再參考ETNET 的過往幾年的資料(我覺得算是一個整理得比較好的網站), 有興趣再找相關年報用 EXCEL 計下數。

    最理想的情況是用 GOOGLE SHEET 監測一下理想的股票, 當出現合乎幾個條件後便發 EMAIL 通知, 不過應該好大工程。

    回覆刪除
  4. 炒即日鮮的話 GOOGLE FINANCE 絕對不夠,資料延誤 20分鐘⋯⋯

    我的做法是在 AAStock 取得如每股盈利、NAV、派息等資訊,然後再用 GOOGLE FINANCE 取現價,計算相對 real time 的 P/E、P/B、股息率等。ETNet 是更好的平台,但取資料有技術難度。

    我的經驗是,最大工程是如何將自己心中的選股條件量化、寫成 IF THEN ELSE。有了這些,編程反而沒有想像中困難。

    回覆刪除
  5. 是用 IMPORT XML 自動在AASTOCK 取得資料嗎? 還是要手動?
    量化條件我自己覺得還好, 主要是看 PB, CASH/PRICE, DIVIDEND 等幾個主要因數
    但要看以往的資料就麻煩多了。 如果再深入一點的還要參考 CCASS 及主席背景等等, 不過這些已經不是 GOOGLE FINANCE 的範圍

    回覆刪除
    回覆
    1. 是自動的,你可以輸入以下的試試:

      =importxml("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/basic-information?symbol=00087","//td[text()='每股淨資產值(港元)']/following-sibling::td/text()")

      刪除
    2. 關於如何運用歷史數據,我最近也在研發另一個更有效的系統(Google Sheet 以外的),下載 AAStock 的財務報表再計算不同的比率,目標是打一個股票號碼就出一個綜合評分和分部分數。待有所成後再公諸同好。

      刪除
    3. 想問下用importxmal import etnet 中的牛熊data,可以點搞:
      http://www.etnet.com.hk/www/tc/warrants/search_cbbc_hsi.php

      用過 IMPORTXML("http://www.etnet.com.hk/www/tc/warrants/search_cbbc_hsi.php","//td//a"), 但出來不是我想要的,其他回收價,街貨出唔到

      刪除
    4. 我猜你是想整個 Table 抄下來吧? 那乾脆 Target 整個 Table 就可以了。可嘗試這個:
      =importxml("http://www.etnet.com.hk/www/tc/warrants/search_cbbc_hsi.php","//table[@cellpadding=3 and @cellspacing=0]/tr")

      刪除
    5. hey it works. thank you so much

      刪除
    6. 不客氣,歡迎繼續交流! :)

      刪除
  6. this is very good article! i have to book mark and keep it for later use!!
    thanks so much for sharing!

    回覆刪除
    回覆
    1. 哈哈,心動,不如行動!Eve 可以從一些簡單的網站開始啊。

      有時我也會建立一些無聊的 Project 純粹為練習之用,例如是從環保署 Parse 下空氣質素健康指數,若現時或預測指數高過 8,我就不去跑步了。

      刪除
  7. 真係感謝師兄寫左呢篇文~
    簡單易明又易上手,好易setup!

    回覆刪除
    回覆
    1. 感謝星尼的讚賞!有機會讓我再分享多些祕技 :D

      刪除
  8. 感謝無私分享, 由於對程序編寫不是太懂, 但對Excel 擷取有深厚趣興, 近年改為用google sheets, 發覺更需要懂得少量程序編寫, 以達至擷取股票資訊, 再次多謝無私分享

    回覆刪除
  9. 請教一下, 如擷取http://www.nkcl.com.hk/change-ch.php,
    報價顯示為GIF, 以圖代數字, 正如六合彩一般,
    =importxml("http://www.nkcl.com.hk/change-ch.php","//table/tr"), 結果出來文字出來了, 匯價是空白, 如何可得出匯價呢?

    回覆刪除
    回覆
    1. NEILA 不用謝 :) 很高興分享的資訊能幫上忙或是有所啟發,這是作為 Blogger 最開心的!

      相信牛記用 GIF 圖的原因正正就是不希望我們容易 Parse 到匯率吧!方法還是有的不過要繞些路,就是讀上每一張 GIF 圖的檔案名稱。

      例如要讀到澳元的買入價,即在表格的第4行第3欄,可以用:
      =importxml("http://www.nkcl.com.hk/change-ch.php","//table/tr[4]/td[3]/img/@src")

      這時 Google Sheets 回傳:
      images/5.png
      images/vir.png
      images/9.png
      images/6.png
      images/5.png

      代表匯價是 5.965,從這一系列的值 Extract 數字和將「vir」轉換成小數點便可。這個步驟在 Google Script 寫自定函數會比較簡潔,NEILA 不妨研究一下 :)

      刪除
  10. 全家兄, 你這個blog有強大阿。請教一下,如果我想extract aastock 上的股票名稱要怎麼寫, 我試了很久都沒有成功,沒有經驗。 勞煩賜教

    =IMPORTXML("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/financial-ratios?symbol=06823", "//*[@id=""SQ_Name""]")

    回覆刪除
    回覆
    1. 對不起 Raymond,不知為何收不到 Blogger 提醒我舊文章留言的 Email。留言剛發表,我稍後看一下。謝謝支持!

      刪除
    2. 看過原始檔,看似 id="SQ_Name" 的部份是以 JavaScript 動態生成的,即 Google Sheets IMPORTXML 函數讀取時不會生成股票名稱,所以函數讀到的是空白(即讀到一個空白位置預留給 JavaScript 寫上)而不是 #N/A。

      不過也不需要繞很遠路。留意頁面的標題(「香港電訊-SS (06823.HK) - 財務比率 Financial Ratios」)正正有股票名稱。可以先取標題(例如到 Cell A1):

      =IMPORTXML("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/financial-ratios?symbol=06823", "//title")

      然後將其他文字清除,我用的是以下方法:
      =Trim(Left(A1,Find("(",A1)-2))

      刪除
  11. 感謝無私分享, 請教一下
    http://www.aastocks.com/tc/stocks/analysis/company-fundamental/profit-loss?symbol=06823
    我想在這一頁拿取"除稅前溢利" 的數字, 套用你上面分享的路徑,好像不行。可否指點一下,萬分感謝。=importxml("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/profit-loss?symbol=06823","//td[text()='除稅前溢利']/following-sibling::td/text()")

    回覆刪除
    回覆
    1. 對不起 Don,不知為何收不到 Blogger 提醒我舊文章留言的 Email。留言剛發表,我稍後看一下。謝謝支持!

      刪除
    2. 這個易解決。留意原始檔中「除稅前溢利」的 TD Tag 中文字前後有其他符號。簡單解決方法可以將「Text = X」改為「Text Contains X」,方法如下:

      =importxml("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/profit-loss?symbol=06823","//td[contains(text(),'除稅前溢利')]/following-sibling::td/text()")

      原理可以參考我另一篇 Blog 文:https://fukluksau.blogspot.com/2017/11/BloombergXPath.html

      刪除
  12. 萬分感謝! 終於解決了這個難題, 謝謝你的幫助!

    回覆刪除
  13. 我試過aastock, morningstart, google finance 也未能成功取得"收益率"data, 唔知大家用那個source最易成功呢?
    另外, google finance以前那個stock search function是否消失了? 以前可以sort by收益率, 市值等好方便...

    回覆刪除
    回覆
    1. Google Finance 已不再支援,所以選股要繞些路。收益率會隨著股價改變所以是較難抽的動態資訊。我會在 AAStock 基本數據頁面抽每股派息,然後自己計除數。

      刪除
  14. 非常實用的分享, 感謝!
    另請教一下,想從
    http://warrants-hk.credit-suisse.com/summary_cbbc_delta_c.cgi
    拿取"牛熊證街貨"的比例, 試過將
    //*@id="mainContent"]/div[5]/div[4]/table/tbody/tr[16]/td[2]/div/div[2]/div[1]/span換不同的參數,也不行。可否指點一下? Thx~~

    回覆刪除
    回覆
    1. Tony 兄多謝支持!
      CGI 頁面的話恐怕 GoogleSheet 秘書難以處理,ImportXML 函數只能對付簡單的靜態頁面。

      刪除
    2. 原來如此, 謝回答^^

      刪除
  15. 請教一下,我想提取
    https://www.interactivebrokers.com.hk/cn/index.php?f=1595
    的0-780,000港元貸款利息,但用importHTML或importXML,用上contains也不行, 可否指點一下,感謝!

    回覆刪除
    回覆
    1. IB 的軟件工程師明顯比 Bloomberg 的優秀,這個頁面用「非人類看」的瀏覽器一打開就會變成 404 page not found。智能秘書不是人類,所以看不到有利率資訊的頁面,只看到錯誤訊息,當然找不到利率了。

      刪除
  16. 你好, 如果我想在AASTOCK把整個table抄下來, 用以下的公式應該要怎樣改動才可以呢?
    =IMPORTXML("http://www.aastocks.com/tc/stocks/analysis/company-fundamental/profit-loss?symbol=02238","//*[@id="divContentContainer"]/div[6]/div[1]")
    謝謝

    回覆刪除
    回覆
    1. 由於 AAStock 表格的結構不是一個簡單的 Table,所以要花些功夫。
      閣下可先嘗試研究以下方程:
      =importxml(URL,"//td[contains(@class,'fieldWithoutBorder')]")
      其中 URL 是閣下的網頁。

      刪除

熱門文章