Google Driveの特定のフォルダ内にあるファイル一覧を取得するGAS

Google Driveの特定のフォルダ内にあるファイル一覧を取得するGoogleAppsScriptをご紹介します。

概要

従業員の交通費精算など、毎月スプレッドシートで従業員全員から集めている企業も多いのではないでしょうか?
Google Driveの特定のフォルダにいくつファイルがあるかなどチェックしたいケースもあると思います。

こういったときにGASを利用すると便利です。

準備

では、ファイルもフォルダもない状態から手順を始めます。
既に取得したいファイル、取得したいフォルダがある場合は、(1)スプレッドシートを用意します の手順のあとは 2.スプレッドシートからの実行 までスキップしてください。

(1)スプレッドシートを用意します

当記事では、C1にデータを取得するフォルダのID、C4以下のC列に取得したファイル名を表示する形のスプレッドシートを想定しています。

特に、セルの位置をGASで指定しているので、下記の手順で説明するコードをそのままコピペして利用する場合には、セル位置を変えないように(セル位置を変える場合はコードを修正)してください。

(2) 管理対象のフォルダを決めます

ファイル一覧を取得するGoogle Drive上のフォルダを決めます。

Google Driveのフォルダは、こちらの様なURLになっていると思います。 URLのfoldersの後ろの文字列がフォルダIDになります。

https://drive.google.com/drive/folders/1ssxxxxxxxxxxxxxxxxxxxxTYf

ここでは、1ssxxxxxxxxxxxxxxxxxxxxTYf がフォルダIDです。

この文字列を先程用意したスプレッドシートに入力します。
※ ハードコピーは、既に入力済みの状態です。

(3) 管理対象のフォルダにファイルを作成します

こちらのような、交通費精算のファイルを一つのフォルダで管理することを想定しています。

スプレッドシートからの実行

実際のコードに入る前に、ソースコードを実行する仕組みを作ると実行しやすくなり便利です。

スプレッドシートからGASのプログラムを起動する方法はいくつかありますが、今回は、スプレッドシートのメニューに追加する方法を紹介します。

こちらのように、オリジナルのメニューを追加することができます。

コードはこちらになります。

/**
 * スプレッドシートのメニューから関数を実行出来るように、メニューを追加。
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    { name: "ファイル一覧取得実行", functionName: "main" }
  ];
  sheet.addMenu("ファイル一覧取得", entries);
}

onOpen() という関数は、スプレッドシートを開いた際に自動で呼び出してくれる関数です。

メニューの追加は、こちらの記事で詳しく解説しています。
Googleスプレッドシート上でのGASプログラムの実行方法

実装後には、一度スプレッドシートをリロードして、メニューが追加されていれば成功です。

対象フォルダのファイル一覧を取得し、スプレッドシートに反映するGASを作成

ここから、GASの説明に入ります。
GASを作る際は、以下のようなロジックの流れをイメージします。

(1) 各種変数の定義
(2) 操作するファイル、シートの取得
(3) ファイル一覧を作成するフォルダの取得
(4) 取得したフォルダ内にあるファイル名のリスト取得
(5) 取得したファイル一覧をスプレッドシートに書き込み
(6) ファイル名を分割

(1) 各種変数の定義

今回は、以下のような変数を定義しています。

  // 変数設定
  // フォルダID記載位置設定
  var folderIdRow = 1;
  var folderIdCol = 3;

  // ファイル書き込み位置設定
  var fileWriteStartRow = 5;
  var fileWriteStartCol = 2;

  // 既存ファイル反映セルクリア範囲設定
  var fileWriteEndRow = 1000;

(2) 操作するファイル、シートの取得

こちらのようなソースになります。

  // スプレッドシート取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = 

SpreadsheetApp.getActiveSpreadsheet() で現在開いているスプレッドシートを取得します。

ss.getSheetByName('シート1') で、取得したスプレッドシートのシート名 シート1を取得します。

(3) ファイル一覧を作成するフォルダの取得

取得したシートのから、フォルダIDのセルを取得します。

  // フォルダID取得
  var folderId = activeSheet.getRange(folderIdRow, folderIdCol).getValues()[0][0];

getRange()でセルを指定して取得しています。
ここで、事前定義した変数を利用しています。セルの位置を変更した場合などに、この部分を探して変更するよりも、ソースの最初に定義されている変数の値を変更するほうが間違いが少なく、楽に変更できます。

後から見ても理解しやすいように、変数名、および、コメントも重要です。

(4) 取得したフォルダ内にあるファイル名のリスト取得

取得したフォルダIDを利用して、そのフォルダ内にあるファイルの一覧を取得します。

 // ファイル一覧取得
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();

  var fileNames = []
  while (files.hasNext()) {
    var file = files.next();
    fileNames.push([file.getName()]);
  }

フォルダの取得は、 DriveApp.getFolderById(folderId) を利用します。

取得したフォルダのファイルリストは、folder.getFiles() で取得しています。

このファイルリストは、 Iterator という型になっており、通常のリストとは異なります。

while (files.hasNext())

ここの files.hasNext() で次のファイルが有るかどうかをチェックし、files.next()で、次のfileを取得しています。

取得したfileからファイル名を取得して、配列にして fileNames.push([file.getName()]) シートへ書き込み用の配列に追加しています。

この後シートに書き込む際に2次元配列にする必要があるため、配列にしています。

以下の様な形式の2次元配列を作っています。

[
  ["ファイル名1"],
  ["ファイル名2"],
  ["ファイル名3"]
]

(5) 取得したファイル一覧をスプレッドシートに書き込み

作成した2次元配列を、そのままスプレッドシートのセルに書き込みます。

  // 書き込む前にセルをクリア
  activeSheet.getRange(fileWriteStartRow, fileWriteStartCol, fileWriteEndRow, fileNames[0].length).clear();
  // スプレッドシート反映
  activeSheet.getRange(fileWriteStartRow, fileWriteStartCol, fileNames.length, fileNames[0].length).setValues(fileNames);

書き込む前に、既に書き込まれていた内容があった場合を考慮して、対象のセルをクリアします。
最初の変数定義で、

var fileWriteEndRow = 1000;

と定義しているので、1000行までの範囲をクリアしています。

この方法では、1000行を超えると古いデータが残る可能性が出てきます。

当記事では、紹介していませんが、データの存在する範囲を取得して削除する様にしたり、1000行以上になる場合には、エラーを出したりすることも可能です。

ここまでの内容を実行すると、スプレッドシートには以下のように表示されるはずです。

(6) ファイル名を分割

今回は、ファイル名を以下のようなルールで作成する想定としています。
交通費精算_年月_氏名

ルールが決まっていれば、この様な形式でスプレッドシートに反映することも可能です。

この形式にできると、提出していない人のチェックなど作業がしやすくなるのではないでしょうか。

先に、完成ソースを紹介します。

  // ファイル一覧取得
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();

  var fileNames = []
  while (files.hasNext()) {
    var file = files.next();
    var fileNameSprit = file.getName().split('_');
    if ( fileNameSprit.length !== 3){
      Browser.msgBox('ファイル名の形式が違います: ' + file.getName());
      return
    }
    fileNames.push(fileNameSprit);
  }

追加している部分を解説して行きます。

8行目の file.getName().split('_'); これは、JavaScriptのコードで _ で分割して配列が返ってきます。

これを追加するだけでも、分割ができるのですが、ルールに合っていないファイルが混在した場合などに、エラーが発生します。
これに対応するため、9行目で作成された配列の長さが3であることをチェックし、スプレッドシート上にメッセージを表示しています。

ここの3も変数化しておくと、ファイル名のルールが変わった場合などに対応しやすくなると思います。
また、これで最低限のチェックはできますが、日付が入っているかどうかなど、厳密なチェックが必要になるケースもあるかもしれません。
必要に応じてチェックを追加してみて下さい。

見落としがちですが、13行目の fileNames.push(fileNameSprit); も変更が入っています。

変更前は、ファイル名の文字列を入れていたため [] で囲って配列にしていましたが、 fileNameSprit は、配列となっているため、不要になっています。

この様な配列が出来上がります。

[
  ["ファイル名1", "年月1", "名前1"],
  ["ファイル名2", "年月2", "名前2"],
  ["ファイル名3", "年月3", "名前3"]
]

この変更で完了です。

全体のソースコード

最後に、ソースコード全体を紹介しておきます。

/**
 * スプレッドシートのメニューから関数を実行出来るように、メニューを追加。
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    { name: "ファイル一覧取得実行", functionName: "main" }
  ];
  sheet.addMenu("ファイル一覧取得", entries);
}

/**
 * フォルダ一覧取得
 */
