GASでhtmlを取得して解析してスプレッドシートに書き込む
サイトのhtmlを取得する
スプレッドシートからGoogle Apps Scriptを作成する
まずはスプレッドシートからスクリプトを作成します。
やり方がわからない人はこちらを参考にしてください。
htmlを取得するコード
UrlFetchApp.fetch
を使用してサイトのhtmlを取得できます。
本ページのhtmlを取得してコンソールに表示してみます。
function myFunction() { var url = "https://web.biz-prog.net/gas/gethtml.html"; var html = UrlFetchApp.fetch(url).getContentText(); console.log(html); }
コンソールログ欄に、取得したhtmlが表示されました。
※繰り返し文などによって同じサイトのhtmlを頻繁に取得すると、そのサイトに負荷がかかって迷惑をかけたり、
不正なアクセスとしてはじかれるかもしれません。
適度にアクセスの間隔を開けるようにしましょう。
htmlをパースしてデータを取得しやすくする
htmlのパース
htmlからデータを抽出する為にパーサーを使います。
パーサーとは、html等をプログラムで扱いやすいように解析・変換してくれるものです。
Google Apps Scriptでパースするには「Parserライブラリ」を使うのがおすすめです。
Parserライブラリを追加する
左のメニューから、ライブラリの+ボタンを押下します。
すると「ライブラリの追加」ダイアログが表示されるので、スクリプトIDのところに「1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw」を入力します。
そして検索ボタンを押下するとParserライブラリが表示されますので、追加ボタンを押下します。
Parserライブラリでデータを抽出する
Parserライブラリの使い方
Parserライブラリでは、from()
で指定した文字と、to()
で指定した文字の、
間に含まれる文字を抽出します。
例えば、
var data = Parser.data(html).from('<li>').to('</li>').build();
<li>
タグの中の文字列を抽出します。また、上記の指定をすることで一致するデータが複数件取得されますが、 先頭の1件の文字だけ抽出したい場合は
.build()
を使用し、
全件を取得するなら.iterate()
を使用します。
リンク(アンカータグ)のURLを取得するサンプル
リンクのurlを取得してみます。
以下のコードを入力して実行してください。
function myFunction() { var url = "https://web.biz-prog.net/gas/gethtml.html"; var html = UrlFetchApp.fetch(url).getContentText(); var parse = Parser.data(html); var links = parse.from('<a href="').to('"').iterate(); console.log(links); }
実行後、コンソールに抽出したurlの一覧が表示されます。
抽出したデータをスプレッドシートに出力する
出力先のスプレッドシートを指定する
出力先のスプレッドシートを指定します。
アクティブ(実行するGASと紐づいている)なスプレッドシートに出力する場合は、
SpreadsheetApp.getActiveSpreadsheet()
にてスプレッドシートを取得します。
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
アクティブなスプレッドシートではなく、別のスプレッドシートを指定する場合、
SpreadsheetApp.openById()
によりIDを指定してスプレッドシートを取得します。IDは、スプレッドシートを表示したときのurlに入っているので、これを使います。
「/d」と「/edit」の間の文字です。
IDを使って以下のようにコードを書きます。
var spreadsheet = SpreadsheetApp.openById('********************************');
出力先のシートを指定する
上でスプレッドシートを取得しましたが、次はシートを取得します。
新規にシートを作成して出力する場合は、spreadsheet.insertSheet()
を使用します。
var sheet = spreadsheet.insertSheet('sheet1');
シートを指定して出力する場合は、
spreadsheet.getSheetByName()
を使用します。
var sheet = spreadsheet.getSheetByName('sheet1');
データを出力する
取得したスプレッドシート・シートに対してデータを出力します。
sheet.getRange
でセルを特定し、setValue
で値を出力します。
以下、Parserライブラリで複数取得したデータを書き込むサンプルです。
function myFunction() { //ページのhtmlを取得 var url = "https://web.biz-prog.net/gas/gethtml.html"; var html = UrlFetchApp.fetch(url).getContentText(); //htmlをパースする var parse = Parser.data(html); //リンクのurlの一覧を取得する var links = parse.from('<a href="').to('"').iterate(); console.log(links); //アクティブなスプレッドシートの「sheet1」のシートを取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName('sheet1'); //アクティブのスプレッドシートに出力する for(var i = 1; i <= links.length; i++){ sheet.getRange(i,1).setValue(links[i - 1]) } }
以下のようにスプレッドシートに出力されました。