Google 試算表透過 Apps Script 抓「台灣證券交易所」股價資訊

更新 發佈閱讀 12 分鐘

本程式碼原始由網路上收集而來,但我已經忘記原本的作者是誰,我也做過許多修改。

股票資料來源是「 台灣證券交易所 」提供的API

例如我要取得(上市) 2330 台積電股價,只要抓取「 https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw&json=1&delay=0&_=20250825162321 」就可以得到以下JSON資料:

{"msgArray":[{"@":"2330.tw","tv":"2460","ps":"2305","pid":"9.tse.tw|14550","pz":"1170.0000","bp":"0","fv":"53","oa":"1175.0000","ob":"1170.0000","m%":"000000","^":"20250825","key":"tse_2330.tw_20250825","a":"1175.0000_1180.0000_1185.0000_1190.0000_1195.0000_","b":"1170.0000_1165.0000_1160.0000_1155.0000_1150.0000_","c":"2330","#":"13.tse.tw|2090","d":"20250825","%":"14:30:00","ch":"2330.tw","tlong":"1756103400000","ot":"14:30:00","f":"901_3104_2469_1466_1173_","g":"23_953_1245_930_867_","ip":"0","mt":"000000","ov":"29514","h":"1180.0000","i":"24","it":"12","oz":"1175.0000","l":"1160.0000","n":"台積電","o":"1165.0000","p":"0","ex":"tse","s":"2460","t":"13:30:00","u":"1245.0000","v":"25021","w":"1025.0000","nf":"台灣積體電路製造股份有限公司","y":"1135.0000","z":"1170.0000","ts":"0"}],"referer":"","userDelay":5000,"rtcode":"0000","queryTime":{"sysDate":"20250825","stockInfoItem":3890,"stockInfo":486,"sessionStr":"UserSession","sysTime":"16:25:23","showChart":false,"sessionFromTime":1756103475118,"sessionLatestTime":1756103475118},"rtmessage":"OK","exKey":"if_tse_2330.tw_zh-tw.null","cachedAlive":1660}
raw-image

再例如,我要取得(上櫃)00687B 國泰美債20年,只把網址改一下:「 https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=otc_00687B.tw&json=1&delay=0&_=20250825162321

raw-image

基於JSON資料於是我們寫了以下程式碼:

/* https://mis.twse.com.tw/stock/fibest.jsp?stock=2330 台灣證券交易所 */
function get_stock_price(code,gettype,ot) {
 
  //code="2330"
  //gettype = "z"
  //ot = "tse" //tse:上市;otc:上櫃;
  if (ot== ""){ ot = "tse" }
  try {  
    var headers = {"User-Agent":"Mozilla/5.0"}
    var options_step2 = {"method":"get","headers":headers,"timeout":50000}    
    //var now = Date.now()
    // 取得現在日期&時間
    var date = new Date();
    var year = date.getYear()+1900;
    var month = date.getMonth() + 1;  if(month.toString().length==1){var month = '0'+month;}
    var day = date.getDate(); if(day.toString().length==1){var day = '0'+day;}
    var hour = date.getHours(); if(hour.toString().length==1){var hour = '0'+hour;}
    var minu = date.getMinutes(); if(minu.toString().length==1){var minu = '0'+minu;}
    var seco = date.getSeconds(); if(seco.toString().length==1){var seco = '0'+seco;}
    var datestr = year+month+day+hour+minu+seco;

    //var url = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch="+ot+"_" + code + ".tw&json=1&delay=0&_=" + now.toString()
    var url="https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch="+ot+"_"+code+".tw&json=1&delay=0&_="+datestr
    var re_step2 = UrlFetchApp.fetch(url, options_step2)

    /* 取得資料後,整理回傳到Google試算表 */
    var data = JSON.parse(re_step2.getContentText())

    //var stockinfo = new FORMAT()
    //stockinfo.recentprice = data.msgArray[0].z  /* 最近成交價 */
    //stockinfo.tempvol = data.msgArray[0].tv  /* 當盤成交量 */
    //stockinfo.totalvol = data.msgArray[0].v  /* 今日成交量 */
    //stockinfo.best5saleprice = data.msgArray[0].a  /* 最佳五檔賣價 */
    //stockinfo.best5salevol = data.msgArray[0].f  /* 最佳五檔賣量 */
    //stockinfo.best5buyprice = data.msgArray[0].b  /* 最佳五檔買價 */
    //stockinfo.best5buyvol = data.msgArray[0].g  /* 最佳五檔買價 */
    //stockinfo.crawltime = data.msgArray[0].t  /* 資料時間 */
    //stockinfo.datatime = data.msgArray[0].tlong  /* 資料時間 */
    //return stockinfo

    if (gettype == "z") // 回傳最近成交價
    {
    if(data.msgArray[0].z == "-")
    { // 當最近成交價 不存在時
      // 用五檔賣價最高或五檔買價最低來代替
      buy_5 = data.msgArray[0].b.split("_");
      if(buy_5[0] == "-") // 但是沒有人買 跌停
      {
        sell_5 = data.msgArray[0].a.split("_");
        if(parseFloat(sell_5[0]) == 0)  // 市價買入 漲停
        {
          return parseFloat(sell_5[1])
        }
      else
        {
          return parseFloat(sell_5[0])
        }
      }
      else if(parseFloat(buy_5[0]) == 0)  // 市價買入 漲停
    {
        return parseFloat(buy_5[1])
      }
      else
      {
        return parseFloat(buy_5[0])
      }
    }
    else
    {
      return parseFloat(data.msgArray[0].z)
    }
    }
  else if(gettype == "n"){ // 回傳股票簡稱
    return data.msgArray[0].n
    }
    else if(gettype == "y") // 回傳昨日收盤價
    {
      return parseFloat(data.msgArray[0].y)
    }
    else{
      return ""
    }
  }
  catch(e){
    // Logger.log(e);
    //Handle error e here
    // Parse e to get the response code
    return e;
  }
}

