GASのスクレイピング情報をif(.match//)でフィルタリングしたい
スクレイピングで得たデータから、GASで関西のお出かけイベント情報を抽出するプログラムを書こうとしたところ、「広告の情報と神戸市以外の情報を削除する」というif分の挿入で躓いてしまいました。
問題点をご教授頂きたいです。
また、全体的に改善点などありましたら加えて教えていただけますと幸いです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
シート状に残ってほしい神戸市のイベント情報も消えてしまいます。
該当のソースコード
GAS
1// シートの指定. 2let spreadsheet = SpreadsheetApp.openById('ID'); 3// 対象シート 4let sheet = spreadsheet.getSheetByName('events_info'); 5 6function get_title_link() { 7 8 deleteAll(); 9 10 // 対象ページのURL 11 let getUrl = '"URL"'; 12 13 //次へボタンがあるなら繰り返し 14 let tugie = true 15 while (tugie == true) { 16 17 // htmlをテキスト情報にして抽出 18 let html = UrlFetchApp.fetch(getUrl).getContentText(); 19 20 if (html.match('a class="next_page"')) { 21 let tmp = Parser.data(html).from('<a class="next_page"').to('</a>').build() 22 tmp = Parser.data(tmp).from('page=').to('&').build() 23 24 getUrl = "'URLの文字列'" 25 26 } else { 27 tugie = false 28 } 29 30 31 32 // イベントのタイトルを抽出 33 let title_list = Parser.data(html).from('<h3 class="c-grid__title c-link--underline p-event-list__title">').to('</h3>').iterate(); 34 // 開催期間を抽出 35 let time_list = Parser.data(html).from('<div class="c-container--xs u-text--bold u-text--orange_e">').to('</div>').iterate(); 36 // 開催場所を抽出 37 let place_list = Parser.data(html).from('<div class="c-container--xs u-text--sm u-text--gray_8"><i class="icon-place c-icon--left c-icon--lg"></i>').to('</div>').iterate(); 38 39 // 最終行を取得 40 let lastrow = sheet.getLastRow(); 41 // 書き込む行は最終行の次の行から 42 let recordrow = lastrow + 1; 43 // 過去の記録を確認 44 let oldurl_list = []; 45 let start = 1; 46 for (let i = start; i <= lastrow; i++) { 47 oldurl_list.push(sheet.getRange("C" + i).getValue()); 48 } 49 for (let i = title_list.length - 1; i >= 0; i--) { 50 if (oldurl_list.indexOf(title_list[i]) == -1) { 51 sheet.getRange("A" + recordrow).setValue(time_list[i]); 52 sheet.getRange("B" + recordrow).setValue(title_list[i]); 53 sheet.getRange("C" + recordrow).setValue(place_list[i]); 54 recordrow++; 55 } 56 } 57 delete_pr_rows(); 58 } 59} 60 61//広告の情報と神戸市以外の情報を除外 62function delete_pr_rows() { 63 let data = sheet.getDataRange().getValues(); 64 let length = data.length; 65 66 for (let i = length - 1; i >= 0; i--) { 67 let pr_keyword = data[i][1]; 68 let other_place = data[i][2]; 69 70//広告情報は<i class="icon-prから始まります。 71 if (pr_keyword.match(/<i class="icon-pr/)) { 72 sheet.deleteRow(i + 1); 73 } 74//上のif文だけなら正常に動いたのですが、以下2行を追加すると不要行まで消去されてしまいました。 75 if (!other_place.match(/神戸市/)){ 76 sheet.deleteRow(i + 1); 77 } 78 79 } 80} 81 82//データクリア 83function deleteAll() { 84 sheet.deleteRows(2,100); 85}
試したこと
for文を外側に作ったり、functionを追加したりしました。
webで調べるたところできるだけ少ない入れ子のほうが処理的に良いとのことだったので、このような形になりました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー