質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1519閲覧

Google Apps Scriptでcheeriogsを使用してスクレイピングした結果を配列にして、スプレッドシートに反映させたい。

akawo

総合スコア23

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/10/13 12:37

▼目的
Google Apps Scriptでcheeriogsを使用してスクレイピングした結果を配列にして、スプレッドシートに反映させたい。

▼エラー内容
Exception: データの列数が範囲の列数と一致しません。データは 1 列ですが、範囲は 5.列です。(行 19、ファイル「コード」)

▼自分の考え
function scraper(url)で保存した一次元配列を、function reflect_scraper()にてループ処理にて一次元配列に一次元配列を追加して、二次元配列を作成し、それをセルに反映させるという流れを想定しておりました。

ログを見ると下図のように配列の括弧が多くなっており、うまくいってない模様ですので、現在進行形で解決方法を探しているところです。

イメージ説明

▼コード

Google

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}

引き続き問題解決できるように調べていきますが、何かアドバイスいただければ幸いです。。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

scraper(url)の返り値に設定している下図のresultに不要な括弧が入っていたため、配列がおかしくなっておりました。。。凡ミスです。

イメージ説明

自己解決とさせていただきます!
お騒がせいたしました。

投稿2020/10/13 14:51

akawo

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問