実現したいこと
GASで新規上場株式の銘柄コードからその株の公開価格を自動で取得したい。
前提
・A列に銘柄コードが約100社分入ってる(1行目は見出し)
・B列にその銘柄の公開価格を入力したい(1行目は見出し)
・スクレイピングするサイトは「minkabu.jp」
・サイトにおける各銘柄のページは「minkabu.jp/stock/銘柄コード/ipo」で指定可能
・スクレイピングにはGASのParserライブラリを使用
・GAS歴は1か月ほど
発生している問題・エラーメッセージ
Cannot read property 'slice' of undefined
該当のソースコード
GAS
1function getOfferingPrice() { 2 3 let ss = SpreadsheetApp.getActiveSheet(); 4 5 //公開価格を取得する配列 6 let offeringPriceArray = []; 7 8 //A列に銘柄コードが入っている行数を取得 9 let lastRow = ss.getRange("A:A").getValues().filter(Number).length; 10 11 for (let row = 2; row <= lastRow + 1; row++) { 12 13 //A列のコードを順番に取得 14 let code = ss.getRange(row, 1).getValue(); 15 let codeToString = code.toString(); 16 17 let url = 'https://minkabu.jp/stock/' + codeToString + '/ipo'; 18 19 let response = UrlFetchApp.fetch(url,{'muteHttpExceptions':true}); 20 let html = response.getContentText('UTF-8'); 21 22 //タグで指定してごっそりスクレイピング 23 let parserDataArray = Parser.data(html) 24 .from('<dd class="ly_col tar ly_colsize_3">') 25 .to('</dd>').iterate(); 26 27 //parserDataArrayに入ってるデータのうち9番目のデータが公開価格 28 //「let offeringPrice = parserDataArray[8]」だけだと「1,000百万円」などという形式なので、 29 単位を除いて抽出すべく末尾3文字をslice 30 let offeringPrice = parserDataArray[8].slice(0, -3); //★エラー箇所 31 32 //2次元配列化 33 offeringPriceArray.push([offeringPrice]); 34 } 35 //公開価格をB列に出力 36 ss.getRange(2, 2, offeringPriceArray.length).setValues(offeringPriceArray); 37 } 38}
試したこと
(1)slice()
の直前の部分が未定義とのエラーだったことから、
let offeringPriceText = parserDataArray[8]; let offeringPriceNum = offeringPriceText.slice(0, -3)
などとしてみましたがダメでした。
(2)行数を減らして試していたところ、for文の条件をfor (let row = 2; row <= 10; row++)
として時にうまく動きました。ただ20以上になるとやはり動きませんでした。
ご回答いただきたいこと
解決のためのコードのほかに、もし可能であれば、
・エラーメッセージが言っている意味
・なぜ「試したこと(2)」の場合にうまく動いたのか
...などもお伺いできれば大変勉強になります。
多少専門的な説明でも、調べながら理解したいと思いますので、ご回答よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー