初心者でもわかるGoogle Apps Script活用のススメ

Google Apps Scriptでドライブのフォルダやファイルを取得してみる

今回の記事は、Google Apps Scriptを使ってGoogleドライブ上のファイルを取得する方法を紹介していきます。

GASでフォルダやファイルを取得する方法はそれぞれいくつかあるのですが、取得方法にそれぞれ結構な違いがありますのでこの記事ではそれぞれの使い方をまとめて紹介したいと思います。

GASでドライブ上のフォルダやファイルに対して処理を行う場合には、まずは対象のアイテム(フォルダやファイル)を取得する必要があります。

対象アイテムへの処理とは例えば、

  • アイテム名を取得 / 変更する
  • オーナーを取得 / 変更する
  • 共有アカウントを取得 / 変更する
  • アイテムを複製 / 削除する

このような処理があります。

上記は一例ですが、このような処理を行う場合にはまず対象アイテムを取得するということが基本となります。

今回、フォルダとファイルの取得について一つの記事で執筆しようとしていますが、Googleドライブではフォルダとファイルの違いがあまりないため、同じ記事で書いていくことにしました。

ちなみに、今回ご紹介するDriveAppではフォルダやファイルは別のメソッドで取得をしていきますが、Advanced Google ServicesのDrive APIを使うと、1つの処理でフォルダやファイルを区別なく取得できます。

このことからも、Googleドライブ上ではフォルダやファイルの区別があまりないことが少し理解できるかと思います。

ファイルやフォルダを取得後にそれぞれの関連データを続けて取得したい場合は、別記事でメソッドをまとめましたので、

を参考にしてください。

さて、前置きが長くなってしまいましたが、本題に入っていきたいと思います。

対象のファイルやフォルダを取得するコード

本ページでは、様々な方法でGoogleドライブ上のフォルダやファイルを取得する方法をご紹介します。

  1. getFolderById(フォルダIDを使って指定フォルダを取得)
  2. getFolders(対象フォルダ内のフォルダをすべて取得)
  3. getFoldersByName(対象フォルダ内の指定したフォルダ名に一致するフォルダをすべて取得)
  4. getRootFolder(マイドライブを取得)
  5. getTrashedFolders(ゴミ箱に捨てられたフォルダを取得)
  6. searchFolders(検索クエリに合致するフォルダをすべて取得)
  7. getFileById(ファイルIDを使って指定ファイルを取得)
  8. getFiles(対象フォルダ内のファイルをすべて取得)
  9. getFilesByName(対象フォルダ内の指定したファイル名に一致するファイルをすべて取得)
  10. getFilesByType(対象フォルダ内の指定したファイルタイプに一致するファイルをすべて取得)
  11. getTrashedFiles(ゴミ箱に捨てられたファイルを取得)
  12. searchFiles(検索クエリに合致するファイルをすべて取得)

コードとしては、フォルダ取得用とファイル取得用に分かれていますが、使い方はほとんど同じですので、片方の使い方がわかればもう片方の使い方にも簡単に応用することができます。

上記コードの中で気づいた方もいると思いますが、対象アイテムを取得する方法としては、1つのアイテムを取得するメソッドと複数のアイテムを取得するメソッドがあります。1つのアイテムを取得するコードではファイル自体を取得できていますので、そのままFolderクラスFileクラスのメソッドを利用することが可能です。複数のアイテムを取得するコードではイテレータとしてアイテムが取得されていますので、FolderIteratorクラスFileIteratorクラスの処理を行うことで最終的にFolderクラスやFileクラスのメソッドを利用できるようになります。

関連するメソッド

フォルダやファイルの作成をするプログラムも別の記事にまとめてありますので、あわせてご確認ください。

getFolderById(id)サンプルコード

引数に入れる値

サンプルコード

//ID指定でフォルダを取得するプログラム
function sampleCodeForDriveAppGetFolderById() {
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH"; //フォルダID
  var folder = DriveApp.getFolderById(id);
  console.log(folder);
}

変数の説明

id = フォルダID
folder = 取得されたフォルダ

フォルダのIDの確認方法は、ブラウザ上でドライブを開き、対象のフォルダにアクセスしたときのURLから確認ができます。『https://drive.google.com/drive/folders/1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH』赤文字の部分がフォルダ固有のIDになりますので、赤字部分をコピーしてid部分に貼り付けてください。
上記コードをコピーして何も変更せずに実行してからログを確認してみると『DriveAppのフォルダ/ファイルの取得』がログに表示されます。IDを入れ替えて実行した場合は置き換えたIDのフォルダ名が表示されます。上記コードの実行ログは下記スクリーンショットをご確認ください。

getFolders()サンプルコード

サンプルコード

//対象フォルダにあるすべてのフォルダを取得するプログラム
function sampleCodeForDriveAppGetFolders1() {
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH"; //フォルダID
  var target = DriveApp.getFolderById(id);
  var folders = target.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

//マイドライブにあるすべてのフォルダを取得するプログラム
function sampleCodeForDriveAppGetFolders2() {
  var myDrive = DriveApp.getRootFolder();
  var folders = myDrive.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

//ドライブ上にあるすべてのフォルダを取得するプログラム(フォルダ数によっては処理がタイムアウトします)
function sampleCodeForDriveAppGetFolders3() {
  var folders = DriveApp.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

変数の説明

id = フォルダID
target = ID指定したフォルダ
myDrive = マイドライブフォルダ
folders = FolderIterator
folder = 1つのフォルダ
folderName = フォルダ名

getFoldersメソッドはFolderIteratorを返しますので、イテレータの処理をしてフォルダ名を取得しています。FolderIteratorで取得する場合には取得される順番はめちゃくちゃですので、昇順や降順で取得したい場合にはその後の処理で並べ替えをする必要があります
Drive APIのメソッドであれば取得する順番を指定できますので取得する順番を制御したい場合はDrive APIを使うのが良いかもしれません。上記のコードもそのままコピペをすれば利用できます。フォルダを指定せずに実行する『sampleCodeForDriveAppGetFolders3』については、ドライブに作成したフォルダ数が多いとエラーになる場合があります。実行が完了してからCtrl + Enterでログを確認してみると、それぞれ対象フォルダ内にあるフォルダ名がすべてログ出力されていると思います。参考までに、『sampleCodeForDriveAppGetFolders1』を実行したときのログスクリーンショットを下記に掲載します。

getFoldersByName(name)サンプルコード

引数に入れる値

サンプルコード

//対象フォルダ内にある指定フォルダ名と一致するすべてのフォルダ取得するプログラム
function sampleCodeForDriveAppGetFoldersByName1() {
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH"; //フォルダID
  var name = "子フォルダ①";
  var target = DriveApp.getFolderById(id);
  var folders = target.getFoldersByName(name);
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

//マイドライブのフォルダをすべて取得するプログラム
function sampleCodeForDriveAppGetFoldersByName2() {
  var myDrive = DriveApp.getRootFolder();
  var name = "子フォルダ①";
  var folders = myDrive.getFoldersByName(name);
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

//ドライブ上のフォルダをすべて取得するプログラム(フォルダ数によっては処理がタイムアウトします)
function sampleCodeForDriveAppGetFoldersByName3() {
  var name = "子フォルダ①";
  var folders = DriveApp.getFoldersByName(name);
  while (folders.hasNext()) {
    var folder = folders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

変数の説明

id = フォルダID
name = 検索するフォルダ名
target = ID指定したフォルダ
myDrive = マイドライブフォルダ
folders = FolderIterator
folder = 1つのフォルダ
folderName = フォルダ名

getFoldersByNameメソッドもFolderIteratorを返しますので、イテレータの処理をしてフォルダ名を取得しています。上記コードでは『子フォルダ①』というフォルダを検索ワードとして指定しています。実行が完了してからログを確認してみると、対象フォルダ内に子フォルダ①というフォルダがあればログとしてフォルダ名が出力されていると思います。参考までに、sampleCodeForDriveAppGetFoldersByName1 を実行したときのログスクリーンショットを下記に掲載します。

getRootFolder()サンプルコード

サンプルコード

//マイドライブフォルダを取得するプログラム
function sampleCodeForDriveAppGetRootFolder() {
  var myDrive = DriveApp.getRootFolder();
  console.log(myDrive);
}

変数の説明

myDrive = マイドライブフォルダ

getRootFolderメソッドではマイドライブを取得します。上記コードを何も変更せずに実行した後、ログを確認すると『マイドライブ』がログに表示されます。下記スクリーンショットをご確認ください。

getTrashedFolders()サンプルコード

サンプルコード

//ゴミ箱に捨てられたすべてのフォルダを取得するプログラム
function sampleCodeForDriveAppGetTrashedFolders() {
  var trashedFolders = DriveApp.getTrashedFolders();
  while (trashedFolders.hasNext()) {
    var folder = trashedFolders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

変数の説明

trashedFolders = FolderIterator
folder = 1つのフォルダ
folderName = フォルダ名

getTrashedFoldersメソッドもFolderIteratorを返しますので、イテレータの処理をしてフォルダ名を取得しています。実行が完了してからログを確認してみると、ログとしてゴミ箱に入っているフォルダ名が出力されていると思います。

searchFolders(params)サンプルコード

引数に入れる値

サンプルコード

//検索クエリに一致するすべてのフォルダを取得するプログラム
function sampleCodeForDriveAppSearchFolders() {
  var params = "title contains '子フォルダ'";
  var searchedFolders = DriveApp.searchFolders(params);
  while (searchedFolders.hasNext()) {
    var folder = searchedFolders.next();
    var folderName = folder.getName();
    console.log(folderName);
  }
}

変数の説明

params = 検索クエリ
searchedFolders = FolderIterator
folder = 1つのフォルダ
folderName = フォルダ名

searchFoldersメソッドもFolderIteratorを返しますので、イテレータの処理をしてフォルダ名を取得しています。検索パラメータとして指定できる文字列はGoogle Drive SDK Documentation(英文)に記載されています。下記に一応日本語の一覧表を記載しておきます。実行が完了してからログを確認してみると、『子フォルダ』という言葉がファイル名に含まれているフォルダ名が出力されていると思います。

クエリ演算子取得定義
contains指定した文字列が検索項目に含まれる場合
=指定した文字列が検索項目に一致する場合
!=指定した文字列が検索項目に一致しない場合
<指定した値が検索項目未満の場合
<=指定した値が検索項目以下の場合
>指定した値が検索項目を超える場合
>=指定した値が検索項目以上の場合
in指定した値がコレクションに含まれる場合
and複数条件に合致する条件を指定する場合
orいずれかの条件に合致する条件を指定する場合
not検索条件に合致しない場合
has指定したパラメータがコレクションに含まれる場合
検索項目使用できるクエリ使い方
title (フォルダ名)contains
=
!=
フォルダ名を指定します。
クエリ作成時には検索対象の文字列の先頭と最後尾にシングルクォーテーションをつけて使用します。検索名にシングルクォーテーションが含まれる場合は\(バックスラッシュ)をつけてエスケープします。

エスケープ例)‘Valentine\’s Day’

クエリの指定方法例)
“title contains ‘Valentine\’s Day'”(フォルダ名にValentine’s Dayが含まれるものを検索するクエリ)
“title = ‘Valentine\’s Day'”(フォルダ名がValentine’s Dayと完全一致するものを検索するクエリ)
“title != ‘Valentine\’s Day'”(フォルダ名がValentine’s Dayと完全一致しないものを検索するクエリ)
fullTextcontainsファイルに付随するすべてのテキストデータを検索対象とします。
すべてのテキストデータとは、ファイル名詳細説明ファイル内テキストインデックステキストがテキストデータに該当します。
いずれかに指定する文字が含まれる場合に検索クエリに一致します。検索ワードにシングルクォーテーションが含まれる場合は\でエスケープします。

クエリの指定方法例)
“fullText contains ‘Valentine\’s Day'”(テキストデータのいずれかにValentine’s Dayが含まれるものを検索するクエリ)
mimeTypecontains
=
!=
MIMEタイプで検索します。
MIMEタイプの種類についてはこちらをクリック

クエリの指定方法例)
“mimeType contains ‘pdf'”(MIMEタイプにpdfが含まれるものを検索するクエリ)
“mimeType = ‘application/pdf'”(MIMEタイプがapplication/pdfに完全一致するものを検索するクエリ)
“mimeType != ‘application/pdf‘”(MIMEタイプがapplication/pdfと異なるものを検索するクエリ)
modifiedDate<=
<
=
!=
>
=>
最終更新日で検索します。指定方法はRFC3339フォーマットです。
デフォルトのタイムゾーンはUTCになります。(例)2012-06-04T12:00:00+09:00

クエリの指定方法例)
“modifiedDate <= ‘2012-06-04T12:00:00+09:00‘”(最終更新日が2012年6月4日21時以前のものを検索するクエリ)
“modifiedDate < ‘2012-06-04T12:00:00+09:00‘”(最終更新日が2012年6月4日21時よりも前のものを検索するクエリ)
“modifiedDate = ‘2012-06-04T12:00:00+09:00‘”(最終更新日が2012年6月4日21時のものを検索するクエリ)
“modifiedDate > ‘2012-06-04T12:00:00+09:00‘”(最終更新日が2012年6月4日21時よりも後のものを検索するクエリ)
“modifiedDate => ‘2012-06-04T12:00:00+09:00‘”(最終更新日が2012年6月4日21時以降のものを検索するクエリ)
lastViewedByMeDate<=
<
=
!=
>
=>
自分が最後にファイルを閲覧した日で検索します。指定方法はmodifiedDateと同じです。

クエリの指定方法例)
“lastViewedByMeDate <= ‘2012-06-04T12:00:00+09:00‘”(最終閲覧日が2012年6月4日21時以前のものを検索するクエリ)
“lastViewedByMeDate < ‘2012-06-04T12:00:00+09:00‘”(最終閲覧日が2012年6月4日21時よりも前のものを検索するクエリ)
“lastViewedByMeDate = ‘2012-06-04T12:00:00+09:00‘”(最終閲覧日が2012年6月4日21時のものを検索するクエリ)
“lastViewedByMeDate > ‘2012-06-04T12:00:00+09:00‘”(最終閲覧日が2012年6月4日21時よりも後のものを検索するクエリ)
“lastViewedByMeDate => ‘2012-06-04T12:00:00+09:00‘”(最終閲覧日が2012年6月4日21時以降のものを検索するクエリ)
trashed=
!=
ゴミ箱に捨ててあるかどうかで検索します。trueかfalseにて指定。

クエリの指定方法例)
“trashed = true(ゴミ箱に捨ててあるものを検索するクエリ)
“trashed != true(ゴミ箱に捨ててないものを検索するクエリ)
“trashed = false(ゴミ箱に捨ててないものを検索するクエリ)
“trashed != false(ゴミ箱に捨ててあるものを検索するクエリ)
starred=
=!
スター付きかどうかで検索します。trueかfalseにて指定。

クエリの指定方法例)
“starred = true(スター付きのものを検索するクエリ)
“starred != true”(スター付きでないものを検索するクエリ)
“starred = false(スター付きでないものを検索するクエリ)
“starred != false(スター付きのものを検索するクエリ)
parentsin親フォルダのIDで検索。

クエリの指定方法例)
“parents in ‘1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxb‘”(親フォルダが1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxbのものを検索するクエリ)
ownersinオーナーアカウントで検索。

クエリの指定方法例)
“owners in ‘admin@for-dummies.net‘”(オーナーがadmin@for-dummies.netのものを検索するクエリ)
writersin編集者アカウントで検索。

クエリの指定方法例)
“writers in ‘admin@for-dummies.net‘”(編集者がadmin@for-dummies.netのものを検索するクエリ)
readersin閲覧者アカウントで検索。

クエリの指定方法例)
“readers in ‘admin@for-dummies.net‘”(閲覧者がadmin@for-dummies.netのものを検索するクエリ)
sharedWithMe=
!=
共有アイテムにあるかどうかで検索ができます。trueかfalseにて指定。

クエリの指定方法例)
“sharedWithMe = true(自分に共有されているのものを検索するクエリ)
“sharedWithMe != true”(自分に共有されていないものを検索するクエリ)
“sharedWithMe = false(自分に共有されていないものを検索するクエリ)
“sharedWithMe != false(自分に共有されているのものを検索するクエリ)
createdTime<=
<
=
!=
>
=>
ファイル作成日で検索します。指定方法はRFC3339フォーマットです。
デフォルトのタイムゾーンはUTCになります。(例)2012-06-04T12:00:00+09:00

クエリの指定方法例)
“createdTime <= ‘2012-06-04T12:00:00+09:00‘”(ファイル作成日が2012年6月4日21時以前のものを検索するクエリ)
“createdTime < ‘2012-06-04T12:00:00+09:00‘”(ファイル作成日が2012年6月4日21時よりも前のものを検索するクエリ)
“createdTime = ‘2012-06-04T12:00:00+09:00‘”(ファイル作成日が2012年6月4日21時のものを検索するクエリ)
“createdTime > ‘2012-06-04T12:00:00+09:00‘”(ファイル作成日が2012年6月4日21時よりも後のものを検索するクエリ)
“createdTime => ‘2012-06-04T12:00:00+09:00‘”(ファイル作成日が2012年6月4日21時以降のものを検索するクエリ)
propertieshasファイルのパブリックカスタムプロパティで検索

クエリの指定方法例)
“properties has {検索したいプロパティ}(プロパティ名を持っているものを検索するクエリ)
appPropertieshasファイルのパブリックカスタムプロパティで検索

クエリの指定方法例)
“properties has {検索したいプロパティ}”(プロパティ名を持っているものを検索するクエリ)
visibility=
!=
共有設定にて検索。使える値はanyoneCanFind, anyoneWithLink, domainCanFind, domainWithLink, Limitedのいずれか。

クエリの指定方法例)
“visibility = ‘anyoneCanFind‘”(誰でもアクセスできるものを検索するクエリ)
“visibility = ‘anyoneWithLink‘”(リンクを知っている誰でもアクセスできるものを検索するクエリ)
“visibility = ‘domainCanFind‘”(ドメイン内の誰でもアクセスできるものを検索するクエリ)
“visibility = ‘domainWithLink‘”(リンクを知っているドメイン内の誰でもアクセスできるものを検索するクエリ)
“visibility = ‘Limited‘”(制限された共有設定のものを検索するクエリ)
“visibility != ‘anyoneCanFind‘”(誰でもアクセスできないものを検索するクエリ)
“visibility != ‘anyoneWithLink‘”(リンクを知っている誰でもアクセスできないものを検索するクエリ)
“visibility != ‘domainCanFind‘”(ドメイン内のリンクの誰でもアクセスできないものを検索するクエリ)
“visibility != ‘domainWithLink‘”(リンクを知っているドメイン内の誰でもアクセスできるものを検索するクエリ)
“visibility != ‘Limited‘”(誰でもアクセスできないものを検索するクエリ)
shortcutDetails.targetId=
!=
ショートカット元のファイルIDで検索

クエリの指定方法例)
“shortcutDetails.targetId = ‘1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxb‘”(ショートカット元が1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxbのショートカットを検索するクエリ)
“shortcutDetails.targetId != ‘1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxb‘”(ショートカット元が1ErLeAamJM5gHaQKsiAw7ThEGHa3BFTxbではないショートカットを検索するクエリ)

getFileById(id)サンプルコード

引数に入れる値

サンプルコード

//ID指定でファイルを取得するプログラム
function sampleCodeForDriveAppGetFileById() {
  var id = "1XTvefLwnomP_cEdF7StgXjj37eFMgMZm"; //ファイルID
  var file = DriveApp.getFileById(id);
  console.log(file);
}

変数の説明

id = ファイルID
file = 取得されたファイル

ファイルIDの確認方法はいくつかありますが、1つご紹介すると、ブラウザ上でドライブを開き、対象のファイル名上で右クリックして共有可能なURLを取得から確認ができます。『https://drive.google.com/open?id=1XTvefLwnomP_cEdF7StgXjj37eFMgMZm』赤文字の部分がファイル固有のIDになりますので、赤字部分をコピーしてid部分に貼り付けてください。上記コードをコピーして何も変更せずに実行後、ログを確認してみると『Test①.csv』がログに表示されます。下記スクリーンショットをご確認ください。

getFiles()サンプルコード

サンプルコード

//対象フォルダ内のすべてのファイルを取得するプログラム
function sampleCodeForDriveAppGetFiles1() {
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH"; //フォルダID
  var target = DriveApp.getFolderById(id);
  var files = target.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//マイドライブのすべてのファイルを取得するプログラム
function sampleCodeForDriveAppGetFiles2() {
  var myDrive = DriveApp.getRootFolder();
  var files = myDrive.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//ドライブ上のすべてのファイルを取得するプログラム(ファイル数によっては処理がタイムアウトします)
function sampleCodeForDriveAppGetFiles3() {
  var files = DriveApp.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

変数の説明

id = フォルダID
target = ID指定したフォルダ
myDrive = マイドライブフォルダ
files = FileIterator
file = 1つのファイル
fileName = ファイル名

getFilesメソッドはFileIteratorを返しますので、イテレータの処理をしてフォルダ名を取得しています。FileIteratorで取得する場合には取得される順番はめちゃくちゃですので、昇順や降順で取得したい場合にはその後の処理で並べ替えをする必要があります。Drive APIのメソッドであれば取得する順番を指定できますので取得する順番を制御したい場合はDrive APIを使うのが良いかもしれません。上記のコードもそのままコピペをすれば利用できます。フォルダを指定せずに実行する『sampleCodeForDriveAppGetFiles3』については、ドライブに格納しているファイル数が多いと処理が長くなりエラーになります。実行が完了してからログを確認してみると、それぞれ対象フォルダ内にあるファイル名がすべてログ出力されていると思います。参考までに、『sampleCodeForDriveAppGetFiles1』 を実行したときのログスクリーンショットを下記に掲載します。

getFilesByName(name)サンプルコード

引数に入れる値

サンプルコード

//対象フォルダ内にある指定ファイル名と一致するすべてのファイル取得するプログラム
function sampleCodeForDriveAppGetFilesByName1() {
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH"; //フォルダID
  var name = "Test①.csv";
  var target = DriveApp.getFolderById(id);
  var files = target.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//マイドライブにある指定ファイル名と一致するすべてのファイル取得するプログラム
function sampleCodeForDriveAppGetFilesByName2() {
  var myDrive = DriveApp.getRootFolder();
  var name = "Test①.csv";
  var files = myDrive.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//ドライブ上にある指定ファイル名と一致するすべてのファイル取得するプログラム
function sampleCodeForDriveAppGetFilesByName3() {
  var name = "Test①.csv";
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

変数の説明

id = フォルダID
name = 検索するフォルダ名
target = ID指定したフォルダ
myDrive = マイドライブフォルダ
files = FileIterator
file = 1つのファイル
fileName = ファイル名

getFilesByNameメソッドもFileIteratorを返しますので、イテレータの処理をしてファイル名を取得しています。上記コードでは『Test①.csv』という文字列を検索ファイル名として指定しています。実行が完了してからログを確認してみると、対象フォルダ内にTest①.csvというフォルダがあればログとしてファイル名が出力されていると思います。参考までに、sampleCodeForDriveAppGetFilesByName1 を実行したときのログスクリーンショットを下記に掲載します。

ちなみに、小ネタですが、ドライブでは同じ名前のファイルを1つのフォルダに持つことができます。デスクトップ用クライアント(Backup and Sync)をインストールしている場合はローカル上ではファイル名には(1)というような番号付けがされますが、ブラウザ版Googleドライブでは同じ名前の状態で格納されます。お気づきの方もいるかもしれませんが、今回のメソッドはgetFilesByNameですので、ファイルは複数形で表記されています。同じファイル名のファイルが同一フォルダ内に複数ある場合にはすべてのファイルが取得されます。

みなさんは同じ名前のファイルを①つのフォルダに入れられるの知ってましたか?ひと目でどっちのファイルなのか見分けられなくなりますが、GoogleドライブがIDでファイルを取得していることを理解するにはとても良い参考例だと思います。

getFilesByType(mimeType)サンプルコード

引数に入れる値

サンプルコード

//対象フォルダ内の指定したファイルタイプに合致するすべてのファイルを取得するプログラム
function sampleCodeForDriveAppGetFilesByType1() {
  var mimeType = "text/csv";
  var id = "1ohmSR625ShiR0hoBr9DFL7Zkh9VX8jXH";
  var folder = DriveApp.getFolderById(id);
  var files = folder.getFilesByType(mimeType);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//マイドライブ内の指定したファイルタイプに合致するすべてのファイルを取得するプログラム
function sampleCodeForDriveAppGetFilesByType2() {
  var mimeType = "text/csv";
  var myDrive = DriveApp.getRootFolder();
  var files = myDrive.getFilesByType(mimeType);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

//Googleドライブ上にある指定したファイルタイプに合致するすべてのファイルを取得するプログラム(時間がかかる場合があります)
function sampleCodeForDriveAppGetFilesByType() {
  var mimeType = "text/csv";
  var files = DriveApp.getFilesByType(mimeType);
  while (files.hasNext()) {
    var file = files.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

変数の説明

id = フォルダID
mimeType = 検索するファイルタイプ
target = ID指定したフォルダ
myDrive = マイドライブフォルダ
files = FileIterator
file = 1つのファイル
fileName = ファイル名

getTrashedFilesメソッドもFileIteratorを返しますので、イテレータの処理をしてファイル名を取得しています。実行が完了してからログを確認してみると、ログとして指定のファイルタイプに一致したファイルのファイル名が出力されていると思います。

指定可能なMIMEタイプ

拡張子MIMEタイプ
Google Docsapplication/vnd.google-apps.document
Google Formsapplication/vnd.google-apps.form
Google My Mapsapplication/vnd.google-apps.map
Google Slidesapplication/vnd.google-apps.presentation
Google Apps Scriptapplication/vnd.google-apps.script
Google Sitesapplication/vnd.google-apps.site
Google Sheetsapplication/vnd.google-apps.spreadsheet
xlsapplication/vnd.ms-excel
xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xmltext/xml
odsapplication/vnd.oasis.opendocument.spreadsheet
csvtext/csv
tmpltext/plain
pdfapplication/pdf
phpapplication/x-httpd-php
jpgimage/jpeg
pngimage/png
gifimage/gif
bmpimage/bmp
txttext/plain
docapplication/msword
jstext/js
swfapplication/x-shockwave-flash
mp3audio/mpeg
zipapplication/zip
rarapplication/rar
tarapplication/tar
arjapplication/arj
cabapplication/cab
htmltext/html
htmtext/htm
defaultapplication/octet-stream

getTrashedFiles()サンプルコード

サンプルコード

//ゴミ箱に捨てられたすべてのファイル取得するプログラム
function sampleCodeForDriveAppGetTrashedFiles() {
  var trashedFiles = DriveApp.getTrashedFiles();
  while (trashedFiles.hasNext()) {
    var file = trashedFiles.next();
    var fileName = files.getName();
    console.log(fileName);
  }
}

変数の説明

trashedFiles = FileIterator
file = 1つのファイル
fileName = ファイル名

getTrashedFilesメソッドもFileIteratorを返しますので、イテレータの処理をしてファイル名を取得しています。実行が完了してからログを確認してみると、ログとしてゴミ箱に入っているファイル名が出力されていると思います。

searchFiles(params)サンプルコード

引数に入れる値

サンプルコード

//検索クエリに合致するすべてのファイルを取得するプログラム
function sampleCodeForDriveAppSearchFiles() {
  var params = "title contains 'Test'";
  var searchedFiles = DriveApp.searchFiles(params);
  while (searchedFiles.hasNext()) {
    var file = searchedFiles.next();
    var fileName = file.getName();
    console.log(fileName);
  }
}

変数の説明

searchedFiles = FileIterator
file = 1つのファイル
fileName = ファイル名

searchFilesメソッドもFileIteratorを返しますので、イテレータの処理をしてファイル名を取得しています。検索パラメータとして指定できる文字列はsearchFoldersの説明文と同じようにGoogle Drive SDK Documentation(英文)に記載されています。日本語訳の一覧表はsearchFoldersの説明部分を参照してください。。実行が完了してからログを確認してみると、『Test』という言葉がファイル名に含まれているファイルのファイル名が出力されていると思います。

イテレータについて

さて、今までの説明の中にイテレータという言葉が何度も出てきましたが、イテレータについて簡単に説明したいと思います。私も概念的なことはなんとなくで理解していますので、詳しく突っ込まれると答えられないですが、なんとなくなイメージとして理解ができるように概要を説明します。

イテレータのイメージとしては私は中身が見えない袋のようなものだと思っています。イテレータには主にhasNext()とnext()という2つのメソッドがあります。

  • hasNext()

袋の中に何かが入っているかどうかを確認するためのメソッドになります。
袋の中に何かが入っていればtrue、何も入っていなければfalseを返すメソッドです。

  • next()

袋の中から入っているものを一つずつ取り出すメソッドです。
取り出すことで袋の中身が一つずつ少なくなっていくことをイメージしてもらえれば良いかと思います。
中身が見えないため、取り出すまでどれが出てくるかわからないというイメージです。

今回のサンプルコードでもイテレータの処理を行っているのですが、whileループを使ってループ処理を行っています。whileといえば、評価式がtrueである限りループを繰り返すループ処理になりますが、イテレータの場合、一つずつ取り出していくと最終的には袋の中に何もない状態になります何もない状態になるとhasNext()が最終的にfalseを返すためイテレータ処理との相性が良いのです。

私も以前ハマった部分の一つですが、イテレータでnext()を行うと、元の変数の要素から取り出した要素がなくなっていきます。

このため、1回のループ内で1回以上next()を行ってしまうと想定以上に取り出しを行ってしまうのでご注意ください。

例えば、取り出した要素に対してファイル名とファイルIDを取得したい場合に、下記のsampleCodeForIteratorProcess1のようにコードを書いてしまうと想定通りの処理が行なえません。

こういう場合は、sampleCodeForIteratorProcess2のように、一度next()で取り出した要素を変数に入れてから処理を行うようにしましょう。

//想定通りに処理ができない例
function sampleCodeForIteratorProcess1() {
  var params = "title contains 'Test'";
  var searchedFiles = DriveApp.searchFiles(params);
  while (searchedFiles.hasNext()) {
    var fileName = searchedFiles.next().getName();
    var fileId = searchedFiles.next().getId();
  }
}

//想定通りに処理ができる例
function sampleCodeForIteratorProcess2() {
  var params = "title contains 'Test'";
  var searchedFiles = DriveApp.searchFiles(params);
  while (searchedFiles.hasNext()) {
    var file = searchedFiles.next();
    var fileName = file.getName();
    var fileId = file.getId();
  }
}

なんとなくイメージはつかめてきましたでしょうか?使っていくうちに慣れてくると思います。私もこれ以上の概念的な部分は書籍でも読んだことはないので更に奥深いのかもしれませんが、そこまで理解していなくても問題なく使えています。

ファイルやフォルダを取得後にそれぞれの関連データを続けて取得したい場合は、別記事でメソッドをまとめましたので、

を参考にしてください。

まとめ

今回は、Google Apps Scriptを使って、Googleドライブ上のフォルダやファイルを取得するメソッドをご紹介しました。

いろいろなメソッドがありますが、使い方はどれもほとんど同じです。単一のファイルで取得するかイテレータとして取得するか。この違いが理解できていればその後の処理もそれほど難しくないと思います。

状況に応じてどれを使うべきかを考えてコードを書いていきましょう。GASのドライブ上の処理は比較的時間のかかる処理が多いので、書き方によって処理時間が長くなりすぎてしまいます。

処理時間がかかりすぎてしまう場合はコードのどこかに効率的に処理できる部分がないか考えてみましょう。

Exit mobile version