GoogleAppsScript

【簡単】GASでドライブ内の複数のCSVファイルをスプレッドシートに一括読み込みする方法を解説!

Google Apps Script(GAS)を使用してGoogleドライブに格納されている複数のCSVファイルをスプレッドシートに一括で読み込むシステムをしています。

GASの勉強はあまり気が進まないけど、業務効率化してラクしたい方には、シートを無料配布していますので、丸ごとコピペするだけで今すぐ使えるようになっています!

もちろん、具体的な操作手順も画像付きで解説しておりますので、スプレッドシートの操作が苦手な方もご安心して使えます。

また、GAS初学者の方には、実際に動くスクリプトの実例を照らし合わせながら、学習材料してもらえれば幸いです!

こんな方を想定して開発しました!

複数のCSVを手動でシート反映するのが大変な方へ

  • GASの勉強はハードルが高い…だけど楽したい!という方
  • 複数のCSVファイルを手動でスプレッドシートに読み込む手間を省きたい方
  • プログラミング初心者でGASを学びたい方
  • スプシの基本操作は理解しているが、GASについては初めて触る方

CSVファイル一括読み込む機能の解説

CSVの読み込む方法は次の2種類から選択できます。

1. 取り込んだCSVを1つのスプレッドシートにまとめる

2. 各CSVごとにスプレッドシートを生成する

CSVファイル一括読み込む機能の簡単な概要

  • スクリプトを実行すると、指定したドライブ内のCSVファイルが取得されます。
  • 選択した読み込む方法に従って、各CSVファイルのデータがスプレッドシートに書き込まれます。
  • スクリプトの実行結果として、スプレッドシートにCSVデータが一括取り込まれたことを確認できます。

CSVファイル一括で読み込む機能を無料共有しています

こちらのスプレッドシートはCSVファイルの一括読み込む機能が実装されたものです。

以下のリンクからコピーして、自分のアカウントで無料で使用することができます。

【GASコピ!】CSVからスプレッドシートへ – Google スプレッドシート

続いて、スプレッドシートのコピーの仕方や設定方法、スクリプトの実行方法について解説しています。

CSVファイル一括で読み込む機能のコピー方法

1.「ファイル>コピーを作成」を選択します

2. 「スプレッドシートの保存先のフォルダを選択>コピーを作成」を選択します

「添付されているAppsScriptファイル」は変更せずにそのままコピーしてください。

CSVファイル一括で読み込む機能の初期設定

スプレッドシートの複製が完了したらCSVファイルの一括読み込むのための設定を進めていきます。

黄色いセルが入力箇所となりますので、お好きな条件にカスタマイズしてください。

条件設定

読み込む方法を選択します(「各CSVのスプレッドシート生成」または「各CSVを1つのシートにまとめる」)

GoogleドライブのIDはURLから確認できます

「https://drive.google.com/drive/folders/」の後に続く文字列がGoogleドライブのIDです。

例)「https://drive.google.com/drive/folders/1A4eBbAqPd_ByIHadTStux-bnc88YEhKI1A4eBbAqPd_ByIHadTStux-bnc88YEhKI

スプレッドシートのIDはURLから確認できます

「https://docs.google.com/spreadsheets/d/」の後に続く文字列がスプレッドシートのIDです。

例)「https://docs.google.com/spreadsheets/d/1XhDzemhZezeIbSNloXN8TrEmJgdevdRyd3EXrU6G0Jw/edit#gid=0」

出力先のシート内のデータ削除後に更新する

B11では、出力先のシート内のデータ削除後に更新する場合は「〇」、更新しない場合は「×」を選択します。

CSVファイル一括で読み込む機能の実行方法

画面上部のツールバーにある「CSV抽出>実行する」を選択

スプレッドシートを開いてから「CSV抽出」のコマンドが表示されるまで、数秒かかることがあります。

もし表示されていない場合は、表示されるまで少々お待ちください。

スクリプト起動のための承認作業を行います

ポップアップが表示されたら、続行を選択

次のポップアップが表示されたら、あなたのGoogleアカウントを選択してください

次のポップアップが表示されたら、「詳細」をクリックしてください

※「安全なページに戻る」を押すと承認作業が終了してしまうので、クリックしないようにご注意ください

ポップアップの下部に「無題のプロジェクト(安全ではないページ)に移動」が表示されたら、クリックしてください