要取得(上市)2330 台積電的股價就用公式'=get_stock_price("2330","z","tse")'

raw-image

要取得(上櫃)00687B 的股票名稱就用公式'=get_stock_price("00687B","n","otc")'

raw-image

如此本程式可以替代 GOOGLEFINANCE 不能抓 「上櫃」股票的資訊的遺憾,但從證交所抓也是常常會抓不到。。。。想不花錢抓即時股價,真難!

留言
avatar-img
留言分享你的想法!
avatar-img
天空
1會員
24內容數
如果可以無所事事的放空,那才是真的幸福?
天空的其他內容
2025/08/25
首先建立一個交易紀錄表: 紀錄表裡有「股票代號、股票名稱、交易帳戶、上市/上櫃、個股/ETF/ETN、交易日期、單價、交易股數、價金、交易手續費、證交稅、合計金額、庫存數量、備註」 「股票代號」為股票上市公司在證交所的代號。 「股票名稱」為代號所對應的股票名稱,「上市」的台灣股票利用 GOO
Thumbnail
2025/08/25
首先建立一個交易紀錄表: 紀錄表裡有「股票代號、股票名稱、交易帳戶、上市/上櫃、個股/ETF/ETN、交易日期、單價、交易股數、價金、交易手續費、證交稅、合計金額、庫存數量、備註」 「股票代號」為股票上市公司在證交所的代號。 「股票名稱」為代號所對應的股票名稱,「上市」的台灣股票利用 GOO
Thumbnail
2024/12/11
2021年時除了開始投資台灣股市外,我也開了eToro帳戶。 eToro主打可以用信用卡小額入金,再加上開戶相當方便和快速,買賣不用手續費。 eToro更有一個相當有趣跟單系統,你可以選擇eToro上的任何一個投資明星,依該投資者的持股比例去跟單。 在2022年2月台灣金管會對eToro進
Thumbnail
2024/12/11
2021年時除了開始投資台灣股市外,我也開了eToro帳戶。 eToro主打可以用信用卡小額入金,再加上開戶相當方便和快速,買賣不用手續費。 eToro更有一個相當有趣跟單系統,你可以選擇eToro上的任何一個投資明星,依該投資者的持股比例去跟單。 在2022年2月台灣金管會對eToro進
Thumbnail
2024/11/29
寫在最前面: 投資有風險,入市須謹慎。您在進行任何投資決策時,應充分評估自身的風險承受能力,並深入了解所投資標的的相關資訊。過去的表現不代表未來的結果,請根據自身情況謹慎行事。切勿輕信市場資訊,理性投資,方能保障自身的資金安全。 這是已經執行3年的投資計畫: 開始執行日期是2021年11月08
Thumbnail
2024/11/29
寫在最前面: 投資有風險,入市須謹慎。您在進行任何投資決策時,應充分評估自身的風險承受能力,並深入了解所投資標的的相關資訊。過去的表現不代表未來的結果,請根據自身情況謹慎行事。切勿輕信市場資訊,理性投資,方能保障自身的資金安全。 這是已經執行3年的投資計畫: 開始執行日期是2021年11月08
Thumbnail
看更多
你可能也想看
Thumbnail
投資理財內容聲明 文內如有投資理財相關經驗、知識、資訊等內容,皆為作者個人分享行為。 有價證券、指數與衍生性商品之數據資料,僅供輔助說明之用,不代表創作者投資決策之推介及建議。 閱讀同時,請審慎思考自身條件及自我決策,並應有為決策負責之事前認知。 希望您能從這些分享內容汲取投資養份,養成獨立
Thumbnail
投資理財內容聲明 文內如有投資理財相關經驗、知識、資訊等內容,皆為作者個人分享行為。 有價證券、指數與衍生性商品之數據資料,僅供輔助說明之用,不代表創作者投資決策之推介及建議。 閱讀同時,請審慎思考自身條件及自我決策,並應有為決策負責之事前認知。 希望您能從這些分享內容汲取投資養份,養成獨立
Thumbnail
對於剛接觸Python程式的使用者來說,要一口氣學會爬蟲可能相對困難,但若想即時且輕鬆獲得台股相關數據,你可以利用證交所所提供的API進行數據蒐集。只需要簡單幾行程式碼,就能輕鬆抓到台股上千支股票的每日資訊,是不是棒呆了!!
Thumbnail
對於剛接觸Python程式的使用者來說,要一口氣學會爬蟲可能相對困難,但若想即時且輕鬆獲得台股相關數據,你可以利用證交所所提供的API進行數據蒐集。只需要簡單幾行程式碼,就能輕鬆抓到台股上千支股票的每日資訊,是不是棒呆了!!
Thumbnail
這是一份每週投資筆記,記錄了投資事情、股票表現以及未來操作策略。文章中還包含了市場爭論、未來技術趨勢和特斯拉股東會等內容。
Thumbnail
這是一份每週投資筆記,記錄了投資事情、股票表現以及未來操作策略。文章中還包含了市場爭論、未來技術趨勢和特斯拉股東會等內容。
Thumbnail
因為工作的關係,需要在EXCEL產生和台股有關的資訊。 要抓取台股的方式有很多,譬如說用EXCEL 現在的功能從網頁匯入,但是畢竟愛寫程式的人就是因為懶,不想每次都用滑鼠點點點,所以就想要如何用VBA克服。 還好研究了一下,備齊以下幾個工具,就可以了。 (1)要有一個可以解析JSON格式的Li
Thumbnail
因為工作的關係,需要在EXCEL產生和台股有關的資訊。 要抓取台股的方式有很多,譬如說用EXCEL 現在的功能從網頁匯入,但是畢竟愛寫程式的人就是因為懶,不想每次都用滑鼠點點點,所以就想要如何用VBA克服。 還好研究了一下,備齊以下幾個工具,就可以了。 (1)要有一個可以解析JSON格式的Li
Thumbnail
台股籌碼的盤勢觀察中,主要以現貨、期貨和選擇權等不同的籌碼面向進行每日的分析,以掌握市場的變化。同時,透過指數貢獻度的觀察,清楚地了解盤勢的控盤走向。此外也將技術面和主力籌碼面結合,以篩選出市場中的重點股,這有助於更全面地理解市場動態。
Thumbnail
台股籌碼的盤勢觀察中,主要以現貨、期貨和選擇權等不同的籌碼面向進行每日的分析,以掌握市場的變化。同時,透過指數貢獻度的觀察,清楚地了解盤勢的控盤走向。此外也將技術面和主力籌碼面結合,以篩選出市場中的重點股,這有助於更全面地理解市場動態。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News