Googleスプレッドシートには googlefinance
関数が用意されており、現在の株価を取得することができる。例えば、Alphabet(Googleの持株会社)の株価であれば、以下のように =googlefinance("NASDAQ:GOOG")
と入力すると取得できる。NASDAQ
は証券取引所コード、GOOG
は証券コードを表している。
しかし、googlefinance
関数は日本の株式には対応していない。例えば、任天堂の株価(証券取引所コード: TYO、証券コード: 7974)を取得しようとして同じように入力してもエラーになってしまう。
同じように株価を取得できるような関数を、Google Apps Script を利用して作ってみた。
やったこと
株価は googlefinance
関数と同様にGoogleファイナンスから取得することにし、個別の株のページから株価を取得する形で実装している。
Googleファイナンスからのスクレイピング
Googleファイナンスでは、個別の株のページのURLは以下の形式になる。
https://www.google.com/finance/quote/<証券コード>:<取引所コード>
試しに任天堂のページを表示させてみると以下のようになる。このページから赤枠の株価の部分を取得する。
また、スクレイピングによる情報取得を行うため、robots.txt に以下の記載があり、許可されていることを確認した。
Allow: /finance
robots.txt については以下も参照。
関数を追加するために「拡張機能」>「Apps Script」からエディタを開く。
以下の処理を行うコードを作成した。
- 証券取引所コード(marketCode)と証券コード(stockCode)を与え、個別の株のページのURLを生成する。
- 個別の株のページで
<div class="YMlKec fxKbKc">
で囲まれている箇所(価格が表示されている箇所)から文字列を取得して返す。
function getStockPrice(marketCode, stockCode) { let url = 'https://www.google.com/finance/quote/' + stockCode + ':' + marketCode; let html = UrlFetchApp.fetch(url).getContentText(); let price = Parser.data(html) .from('<div class="YMlKec fxKbKc">') .to('</div>') .build(); return price; }
スクレイピングのため、4行目で Parser ライブラリを利用している。画面左側の「ライブラリ +」からライブラリの追加画面を開き、以下のParserのスクリプトIDを入力して検索、追加する。
1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
Parser 本体のコード等は以下から確認できる。
https://script.google.com/home/projects/1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
Googleスプレッドシートで関数を利用する
Google Apps Script で作成しただけでは、Googleスプレッドシートから実行した際にエラーになってしまうため、権限を付与する必要がある。「実行」を押すと権限の確認画面が出るので、「権限を確認」を押す。
「このアプリは Google で確認されていません」と表示されるが、ここで「安全なページに戻る」ではなく、「詳細」から「(安全ではないページ)に移動」を押すと権限付与の画面に移動する。画像で灰色で伏せている部分には、Google Apps Script を利用している(自分の)Googleアカウントが表示されている。
ここまで実施すると、Googleスプレッドシートで関数が使えるようになる。
注意事項
2022年4月25日時点では、Googleファイナンスは東京証券取引所のみ対応している。名古屋、札幌、福岡証券取引所で扱われている銘柄には対応していないため注意が必要。データ表示にも20分の遅延があり、リアルタイムではない。
また、単純に株価を知りたいだけであれば、Googleファイナンスのページをそのまま確認すればよいのでここまで手間をかける必要はないのだが、同じ方法で株価のページから色々なデータをスプレッドシートに持ってくることはできるので、分析などの用途には使えそう。