โพสนี้ผมจะมาแจก Template และ script สำหรับดึงข้อมูลหุ้นจาก Yahoo Finance แบบง่ายๆครับ

จริงๆต้องบอกว่าใน Google Sheets นั้นเราสามารถใช้ฟังชั่นที่ชื่อว่า GOOGLEFINANCE ในการดึงข้อมูลหุ้นต่างๆมาได้ เพียงแต่ว่าข้อมูลหุ้นไทยหรือข้อมูลหุ้นหลายๆประเทศจะไม่สามารถดึงข้อมูลได้นั้นเองครับ
ก็เลยเป็นที่มาว่าเราก็ต้องไปหาวิธีอื่นๆถ้าเราอยากจะดึงข้อมูลหุ้นของประเทศไทยให้สามารถอัพเดทราคาได้แบบอัตโนมัติใน Google Sheets ของเรา
ซึ่งก็ต้องบอกว่าวิธีการดึงข้อมูลราคาของหุ้นไทยนั้นจริงๆก็มีหลากหลายวิธีเลยครับ แต่ในโพสนี้ผมจะมาแจก Template ที่เราสามารถดึงราคาจากเว็บ Yahoo Finance ซึ่งเป็นเว็บที่มีข้อมูลหุ้นมากมายเกือบทั่วโลก ทำให้ค่อนข้างสะดวกถ้าเราเป็นนักลงทุนที่ลงทุนในหุ้นต่างๆทั่วโลกนั้นเองครับ

