Webサイトから情報を取得する② スプレッドシートにインポート

シリーズ①では、Webサイト上のCSVファイルをダウンロードして、Googleドライブの指定フォルダに保存することができました。
今回は、そのCSVファイルをスプレッドシートで開くことができるように、スクリプトにもうひと手間加えてみましょう。
とは言っても簡単です!

追加するコード

シリーズ①のスクリプトに追加するコードはオレンジ枠の部分4行のみです。

コード解説

ファイルのBlob化 csvFile.getBlob( )

Blobとは「Apps Scriptサービスのデータ交換オブジェクト」と公式リファレンスには記載されています。
いまいちよく分からない部分もあるのですが、GASでデータをやり取りする時によく使うものだと覚えてしまいましょう。
ファイルを目的のかたちに成形するために一旦プレーンな状態にする、みたいなイメージで個人的には捉えています。
ちなみに、Blobの「B」はBinaryのBです。

getBlob( )は、対象のファイルをBlobデータ化してくれるHTTPResponseクラスのメソッドです。
公式リファレンス

Blobオブジェクトを文字列として取得 getDataAsString( )

getDataAsString( )メソッドは、Blob化されたデータを文字列として取得します。
そのまんまですね。

CSVテキストを二次元配列化 Utilities.parseCsv(csvText)

文字列をスプレッドシートに展開させるためには、文字列が二次元配列である必要があります。
UtilitiesクラスのparseCsv( )は、引数に与えられたCSVテキストを二次元配列にして返すメソッドです。
便利ですね!公式リファレンス

指定した名前で新しいシートを追加 insertSheet(name)

insertSheet(name)メソッドで、スプレッドシートに指定したシート名で新しいシートを追加することができます。

テスト実行

csvDLtoSS関数を実行してみると、、、

「練馬区オープンデータ一覧」という新しいシートが追加されて、そのシートにCSVファイルが無事展開できています。
スプレッドシートへのインポート成功です!

完成コード

// CSVファイルのダウンロードとスプレッドシートにインポートするアプリ
function csvDLtoSS() {
  // シートから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);
  const csvFile = folder.createFile(name, content, MimeType.CSV);

  // ファイルを加工して、新しいシートにインポート
  const csvText = csvFile.getBlob().getDataAsString();
  const values = Utilities.parseCsv(csvText);
  const addSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(name);
  addSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}

おまけ 関数で部品化する

// 完成コードの9〜15行目をcsvDL関数で部品化
function csvDL(url, name) {
  const response = UrlFetchApp.fetch(url);
  const content = response.getContentText('SHIFT_JIS')
  const folderId = '********************';
  const folder = DriveApp.getFolderById(folderId);
  const csvFile = folder.createFile(name, content, MimeType.CSV);
  return csvFile
}

// 18〜21行目をcsvToSS関数で部品化
function csvToSS(file, name) {
  const csvText = file.getBlob().getDataAsString();
  const values = Utilities.parseCsv(csvText);
  const addSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(name);
  addSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}

// 部品化したcsvDLとcsvToSSを使ってcsvDLtoSS_2関数を作成
function csvDLtoSS_2() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名');
  const name = sheet.getRange(2, 1).getValue();
  const url = sheet.getRange(2, 2).getValue();

  const file = csvDL(url, name); 
  csvToSS(file, name);
}
// csvDLtoSS_2関数もcsvDLtoSS関数と同じ処理結果となります。

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

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

GASCSV,データ

Posted by botw