次のポップアップが表示されたら、「許可」をクリックしてください

これで承認手続きは完了です。

設定はすべて終わりましたので、後はスクリプトを実行するだけです!

CSVファイル一括で読み込む機能の実行方法

ドライブに格納したCSVについて

7/1~7/3のデータをまとめた「7月.csv」と、8/1~8/3のデータをまとめた「8月.csv」をドライブに事前に用意しておきました。

後は、「CSV抽出>実行する」を選択すれば、機能が実行されます。

それでは、二種類の条件処理を紹介していきます。

各CSVごとにスプレッドシートを生成した結果

各CSVごとにスプレッドシートを生成時の初期設定は以下の通りです。

今回はCSVを格納したドライブと同じ場所に保存しようと思います。

実行した結果

無事ドライブにCSVと同名のスプレッドシートが保存されました。

各CSVを一つのシートにまとめた結果

各CSVを一つのシートにまとめる際の初期設定は以下の通りです。

「実行する」をクリックするだけで、一つのシートへまとめて出力ができました。

このようにGASを使用したスプレッドシートですと、一括インポートが非常に簡単に完了します。

もっと詳しく知りたい方のためのスクリプトの解説

以下、本スプレッドシートで使用しているスクリプトの紹介となります。

function importCSVFromDrive() {
  // ドライブのIDを取得
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName("出力設定"); // 自分のシート名に置き換える
  let driveFolderId = sheet.getRange("B3").getValue();

  // ドライブ内のCSVファイルを取得
  let driveFolder = DriveApp.getFolderById(driveFolderId);
  let files = driveFolder.getFilesByType(MimeType.CSV);
  let csvFileIds = [];
  while (files.hasNext()) {
    let file = files.next();
    csvFileIds.push(file.getId());
  }

  // スプレッドシートの読み込む方法を取得
  let importMethod = sheet.getRange("B2").getValue();

  try {
    if (importMethod === "各CSVを1つのシートにまとめる") {
      // 取り込んだCSVを1つのスプレッドシートにまとめる場合
      let targetSpreadsheetId = sheet.getRange("B9").getValue();
      let targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId);
      let combinedSheetName = sheet.getRange("B10").getValue();
      let combinedSheet = targetSpreadsheet.getSheetByName(combinedSheetName);
      if (!combinedSheet) {
        combinedSheet = targetSpreadsheet.insertSheet(combinedSheetName);
      }

      for (let i = 0; i < csvFileIds.length; i++) {
        let csvFileId = csvFileIds[i];
        let csvFile = DriveApp.getFileById(csvFileId);
        let csvData = csvFile.getBlob().getDataAsString();
        let csvRows = csvData.split("\r\n");
        let csvDataArray = [];
        for (let j = 0; j < csvRows.length; j++) {
          let row = csvRows[j].split(",");
          csvDataArray.push(row);
        }

        // 2次元配列のデータをスプレッドシートに書き込む
        let numRows = csvDataArray.length;
        let numCols = csvDataArray[0].length;
        if (i === 0 && sheet.getRange("B11").getValue() === "〇") {
          combinedSheet.clearContents(); // 最初のファイルの場合にシートのデータを削除
        }
        combinedSheet.getRange(combinedSheet.getLastRow() + 1, 1, numRows, numCols).setValues(csvDataArray);
      }
    } else if (importMethod === "各CSVのスプレッドシート生成") {
      // 各CSVごとにスプレッドシートを生成する場合
      let outputDriveFolderId = sheet.getRange("B6").getValue();

      for (let i = 0; i < csvFileIds.length; i++) {
        let csvFileId = csvFileIds[i];
        let csvFile = DriveApp.getFileById(csvFileId);
        let csvData = csvFile.getBlob().getDataAsString();
        let csvRows = csvData.split("\r\n");
        let csvDataArray = [];
        for (let j = 0; j < csvRows.length; j++) {
          let row = csvRows[j].split(",");
          csvDataArray.push(row);
        }

        // 新しいスプレッドシートを作成して2次元配列のデータを書き込む
        let newSpreadsheet = SpreadsheetApp.create(csvFile.getName());
        let newSheet = newSpreadsheet.getActiveSheet();
        let numRows = csvDataArray.length;
        let numCols = csvDataArray[0].length;
        newSheet.getRange(1, 1, numRows, numCols).setValues(csvDataArray);

        // スプレッドシートを指定のドライブに移動
        let newSpreadsheetFile = DriveApp.getFileById(newSpreadsheet.getId());
        let outputDriveFolder = DriveApp.getFolderById(outputDriveFolderId);
        outputDriveFolder.addFile(newSpreadsheetFile);
        DriveApp.getRootFolder().removeFile(newSpreadsheetFile);
      }
    } else {
      throw new Error("無効な読み込む方法が選択されています。");
    }

    Logger.log("CSVデータをスプレッドシートに書き出しました。");
  } catch (error) {
    Logger.log("エラーが発生しました:" + error);
  }
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('CSV抽出')
      .addItem('実行する', 'importCSVFromDrive')
      .addToUi();
}

