0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Googleドライブ内の全てのtxtファイルを1つのスプレッドシートにまとめる!(GAS)

Last updated at Posted at 2021-07-07

GASについて

  • 完全初見(1日目)、GASとはなんぞやのレベル感。
  • Googleが提供している言語(ほぼjavaScriptの認識)
  • Googleドライブ内のファイルやGmailを扱えるらしい。

本日の内容

  • Googleドライブ内にある全てのテキストファイル(.txt)の内容をエクセルに書き出す。
  • ドライブ内にエクセルを新規作成し、シートを追加し全てのテキストを1つのエクセルファイルとして完成させる。
  • 動作するという意味で及第点としています。質は担保していません。(助言頂けると幸いです。)

作成したソース

// Googleドライブ内の全てのtxtファイルの内容をスプレッドシートのシートごとに書き込むメソッド
function driveAllFilesMakeSpreadSheet() {

  // sheetNo用の変数(1ずつ増やして使用)
  var num = 0;

  // シート名
  var sheetName = "";

  // sampleフォルダー配下にスプレッドシート"test"を作成
  var newSheet = createSpreadsheet("1_fD_XDbrDIFDrdgn_dRbFRChEdQ1tFqF", "test");

  // 作成したスプレッドシートのIDを取得
  var sheetId = newSheet.getId();

  // ID指定をしてスプレッドシートを開く
  var newSpreadSheet = SpreadsheetApp.openById(sheetId);

  // シートNo用の変数に1増やして、シート名として設定。
  num++;
  newSpreadSheet.insertSheet("sheet" + num);
  
  // GoodleDrive内の全てのファイルを取得
  var allFiles = DriveApp.getFiles();

  // デフォルトで作成されている「シート1」を取得
  var delSheet = newSpreadSheet.getSheetByName("シート1");
  
  // デフォルトシートを削除
  newSpreadSheet.deleteSheet(delSheet);

  // GoodleDrive内のファイルを順番に調べていく
  while (allFiles.hasNext()) {
    
    // 順番に対象ファイルを指定
    var file = allFiles.next();

    // ファイル名を取得
    var fileName = file.getName();

    // ファイル名を文字列型にキャスト
    var txtFileName = fileName.toString();

    // 正規表現で拡張子が.txtのファイルを対象にする
    var txtName = txtFileName.match(/^.*\.+txt$/g);
    
    // txtファイルの時
    if (txtName != null) {
      
      // txtファイルをutf-8指定でBlob型として取得する
      var txtBlob = file.getBlob().getDataAsString("utf-8");

      // 改行単位でカンマ区切りにする(配列のイメージ)
      var txtLines = txtBlob.split(/[\s]+/);

      // 配列の全ての要素に対してスプレッドシートに書き込み処理を行う
      Array.from(txtLines, x => outputLog(x, newSpreadSheet));

      // txtファイル以外のファイルは以下の処理をスキップ
    } else {
      continue;
    }

      // 新しいシートを作成し、指定する
      num++;
      sheetName = "sheet" + num;
      newSpreadSheet.insertSheet(sheetName);
  }

  // 最後に追加した余分なシートを削除
  newSpreadSheet.deleteActiveSheet();
}

// スプレッドシートに出力するメソッド
function outputLog(txt, newSpreadSheet) {

  // txtが存在するとき書き込む
  if (txt != null) {
    newSpreadSheet.appendRow([txt]);
  }
}

// フォルダに新規にスプレッドシートを作成(第1引数:フォルダID, 第2引数:ファイル名)するメソッド
function createSpreadsheet(folderID, fileName) {

  // フォルダIDから該当フォルダを取得
  var folder = DriveApp.getFolderById(folderID);

  // スプレッドシートを指定されたファイル名で作成
  var newSpreadSheet = SpreadsheetApp.create(fileName);

  // IDを指定してファイルを取得
  var file = DriveApp.getFileById(newSpreadSheet.getId());

  // オリジナルのファイルで書き込みを行うと、想定通りにいかないのでコピーを作成
  var copiedFile = file.makeCopy(fileName, folder);

  // コピー元のファイルを削除
  file.setTrashed(true);

  // コピーしたファイルを返す
  return copiedFile;
}

元のGoogleドライブの状態

image.png

  • Googleドライブのマイドライブ直下にsamplefolderというフォルダを作成しておく。
  • 実行前のタイミングではなにも入っていない。

スクリプトを実行した後の状態

