【GAS入門】Googleドライブからファイル名を取得する方法
GASでGoogleドライブからファイル名を取得する方法
GAS(Google Apps Script)を使えば、簡単にGoogleドライブ内のファイル名を取得できる。
まずは基本形からだ。
 function listFileNamesInFolder() {
    var folder = DriveApp.getFolderById('フォルダIDをここに');
    var files = folder.getFiles();
    while (files.hasNext()) {
       var file = files.next();
       Logger.log(file.getName());
    }
 } 
このスクリプトは指定されたフォルダ内のすべてのファイル名をログに出力する。
まず、DriveApp.getFolderById(‘フォルダIDをここに’)で特定のフォルダを取得。
次に、そのフォルダ内のファイルをfolder.getFiles()で取得し、ループで各ファイルの名前をfile.getName()で取得しているぞ。
【応用】GASで特定の条件でファイル名をフィルタする方法
特定の条件でファイル名をフィルタしたい時もあるだろう。
以下のスクリプトなら「特定のファイル拡張子」を持つファイルだけを取得できる。
 function listSpecificFileType() {
    var folder = DriveApp.getFolderById('フォルダIDをここに');
    var files = folder.getFiles();
    while (files.hasNext()) {
       var file = files.next();
       if (file.getName().endsWith('.txt')) {
          Logger.log(file.getName());
          }
       }
    } 
このスクリプトは、.txtファイルの名前だけをログに出力しているな。
ファイル名に対して、endsWith(‘.txt’)を条件にしてフィルタをかけて、特定の拡張子を持つファイル名のみ取得しているんだ。
GASでフォルダ内のファイル名を再帰的に取得する方法
でも、フォルダの中にサブフォルダがあったらどうする?
サブフォルダの中にサブフォルダ、の中にもサブフォルダ・・・なんてこともあるよな。
そんな場合は、再帰的にすべてのファイル名を取得しよう。
再帰的、つまり、関数の中から自分自身をもう一度呼び出んだ。
 function listAllFileNamesRecursively(folder) {
    var files = folder.getFiles();
    while (files.hasNext()) {
       var file = files.next();
       Logger.log(file.getName());
       }
    var subfolders = folder.getFolders();
    while (subfolders.hasNext()) {
       var subfolder = subfolders.next();
       listAllFileNamesRecursively(subfolder); 
       }
  }
function main() {
    var rootFolder = DriveApp.getFolderById('フォルダIDをここに');
    listAllFileNamesRecursively(rootFolder);
 } 
このスクリプトなら、フォルダ内のすべてのファイルとサブフォルダ内のファイル名をログに出力できる。
フォルダとそのサブフォルダを再帰的に探索することで、すべてのファイルを取得できるはずだ。
練習問題
- GASを使ってGoogleドライブのルートディレクトリにあるすべてのファイル名を取得し、ログに出力せよ。
 - 拡張子が.jpgのファイル名だけを取得するスクリプトを書いてみよう。
 - 再帰を使って特定のフォルダとそのすべてのサブフォルダ内のファイル名を取得するスクリプトを完成させよう。
 
解答・解説
 function listRootFileNames() {
    var files = DriveApp.getRootFolder().getFiles();
    while (files.hasNext()) {
       var file = files.next();
       Logger.log(file.getName());
    }
 } 
このスクリプトはDriveApp.getRootFolder().getFiles()を使用して、ルートフォルダのすべてのファイル名を取得する。
 function listJpgFiles() {
    var folder = DriveApp.getFolderById('フォルダIDをここに');
    var files = folder.getFiles();
    while (files.hasNext()) {
       var file = files.next();
       if (file.getName().endsWith('.jpg')) {
          Logger.log(file.getName());
             }
        }
    } 
拡張子が.jpgのファイルを取得するには、名前をフィルターする条件にendsWith(‘.jpg’)を使う。
 function listAllFilesRecursively(folder) {
    var files = folder.getFiles();
    while (files.hasNext()) {
       var file = files.next();
       Logger.log(file.getName());
    }
    var subfolders = folder.getFolders();
    while (subfolders.hasNext()) {
       var subfolder = subfolders.next();
       listAllFilesRecursively(subfolder); 
       }
    }
function executeRecursiveListing() {
    var rootFolder = DriveApp.getFolderById('フォルダIDをここに');
    listAllFilesRecursively(rootFolder);
 } 
再帰的にフォルダ内のすべてのファイルを取得するこのスクリプトは、最初にフォルダ内のすべてのファイルを取得し、その後サブフォルダを再帰的に探索している。