แจก Template ดึงข้อมูลหุ้นจาก Yahoo Finance

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

Screenshot

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

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

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

Screenshot

โดยวิธีการดึงข้อมูลจากหน้าเว็บ 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 ของเราดังรูปนี้ได้เลยครับ

Screenshot

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

โดยในส่วนของข้อมูลที่เราสามารถดึงได้จะมีตามตารางดังต่อไปนี้เลยครับ

Screenshot

หรือถ้าใครที่ไม่อยากจะทำการ 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

Leave a Reply

Your email address will not be published. Required fields are marked *