image.png

  • スクリプトを実行完了したタイミングでスプレッドシートが作成される。
  • 1つのtxtの内容を1つのシートに全て記載し、全てのtxtが終了したタイミングで完了。

出力したスプレッドシートの内容

image.png

  • 今回該当したtxtファイルは3つなのでシートが3つ作成されている。
  • シート名はとりあえずsheet1からsheet3と連番になるように設定している。
  • txtの本文が改行区切りでエクセルの各行の左端のセルに埋め込まれている。

実行時間

image.png

  • 処理完了まで20秒程度用している。
  • 出力したファイルは3つで1200文字程度。全体のファイル数は100もないと思われます。
  • 処理にかかった時間が妥当かどうかは不明。もし、妥当でないならロジックの問題。

追記(2021/7/8)シート名をtxt名にする(拡張子除く)方が便利なので少し改変しました。

// Googleドライブ内の全てのtxtファイルの内容をスプレッドシートのシートごとに書き込むメソッド
function driveAllFilesMakeSpreadSheet() {

  // シート名
  var sheetName = "";

  // sampleフォルダー配下にスプレッドシート"test"を作成
  var newSheet = createSpreadsheet("1_fD_XDbrDIFDrdgn_dRbFRChEdQ1tFqF", "test2");

  // 作成したスプレッドシートのIDを取得
  var sheetId = newSheet.getId();

  // ID指定をしてスプレッドシートを開く
  var newSpreadSheet = SpreadsheetApp.openById(sheetId);

  // GoodleDrive内の全てのファイルを取得
  var allFiles = DriveApp.getFiles();

  // GoodleDrive内のファイルを順番に調べていく
  while (allFiles.hasNext()) {

    // 順番に対象ファイルを指定
    var file = allFiles.next();

    // ファイル名を取得
    var fileName = file.getName();

    // ファイル名を文字列型にキャスト
    var txtFileName = fileName.toString();

    // 正規表現で拡張子が.txtのファイルを対象にする
    var txtName = txtFileName.match(/^.*\.+txt$/g);
  
    // txtファイルの時
    if (txtName != null) {

      // txtNameの末尾4文字を削除(.txtの部分)
      var sliceTxtName = txtName[0].slice(0, -4).toString();

      // シートNo用の変数に1増やして、シート名として設定。
      newSpreadSheet.insertSheet(sliceTxtName);

      // デフォルトで作成されている「シート1」を取得
      var delSheet = newSpreadSheet.getSheetByName("シート1");
      
      // デフォルトシートを削除(1回目のみ)
      if (delSheet != null) {
        newSpreadSheet.deleteSheet(delSheet);
      }
      
      // txtファイルをutf-8指定でBlob型として取得する
      var txtBlob = file.getBlob().getDataAsString("utf-8");

      // 改行単位でカンマ区切りにする(配列のイメージ)
      var txtLines = txtBlob.split(/[\s]+/);

      // 配列の全ての要素に対してスプレッドシートに書き込み処理を行う
      Array.from(txtLines, x => outputLog(x, newSpreadSheet));
    } 
  }
}

// スプレッドシートに出力するメソッド
function outputLog(txt, newSpreadSheet) {

  // txtが存在するとき書き込む
  if (txt != null) {
    newSpreadSheet.appendRow([txt]);
  }
}

// フォルダに新規にスプレッドシートを作成(第1引数:フォルダID, 第2引数:ファイル名)するメソッド
function createSpreadsheet(folderID, fileName) {

  // フォルダIDから該当フォルダを取得
  var folder = DriveApp.getFolderById(folderID);

  // スプレッドシートを指定されたファイル名で作成
  var newSpreadSheet = SpreadsheetApp.create(fileName);

  // IDを指定してファイルを取得
  var file = DriveApp.getFileById(newSpreadSheet.getId());

  // オリジナルのファイルで書き込みを行うと、想定通りにいかないのでコピーを作成
  var copiedFile = file.makeCopy(fileName, folder);

  // コピー元のファイルを削除
  file.setTrashed(true);

  // コピーしたファイルを返す
  return copiedFile;
}

実行後のスプレッドシート

image.png

  • シート名がtxt名に変更されています。
  • 今回対象になったのはsample2.txt, sample1.txt, quizzes.txtの3ファイル。

次回への課題

  • 読み込んだ内容から特定のキーワードに該当する行を抜き出すなど(現状は全ての文字列を書きだしただけ)
  • txtファイルだけでなく、Gmailなど対象ファイルを広げていきたい。

次の記事(Gmailで検索した内容をスプレッドシートにまとめる!(GAS))

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?