โดยวิธีการดึงข้อมูลจากหน้าเว็บ Yahoo Finance นี้ ผมได้ใช้วิธีการสร้าง Google App Script ที่จะทำการเรียก API ของ Yahoo Finance และทำการดึงข้อมูลตัวเลขที่ได้จาก API มายังชีทของเรานั้นเองครับ
โดยวิธีการใช้งานนั้นเราก็แค่เพียงทำการเอา script ดังต่อไปนี้ไปวางในชีทของเรา
/**
* ฟังก์ชันสำหรับดึงข้อมูลหุ้นจาก Yahoo Finance Chart API
* @param {string} symbol รหัสหุ้น เช่น "BBIK.BK", "AAPL", "GOOGL"
* @param {string} field ชื่อ field ที่ต้องการ เช่น "price", "marketcap", "volume"
* @return {any} ค่าของ field ที่ระบุ
* @customfunction
*/
function GET_YAHOO_DATA(symbol, field) {
if (!symbol || !field) {
return "กรุณาใส่รหัสหุ้นและ field";
}
try {
const apiUrl = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}`;
const response = UrlFetchApp.fetch(apiUrl, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
},
muteHttpExceptions: true
});
if (response.getResponseCode() !== 200) {
return `API Error: ${response.getResponseCode()}`;
}
const data = JSON.parse(response.getContentText());
if (!data.chart || !data.chart.result || data.chart.result.length === 0) {
return "ไม่พบข้อมูลหุ้น";
}
const result = data.chart.result[0];
const meta = result.meta;
if (!meta) {
return "ไม่พบข้อมูล meta";
}
// แปลง field name ให้เป็น standardized format
const normalizedField = field.toLowerCase().replace(/[_\s]/g, '');
// ค้นหาค่าจาก field ที่ระบุ
const value = findFieldValue(meta, normalizedField);
if (value !== null && value !== undefined) {
return value;
}
return `ไม่พบข้อมูล: ${field}`;
} catch (error) {
console.error('Error fetching Yahoo Finance data:', error);
return "เกิดข้อผิดพลาด: " + error.toString();
}
}
/**
* ค้นหาค่าจาก meta data ตาม field ที่ระบุ
*/
function findFieldValue(meta, field) {
// Field mappings สำหรับข้อมูลที่มีใน Chart API
const fieldMappings = {
// ราคาและการเปลี่ยนแปลง
'price': meta.regularMarketPrice || meta.previousClose,
'previousclose': meta.regularMarketPreviousClose || meta.previousClose,
'change': meta.regularMarketPrice && meta.regularMarketPreviousClose ?
meta.regularMarketPrice - meta.regularMarketPreviousClose : null,
'changepercent': meta.regularMarketPrice && meta.regularMarketPreviousClose ?
((meta.regularMarketPrice - meta.regularMarketPreviousClose) / meta.regularMarketPreviousClose * 100) : null,
// ข้อมูลการซื้อขาย
'daylow': meta.regularMarketDayLow,
'dayhigh': meta.regularMarketDayHigh,
'volume': meta.regularMarketVolume,
'avgvolume': meta.averageDailyVolume10Day,
// ข้อมูลบริษัท
'marketcap': meta.marketCap,
'sharesoutstanding': meta.sharesOutstanding,
// ข้อมูลช่วงเวลา
'52weekhigh': meta.fiftyTwoWeekHigh,
'52weeklow': meta.fiftyTwoWeekLow,
'movingaverage50': meta.fiftyDayAverage,
'movingaverage200': meta.twoHundredDayAverage,
// ข้อมูลเพิ่มเติม
'currency': meta.currency,
'exchange': meta.exchangeName,
'timezone': meta.timezone,
'symbol': meta.symbol,
'instrumenttype': meta.instrumentType,
// ข้อมูลเวลา
'tradingperiod': meta.currentTradingPeriod ? meta.currentTradingPeriod.regular : null,
'gmtoffset': meta.gmtoffset,
// ข้อมูลราคาพิเศษ
'premarket': meta.preMarketPrice,
'afterhours': meta.postMarketPrice
};
return fieldMappings[field] || null;
}
/**
* แสดงรายการ fields ที่สามารถใช้ได้จาก Chart API
* @return {Array} รายการ fields ที่ใช้ได้
* @customfunction
*/
function GET_AVAILABLE_FIELDS() {
const fields = [
['ราคาและการเปลี่ยนแปลง', 'price, previousclose, change, changepercent'],
['ข้อมูลการซื้อขาย', 'daylow, dayhigh, volume, avgvolume'],
['ข้อมูลบริษัท', 'marketcap, sharesoutstanding'],
['ข้อมูลช่วงเวลา', '52weekhigh, 52weeklow, movingaverage50, movingaverage200'],
['ข้อมูลเพิ่มเติม', 'currency, exchange, timezone, symbol, instrumenttype'],
['ข้อมูลราคาพิเศษ', 'premarket, afterhours']
];
return fields;
}
/**
* ทดสอบการทำงานของ function
*/
function testFunction() {
console.log("=== Testing GET_YAHOO_DATA (Chart API Only) ===");
// ทดสอบข้อมูลพื้นฐาน
console.log("AAPL Price:", GET_YAHOO_DATA("AAPL", "price"));
console.log("AAPL Market Cap:", GET_YAHOO_DATA("AAPL", "marketcap"));
console.log("AAPL Volume:", GET_YAHOO_DATA("AAPL", "volume"));
console.log("AAPL Day High:", GET_YAHOO_DATA("AAPL", "dayhigh"));
console.log("AAPL 52 Week High:", GET_YAHOO_DATA("AAPL", "52weekhigh"));
console.log("AAPL Currency:", GET_YAHOO_DATA("AAPL", "currency"));
// ทดสอบกับหุ้นไทย
console.log("--- Thai Stocks ---");
console.log("BBIK.BK Price:", GET_YAHOO_DATA("BBIK.BK", "price"));
console.log("BBIK.BK Market Cap:", GET_YAHOO_DATA("BBIK.BK", "marketcap"));
console.log("BBIK.BK Change %:", GET_YAHOO_DATA("BBIK.BK", "changepercent"));
// แสดงรายการ fields ที่ใช้ได้
console.log("--- Available Fields ---");
const fields = GET_AVAILABLE_FIELDS();
for (let i = 0; i < fields.length; i++) {
console.log(`${fields[i][0]}: ${fields[i][1]}`);
}
}
และหลังจากนั้นก็ให้ทำการ save และเรียกใช้ function ที่ชื่อว่า GET_YAHOO_DATA ใน Google Sheets ของเราดังรูปนี้ได้เลยครับ

โดยในตัวอย่างนี้เป็นการเรียก function GET_YAHOO_DATA เพื่อจะดึงข้อมูลราคาของหุ้น BBIK.BK นั้นเองครับ ซึ่งในส่วนของตัวแปรใน function นี้จะมีที่เราต้องใส่ก็คือตัวย่อของหุ้น (สามารถหาได้จากหน้าเว็บ Yahoo Finance) และ ข้อมูลที่เราต้องการที่จะดึงมา
โดยในส่วนของข้อมูลที่เราสามารถดึงได้จะมีตามตารางดังต่อไปนี้เลยครับ

หรือถ้าใครที่ไม่อยากจะทำการ copy script มาวาง ก็สามารถทำการ download template ได้จากลิงค์ด้านล่างนี้ได้เลยนะครับ
🔗 Link download Template ดึงราคาจาก Yahoo Finance
ปล. วิธีการดึงข้อมูลในโพสนี้เป็นการดึงข้อมูลผ่าน API ซึ่งอาจจะมีการจำกัดจำนวนครั้งในการดึงข้อมูลในแต่ละวัน รวมถึง API อาจจะมีการเปลี่ยนแปลงในอนาคต ถ้ากรณีที่ API ใช้งานไม่ได้แล้วก็สามารถติดต่อผมได้ที่เพจบริหารงานแบบคนไอทีได้เลยครับ
💳 ชอบคลิปที่ช่วยเพิ่มประสิทธิภาพการทำงานแบบนี้สามารถสมัครสมาชิกช่องได้ที่
https://www.youtube.com/channel/UChxmhkD8uSSzUOkfMO_p5oQ/join
🎥 อุปกรณ์ที่ผมใช้
กล้อง Sony ZV-E10 kit 16-50mm
Mouse Logitech MX Master 3s
MacBook Air M2
ไมค์ wireless Saramonic Blink 500
เก้าอี้ Anda Seat X-Air Pro Ergonomic Gaming Chair
แขนจับจอ Anda Seat Stealth A6L Ergonomic Monitor Arm
ไมโครโฟน AKG Lyra
ไฟส่องหน้าจอ Xiaomi Light Bar