▼目的
Google Apps Scriptでcheeriogsを使用してスクレイピングした結果を配列にして、スプレッドシートに反映させたい。
▼エラー内容
Exception: データの列数が範囲の列数と一致しません。データは 1 列ですが、範囲は 5.列です。(行 19、ファイル「コード」)
▼自分の考え
function scraper(url)で保存した一次元配列を、function reflect_scraper()にてループ処理にて一次元配列に一次元配列を追加して、二次元配列を作成し、それをセルに反映させるという流れを想定しておりました。
ログを見ると下図のように配列の括弧が多くなっており、うまくいってない模様ですので、現在進行形で解決方法を探しているところです。
▼コード
1 2function reflect_scraper() { 3 4var Activesheet = SpreadsheetApp.getActiveSpreadsheet(); 5var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート3'); 6var lastRow = sheet.getLastRow(); 7var all 8 9 for(let i = 1; i <= lastRow-1; i++){ 10 var url = sheet.getRange(i+1,4).getValue(); 11 12 if(all === undefined){ 13 all = scraper(url) 14 }else{ 15 all.push(scraper(url)) 16 } 17} 18 19console.log(all); 20sheet.getRange(2, 5, all.length, all[0].length).setValues(all); 21} 22 23 24 25 26function scraper(url) { 27 var result = []; 28 var per, price_current, before_ratio, quarter_eps_ago, quarter_eps_current; 29 var options = { 30 'muteHttpExceptions': true, 31 'followRedirects': false, 32 }; 33 34 try { 35 url.toString().trim(); 36 var r = UrlFetchApp.fetch(url, options); 37 var c = r.getResponseCode(); 38 // check for meta refresh if 200 ok 39 if (c == 200) { 40 var html = r.getContentText(); 41 var $ = Cheerio.load(html); 42 43 if ($('.deltaType-positive').eq(1).text()) { 44 quarter_eps_ago = $('.deltaType-positive').eq(1).text(); 45 }else{ 46 quarter_eps_ago = "no data" 47 } 48 49 if ($(".deltaType-positive").eq(0).text()) { 50 quarter_eps_current = $(".deltaType-positive").eq(0).text(); 51 }else{ 52 quarter_eps_current = "no data" 53 } 54 55 if ($('.marketDelta.noChange').eq(7).text()) { 56 per = $('.marketDelta.noChange').eq(7).text(); 57 }else{ 58 per = "no data" 59 } 60 61 if ($('.cr_num.diff_percent').eq(0).text()) { 62 before_ratio = $('.cr_num.diff_percent').eq(0).text(); 63 }else{ 64 before_ratio = "no data" 65 } 66 67 if ($('.curr_price', '.crinfo_quote').text()) { 68 price_current = $('.curr_price', '.crinfo_quote').text(); 69 }else{ 70 price_current = "no data" 71 } 72 73 } 74 result.push([price_current, before_ratio, quarter_eps_current, quarter_eps_ago, per]); 75 } catch (error) { 76 result.push(error.toString()); 77 } finally { 78 return result; 79 } 80}
引き続き問題解決できるように調べていきますが、何かアドバイスいただければ幸いです。。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。