スクリプト内のロジック詳細解説

ドライブのIDを取得する

let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let sheet = spreadsheet.getSheetByName("出力設定");
let driveFolderId = sheet.getRange("B3").getValue();

この部分では、スクリプトが動作しているスプレッドシートを取得し、特定のシート(”出力設定”シート)を取得しています。

そして、”出力設定”シートのB3セルに入力されたドライブのIDを取得しています。

このドライブのIDは、取り込むCSVファイルが格納されているドライブのIDを指定するために使用します。

ドライブ内のCSVファイルを取得する

let driveFolder = DriveApp.getFolderById(driveFolderId);
let files = driveFolder.getFilesByType(MimeType.CSV);
let csvFileIds = [];
while (files.hasNext()) {
  let file = files.next();
  csvFileIds.push(file.getId());
}

この部分では、指定されたドライブ内のCSVファイルを取得しています。

まず、ドライブのIDを使用して対象のフォルダを取得し、getFilesByTypeメソッドを使用してCSVファイルのみを取得します。

その後、ループを使用して各CSVファイルのIDをcsvFileIds配列に格納しています。

スプレッドシートの読み込む方法を取得する

let importMethod = sheet.getRange("B2").getValue();

この部分では、”出力設定”シートのB2セルに入力された読み込む方法(「各CSVを1つのシートにまとめる」または「各CSVのスプレッドシート生成」)を取得しています。この値によって、後続の処理で読み込む方法を切り替えます。

取り込んだCSVを1つのスプレッドシートにまとめる場合の処理

if (importMethod === "各CSVを1つのシートにまとめる") {
  // ...省略...
}

この部分は、読み込む方法が「各CSVを1つのシートにまとめる」場合の処理です。

各CSVファイルのデータを1つのスプレッドシートにまとめるために、以下のような処理を行います。

  • 出力先のスプレッドシートを取得または作成する
  • 各CSVファイルのデータを2次元配列に変換する
  • 2次元配列のデータを出力先のスプレッドシートに書き込む
  • 最初のCSVファイルの場合は、出力先シートのデータを削除するか選択する

各CSVごとにスプレッドシートを生成する場合の処理

else if (importMethod === "各CSVのスプレッドシート生成") {
  // ...省略...
}

この部分は、読み込む方法が「各CSVのスプレッドシート生成」場合の処理です。

各CSVファイルごとに新しいスプレッドシートを作成し、CSVデータをそれぞれのスプレッドシートに書き込みます。

以下のような処理が行われます。

  • 各CSVファイルのデータを2次元配列に変換する
  • 新しいスプレッドシートを作成し、2次元配列のデータを書き込む
  • 作成したスプレッドシートを指定のドライブに移動する

これらの処理により、ドライブ内のCSVファイルを効率的にスプレッドシートに取り込むことができます。

また、onOpen関数を使用することで、スクリプトを実行するための簡単なメニューをスプレッドシートに追加しています。

まとめ

この記事では、Google Apps Script(GAS)を使用して、ドライブに格納されている複数のCSVファイルを一括でスプレッドシートに読み込む方法を紹介しました。

一つのシートにまとめる方法と、各CSVファイルごとにスプレッドシートを生成する方法の2つの読み込む方法を使い分けることができます。

大量のCSVファイルでも一括で処理ができるため、膨大な業務に追われて忙しい方にもおすすめです。

是非、この記事を参考にして自分の業務やプロジェクトに活用してみてください。

今後も業務に役立つGASの自動化・効率化スクリプトを無料配布する予定ですので、またご覧いただけますと幸いです!