[GAS] GoogleSpreadSheet のGASで日本企業上位1000社の時価総額を取得

Google SpreadSheet はとても便利にデータをまとめることができます
今回、はじめてGASを利用してデータの取得をしたので、ソースコードとともに使い方の解説を載せておきます

#スプレッドシートの準備

GASの利用にあたり、スプレッドシートを用意します
<img width="1385" alt="スクリーンショット 2019-09-14 22.40.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/90dad99a-718e-0479-0e25-4bce2d144a28.png">


ツールを押し、スクリプトエディタを起動します


<img width="1385" alt="スクリーンショット 2019-09-14 22.41.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/9aa938ba-c1e0-a4a9-5e71-e5de929a2241.png">


起動させたら、このような画面になっているはずです


<img width="1255" alt="スクリーンショット 2019-09-14 22.42.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/08b5ddd2-b1db-813e-ca9a-f5fff1ef420f.png">


ここからGASを利用してデータの取得をしていきます

#GASの利用

今回用意したスプレッドシートとGASのプログラムを先に載せておきます
簡単な作業の流れの説明の後に、ソースコードの説明をしていきます

<img width="1255" alt="スクリーンショット 2019-09-14 23.09.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/03242426-2b37-7f75-dabb-3a123edf5c8c.png">



<img width="1255" alt="スクリーンショット 2019-09-14 23.42.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/72ffbde6-062d-b05b-e5ff-56605cccaf01.png">



##スプレッドシートの中身
順位、業界、コード、市場、名称、時価総額

の順に並んでいます


時価総額以外のところはすでに用意していました



##今回やりたいこと
毎日時価総額を自動で更新してくれるスプレッドシートの作成



##早速コードの解説と作成の仕方へ



####基本的な解説はコメントの中に書いているので、GASでスクレイピングをする際に使用したライブラリの使い方を説明していきます


今回使用したのはスクレイピングを簡単にするライブラリのParserというものです
※詳しい説明はこちらをご覧ください
https://www.kotanin0.work/entry/2019/01/06/200000


まずは リソース > ライブラリ の順に開きます



<img width="1255" alt="スクリーンショット 2019-09-14 23.17.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/af074b2b-0622-5eda-69d9-eb40bfc14dbd.png">


開いたら、下に書いてあるキーを入力します
> M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV

<img width="1255" alt="スクリーンショット 2019-09-14 23.22.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/5f95d78e-8ab4-c4c2-df67-2ab798ebae6e.png">

キーの入力をし、ライブラリを追加したら、バージョンを選んで完了です


####前準備が完了したので、コードの解説に入ります

基本的にコード内にコメントとして解説を書いていきます


スクレイピングをするにあたり重要なのは、どこのwebサイトから情報を引っ張ってくるか、です

今回はみんかぶさんから情報を引っ張ってきています
理由として、Yahoo!ファイナンスはスクレイピングを禁止しているため、こちらのサイトを選びました

スクレイピングをやりすぎたら罪に問われることもあるので注意！！


では、コードと一緒に解説をしていきます


```js
//今回は二つの関数を使用しています
//まずはJikaを実行します

function Jika() {
  // 取得した株価を出力するBookを定義
  const book = SpreadsheetApp.getActiveSpreadsheet()
   
  // 出力先のBookのシートを定義
  const sheet = book.getSheetByName("シート1");
    //シート名を間違えるとエラーが出るので注意
  
  //証券コードの読み込み
  var bango = sheet.getRange('c2:c1001').getValues();
  //今回はc列に証券コードを集めているので、証券コードが書かれている1行目から範囲指定しています
  var array = [];
    
  
  //1000社分のループを回す
  for(var i = 0; i < 1000; i++) {
    //下のurlと繋げるため、文字列にする
    var num = bango[i].toString();
    //stokPrice関数を呼び出す
    var marketValue = [stockPrice(num)];
    
    //二次元配列として格納していく
    array.push(marketValue);
  }

  //最後にf列に時価総額を反映させる
  sheet.getRange('f2:f1001').setValues(array);
}


function stockPrice(code) {
  //証券コードごとにurlを作る
  var url = 'https://minkabu.jp/stock/' + code;
  
  //ページ全てを取得する
  var response = UrlFetchApp.fetch(url);
  var html = response.getContentText('UTF-8');
  
  //fromとtoにタグを書き、その間にあるデータを取得する
  //今回はテーブル内のデータだったのでfromとtoの中身に日本語が入っていますが、これで大丈夫です
  var data = Parser.data(html).from('時価総額</th><td class="tar wsnw">').to('百万円</td>').build();
  return data;
}
```


###完成したシートがこちらになります
<img width="1255" alt="スクリーンショット 2019-09-14 23.47.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/68bc19ed-d518-8c6c-1f55-d25fbb31fb7c.png">

これで毎日更新される！！！

(...手作業ならね)


これを自動化したい！！！
どうにか簡単にいかないものか！！

そんな悩める子羊たちもGASは救ってくれます

###自動化の流れ
GASエディタに戻り、
左上のタイマーボタンを押します
<img width="1255" alt="スクリーンショット 2019-09-14 23.52.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/19ac31be-d33b-c9c8-1dbc-31fa39df6699.png">


すると、このような画面が出てくるはずです
<img width="1435" alt="スクリーンショット 2019-09-14 23.53.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/83b3138f-3446-cfa7-7bac-118490d2afc1.png">


トリガーを作成しましょう！！

トリガーの作成を押して出てきた画面で次のように選択します
<img width="1435" alt="スクリーンショット 2019-09-14 23.55.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/8a575d1f-4062-be14-bb41-4ce2e4fd4025.png">

これでようやく、
「Jikaを毎日、朝の3~4時に自動で実行して時価総額を引っ張ってくる」
ようになりました！！！！

ぱちぱちぱち


##最後に

こちらのサイトには大変お世話になりました
１日でGASを使えるようになったのもこのサイトのおかげです
ありがとうございます！
https://tonari-it.com/gas-script-editor/

####注意
ソースコードは、1000社分の証券コードを抜いて実行するぞ！！
という形になっていますが、GASさんは6分たつと自動でプログラムを終了してしまいます

僕のコードだと、100社で1分ほどかかります
なので、僕はスクリプトエディタを二つ作り、1~500と501~1000に分けて使っています
(1~500を朝の3~4時に、501~1000を朝の4~5時に実行する設定にしています）

もし、1000社分一気にいっても余裕！！という案があればぜひ教えていただきたいです


##追記
間違って実行してしまった場合、その処理が終わるまで次の処理には入れないので手動で処理の中断をする術を記しておきます

上記のトリガー設定同様タイマーボタンを押します
<img width="1435" alt="スクリーンショット 2019-09-14 23.53.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/83b3138f-3446-cfa7-7bac-118490d2afc1.png">

左の実行数というところをクリックします
<img width="1435" alt="スクリーンショット 2019-09-19 16.18.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/25e1dd3f-b3f8-9dbb-4ea1-ae512c958b04.png">

出てきた画面の実行中という列の右端にある「...」が縦に並んだ場所をクリックするとこの画面になります

<img width="1435" alt="スクリーンショット 2019-09-19 16.18.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/c37748d4-b5b6-cc3e-aa78-fcb9f0a26e27.png">

終了するかの確認画面になるので、そこで「終了」を押します


<img width="1435" alt="スクリーンショット 2019-09-19 16.19.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362795/a439f22b-adaf-06bb-dded-5fe13b1cf1a7.png">

ステータスが「キャンセルされました」に変わっていればOKです！

再度実行したい関数を実行しましょう！

楽しいスクレイピングライフを！