function main() {

  // 変数設定
  // フォルダID記載位置設定
  var folderIdRow = 1;
  var folderIdCol = 3;

  // ファイル書き込み位置設定
  var fileWriteStartRow = 5;
  var fileWriteStartCol = 2;

  // 既存ファイル反映セルクリア範囲設定
  var fileWriteEndRow = 1000;

  // スプレッドシート取得
  // var folderId = '1BVfWtld3aYdA80oOW2GJaiJAydXoDWMh'
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = ss.getSheetByName('シート1');

  // フォルダID取得
  var folderId = activeSheet.getRange(folderIdRow, folderIdCol).getValues()[0][0];
  // var folderId = rootFolder.getId();

  // フォルダ一覧取得
  // Log the name of every folder in the user's Drive.
  var folder = DriveApp.getFolderById(folderId);
  Logger.log(folder.getName());
  var files = folder.getFiles();

  var fileNames = []
  while (files.hasNext()) {
    var file = files.next();
    var fileNameSprit = file.getName().split('_');
    if ( fileNameSprit.length !== 3){
      Browser.msgBox('ファイル名の形式が違います: ' + file.getName());
      return
    }
    fileNames.push(fileNameSprit);
  }

  // 書き込む前にセルをクリア
  activeSheet.getRange(fileWriteStartRow, fileWriteStartCol, fileWriteEndRow, fileNames[0].length).clear();
  // スプレッドシート反映
  activeSheet.getRange(fileWriteStartRow, fileWriteStartCol, fileNames.length, fileNames[0].length).setValues(fileNames);

}

注意点

今回ご紹介した方法では、マイドライブ直下のファイルを取得することはできません。
DriveApp.getRootFolder() というメソッドを使用して、フォルダのオブジェクトを取得することができます。

まとめ

GASを使うと簡単にGoogle Drive内の情報を取得し、スプレッドシートなどに出力することができます。

今回は、交通費精算を題材に説明しましたが、画像フォルダのファイル名の連番チェックを行うなど、フォルダ内に大量のファイルを作成し、チェックしたいケースは多くあると思います。
また、ファイル名を分割して番号順や日付順に並べるなど、スプレッドシート上でできることはGASで自動化することが可能です。

GSSとJavaScriptの知識を増やしていくことで、取得した情報を加工しより便利に利用することが可能になります。日常の業務を少しずつ効率化して、GASを触る機会を増やしていくきっかけになればと思います。

製品・サービスについてのお問合せ

情報収集中の方へ

導入事例やソリューションをまとめた資料をご提供しております。

資料ダウンロード
導入をご検討中の方へ

折り返し詳細のご案内を差し上げます。お問い合わせお待ちしております。

お問い合わせ