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関数と同じ処理結果となります。