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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Q&A

0回答

771閲覧

【GAS初心者】if(.match//){ .deleteRows }を複数設置したら発生した問題

kou_no_ji

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

0グッド

0クリップ

投稿2021/09/24 01:33

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問