こんにちは。趣味グラマのNobu(@nm_aru)です。
スプレッドシートで投資データ管理をしている人もいると思います。
私もその一人なのですが、スプレッドシートで日本株の管理を行う時に、現在の株価の取得で困っていた事が遂に解決したので、ブログに書いておきます。
スプレッドシートでは日本株の株価取得が困難
スプレッドシートにはGOOGLEFINANCEという便利な関数が用意されていますが、残念ながら日本株の株価は取得ができません。
そこで、代わりの方法として良く紹介されるのは、IMPORTXML関数を使う方法です。
IMPORTXML関数は、XPathで対象のデータを簡単に持ってこれるので素晴らしいのですが、なぜか私の環境では、昔は動いたのですが、最近では殆ど取得が出来なくなってしまいました。(物凄く遅いか、エラーになってしまう)
独自の株価取得関数をスクリプトエディタで作る
そこで、スクリプトエディタに独自の株価取得関数を作る事にしました。
作った関数はこれです。とても短く簡単です。
function getStockValue(stockCode) { | |
var code = String(stockCode).split(',')[0]; | |
var url = 'https://minkabu.jp/stock/'; | |
var res = UrlFetchApp.fetch(url + code); | |
if(res.getResponseCode() == 200) { | |
var value = Parser.data(res.getContentText()).from('<div class="stock_price">').to('<span class="decimal">').build(); | |
return value.trim().replace('.', ''); | |
} else { | |
return '取得失敗'; | |
} | |
} |
使い方を説明します。
1. Parserライブラリを追加する
下記の記事を参考に、スプレッドシートにParserライブラリを追加します。

2. 独自関数をスクリプトエディタに追加する
下記の記事を参考に、先ほどの関数をスクリプトエディタに追加します。
3. セルに独自関数を設定する
=IFERROR(getStockValue(証券コード), 0)
こんな感じで、式をセルに入れるだけです。
IFERRORを使っているのは、株価の取得が完了するまで「0」を表示しておくためです。
私の場合は、このキャプチャのように「証券コード,銘柄名」というセルを作り、そのセルを参照するように関数を呼び出しています。
日本株は、米国株と違って証券コードだけだと何の銘柄か分からなくなってしまいます。
そこで、証券コードの後ろにカンマで区切れば、どんな文字が入っても大丈夫な作りにしてあるため、私は会社名を入れるようにしています。
もちろん、証券コードだけでも判別がつくという人は、証券コードだけでも大丈夫です。
まとめ
以前から日本株の株価が取得出来ず困ってはいたのですが、なぜか自分で作るという発想が出てこず、手作業で更新したりしていました。
しかし、いざ作ってみれば10分もかからず作れてしまったので、もっと早くに気付けば良かったです。
趣味グラマたるもの、手作業はなるべく撲滅していかないとですね。
コメント
有用な情報ありがとうございます!
私も同じくIMPORTXMLが非常に重くあてにならないのでGASで自作しました。
Parserライブラリの存在を知らなかったのでRegExpの正規表現とreplaceで目的の個所をひねり出すのに苦労しましたw もっと早く知りたかったですw
UrlFetchAppは一日当たりの実行回数制限があるのでほどほどのところで抑えないといけませんね。
スプレッドシートによる投資情報の管理方法など興味あるので記事にしていただけるのをお待ちしています!
ロンさん
参考になって良かったです!
私もParserライブラリは今回始めて知ったので、知らなければ同じく正規表現で何とかしていた可能性大です(笑)
> UrlFetchAppは一日当たりの実行回数制限があるのでほどほどのところで抑えないといけませんね。
確かに。私はあまり日本株を持っていないので気にしてなかったのですが、UrlFetchAppは1日20,000回の制限があるので、日本株を沢山持っていて、1日に何度もチェックする必要がある場合は要注意ですね。
ただ、その前に株価取得元のサービスに迷惑をかけてしまうので、そもそも大量取得には向きませんが…。
今後もよろしくお願いします(^^)