本程式碼原始由網路上收集而來,但我已經忘記原本的作者是誰,我也做過許多修改。
股票資料來源是「 台灣證券交易所 」提供的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}

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

基於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")'

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

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