Webサイトから情報を取得する① ファイルのダウンロード

今回のシリーズは、Webサイト上にあるデータや情報をGASを使って取得するいくつかの方法を見ていきます。
1回目は、Webサイトで公開されているCSVファイルをダウンロードしてみましょう。

HTTPリクエスト UrlFetchApp.fetch( url )

UrlFetchAppクラスfetch(url)メソッドは、GASでWebサイトにアクセス(HTTPリクエスト)する時の必須定番コードです。
これでurlを指定してあげさえすれば、Web上のデータにアクセスできてしまいます。簡単ですね。
では、さっそくやっていきたいと思いますが、今回はurlをスプレッドシートから持ってくることとします。

実在する練馬区のオープンデータサイトから「オープンデータ一覧」というCSVファイルをダウンロードしたいと思います。

リンクのアドレスをコピーして、図のようにスプレッドシートにペーストしました。
A列をタイトル、B列をURLとしています。

シート「URL」のB列からurlを取得して、fetch( )メソッドにセットするコードです。
実行ログからurlが取得できていることが分かりますので、これでCSVファイルにアクセスできているはずです。

スクリプトはコンテナバインドです。

シートから値を取得する方法についは下記の記事を参考にしてください。

UrlFetchApp.fetch(url)でHTTPリクエストをすると、HTTPレスポンスを受け取ることができます。
これを変数responseに格納して、ログ出力してみると、、、

文字化けだらけですね。
https://www.city.nerima.tokyo.jp/…とあるので、指定のCSVファイルにアクセスできていることは間違いなさそうです。
文字化けを解消させて、Googleドライブのファイルとして保存する方法を次に見ていきましょう。

ファイル作成 DriveApp.createFile( name, content, mimeType )

ドライブにファイルを作成して保存するには、DriveApp.createFile( )メソッドを使います。
第一引数にファイル名、第二引数にコンテンツ、第三引数にMIMEタイプを指定できます。
公式リファレンス

シート「URL」のA列からファイル名を取得します。
第二引数のcontentには、HTTPResponseクラスgetContentText(charset)メソッドを使います。
これにより指定したcharsetでHTTPレスポンスの内容をエンコードすることができ、文字化けを解決できます。
ここでは文字コードを「SHIFT_JIS」で指定します。
公式リファレンス
MimeType.CSVでファイル形式をCSVとすることができます。

シートの「タイトル」がファイル名として取得できています。

ドライブを確認すると、「練馬区オープンデータ一覧」というCSVファイルが作成保存されていました。

そして、そのファイルを開いてみると、、、

ダウンロード成功です!
文字化けも解決できています!

指定したフォルダに保存 DriveApp.getFolderById( id )

ファイルは何も指定しなければ、ドライブ直下のルートフォルダに保存されますが、希望するフォルダを指定して保存することも可能です。
ここではgetFolderById( )メソッド使ってフォルダを指定します。

フォルダURLの青線部分がフォルダIDです。

DriveApp.getFolderById(folderId)で取得したfolderで、createFile( )してあげればOKです。
公式リファレンス

指定した「CSVフォルダ」に「練馬区オープンデータ一覧」ファイルが作成保存されました。

完成コード

// Webサイト上のCSVファイルをダウンロードするアプリ
function csvDL() {
  // シートからnameとurlを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名');
  const name = sheet.getRange(2, 1).getValue();
  const url = sheet.getRange(2, 2).getValue();

  // HTTPリクエストしてレスポンスを取得&SHIFT_JISにエンコード
  const response = UrlFetchApp.fetch(url);
  const content = response.getContentText('SHIFT_JIS')

  // 指定したフォルダにファイルを作成
  const folderId = '***************';
  const folder = DriveApp.getFolderById(folderId);
  folder.createFile(name, content, MimeType.CSV);
}

シリーズ目次:Webサイトから情報を取得する

  1. Webサイトから情報を取得する① ファイルのダウンロード
  2. Webサイトから情報を取得する② スプレッドシートにインポート
  3. Webサイトから情報を取得する③ スクレイピング
  4. Webサイトから情報を取得する④ Web API vol.1
  5. Webサイトから情報を取得する⑤ Web API vol.2

GASCSV,データ

Posted by botw