Googleアカウントがあれば、写真、動画、ファイルなどをクラウドに保存できるGoogleドライブ。
仕事でGoogleドライブを使うことも多いんではないでしょうか。Google Apps Scriptを使えばGoogleドライブ内のファイルやフォルダを作成、検索、変更することができます。
今回はファイルの検索について説明します。
Google Apps Script(GAS)は、Googleが提供するサービスの1つです。JavaScriptベースのスクリプト言語で、Googleアカウントを持っていれば無料で使えます。
GASを作成する
Googleドライブを操作するためのGASファイルを作成します。
Googleドライブを開き、「新規」→「その他」→「Google Apps Script」をクリックします。
GASのスクリプトエディタが開きます。プロジェクト名は「Googleドライブテスト」としました。右下の「function myFunction() {}」という部分にスクリプトを書いていきます。
すべてのファイルを取得する
GASが作成できたので早速スクリプトを書いていきましょう。「function myFunction() {}」を消して、以下のスクリプトを書いてください。
const getAllFiles = () => {
const files = DriveApp.getFiles();
while (files.hasNext()) {
const file = files.next();
console.log(file.getName());
}
};
スクリプトが書けたら、プロジェクトを保存して実行します。実行する関数が「getAllFiles」になっているか確認してください。
初めて実行する場合は、承認が必要になります。
承認後、再度実行してみてください。スクリプトエディタに実行ログにGoogleドライブ内のすべてのファイルが表示されるはずです。
解説
今回実行したのが以下のスクリプトです。
const getAllFiles = () => {
const files = DriveApp.getFiles();
while (files.hasNext()) {
const file = files.next();
console.log(file.getName());
}
};
2行目の「const files = DriveApp.getFiles();」が、Googleドライブのすべてのファイルを取得するスクリプトになります。取得したデータは「FileIterator(ファイルイテレータ)」という形式です。
イテレータは、ウィキペディアによると以下のように説明されています。
イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。JISでは反復子(はんぷくし)と翻訳されている。
イテレータ Wikipedia
イテレータを使えばデータの集まりに対して、「次」、「次」と抽象的に命令するだけで、順番に各データを取得することができます。
GASの「FileIteratorクラス」には次のようなメソッドが準備されています。
- getContinuationToken():後でこのイテレータを再開するために使用するトークンを取得する。
- hasNext():next()メソッドを呼び出したときにアイテムを返すかどうか。
- next():次のアイテムを取得する。
今回のスクリプトで使用しているのが「hasNext()」と「Next()」です。2行目で取得したGoogleドライブのファイルイテレータに対して、データがなくなるまで処理を繰り返します。
while (files.hasNext()) { //まだデータある? あれば1へ、なければ2へ
//1 データがある場合
const file = files.next(); //データをもらってfileに格納
console.log(file.getName()); //もらったデータの名前を表示
}
//2 データがない場合
上のスクリプトの1行目の「while (files.hasNext()) {」は、filesに次のデータがある限り処理を続けます。
3行目の「const file = files.next();」で、files(Googleドライブのファイル)の次のデータを取得しています。
4行目の「console.log(file.getName());」が3行目で取得したデータに対する処理になります。今回は取得したデータの名前をログに表示させています。
名前以外も取得する
先ほどのスクリプトでは名前を取得しましたが、それ以外の情報も取得できます。例えば、名前以外にもIDや作成日時などが取得できます。名前以外をログに表示させてみます。以下のスクリプトに書き替えてください。
const getAllFiles = () => {
const files = DriveApp.getFiles();
while (files.hasNext()) {
const file = files.next();
console.log("******************************");
console.log(`Name: ${file.getName()}`);
console.log(`Url: ${file.getUrl()}`);
console.log(`Id: ${file.getId()}`);
console.log(`DateCreated: ${file.getDateCreated()}`);
console.log(`LastUpdated: ${file.getLastUpdated()}`);
console.log(`MimeType: ${file.getMimeType()}`);
console.log(`SharingAccess: ${file.getSharingAccess()}`);
console.log(`SharingPermission: ${file.getSharingPermission()}`);
console.log(`Editor: ${file.getEditors()}`);
console.log(`Viewers: ${file.getViewers()}`);
}
};
上のスクリプトを実行した結果が以下のとおりです。Googleドライブのファイルの数だけログが表示されます。
それぞれのメソッドについては以下のとおりです。
getUrl()
ファイルのURLを取得します。
getId()
ファイルのIDを取得します。
getDateCreated()
ファイルが作成された日付を取得します。
getLastUpdated()
ファイルが最後に更新された日付を取得します。
getMimeType()
ファイルのMimeタイプを取得します。Mimeタイプは、簡単に言うとファイルの種類のことです。以下のようなMimeタイプがあります。
- application/vnd.google-apps.document:Googleドキュメント
- application/vnd.google-apps.spreadsheet:Googleスプレッドシート
- application/vnd.google-apps.form:Googleフォーム
- application/vnd.google-apps.presentation:Googleスライド
- application/vnd.google-apps.script:Google Apps Script
getSharingAccess()
個別に共有している特定のユーザー以外で、ファイルにアクセスできるユーザーを取得します。戻り値には以下のようなものがあります。詳しくは公式を参照してください。
- ANYONE_WITH_LINK:リンクを知っている人は誰でもアクセスできる。サインインは不要。
- PRIVATE:明示的に許可された人だけがアクセスできる。サインインが必要。
getSharingPermission()
個別に共有している特定のユーザー以外で、ファイルにアクセスできるユーザーに付与された権限を取得します。戻り値には以下のようなものがあります。詳しくは公式を参照してください。
- VIEW:表示またはコピーができる。
- EDIT:編集できる。
- COMMENT:表示、コピー、コメントすることができる。
getEditors()
ファイルの編集権限を持っているユーザーの配列を取得します。対象のユーザーがいない場合は、空の配列を返します。
getViewers()
ファイルの閲覧者や閲覧者(コメント可)の権限を持っているユーザーの配列を取得します。対象のユーザーがいない場合は、空の配列を返します。
任意のフォルダにあるすべてのファイルを取得する
「DriveApp.getFolderById()」を使えば、任意のフォルダのファイルを取得することができます。
const getFilesInFolderById = () => {
const folder = DriveApp.getFolderById("取得するフォルダのidをここに書く");
const files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
console.log(file.getName());
}
};
2行目にファイルを取得したいフォルダのidを書きます。「取得するフォルダのidをここに書く」という部分を対象のフォルダのidに変更してください。
フォルダのidは、Googleドライブで対象のフォルダを開いたときのURLから確認ができます。
スプレッドシートのファイルのみ取得する
DriveAppクラスには、Mimeタイプを指定してファイルを取得するメソッドが用意されています。それが「getFilesByType(MimeType)」メソッドです。これを使えば、簡単にスプレッドシートのファイルのみを取得することができます。
以下のスクリプトは、Googleドライブ内のすべてのスプレッドシートのファイルを取得します。
const getAllSpreadSheetFiles = () => {
const files = DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS);
while (files.hasNext()) {
const file = files.next();
console.log(file.getName());
}
};
2行目の「getFilesByType()」に渡すMimeタイプを変えることで、スプレッドシート以外のファイルも取得することができます。
Mimeタイプには以下のようなものがあります。例えば、Googleスライドだけ取得したいときは「MimeType.GOOGLE_SLIDES」を指定します。
下に列挙したもの以外にもMimeタイプがあります。公式を参照してください。
- GOOGLE_APPS_SCRIPT:Google Apps Script
- GOOGLE_DRAWINGS:Google図形描画
- GOOGLE_DOCS:Googleドキュメント
- GOOGLE_FORMS:Googleフォーム
- GOOGLE_SHEETS:Googleスプレッドシート
- GOOGLE_SITES:Googleサイト
- GOOGLE_SLIDES:Googleスライド
まとめ
Googleドライブを操作するためには、DriveAppクラスを使用します。
DriveAppクラスには、すべてのファイルを取得するためのgetFiles()メソッドがあり、FileIterator(ファイルイテレータ)として取得することができます。
イテレータは、データの集まりに対して行う繰り返し処理の抽象化のことです。
FileIteratorクラスには、次のデータを取得するNext()メソッドと、次のデータが存在するか確認するためのhasNext()メソッドがあります。
DriveAppクラスのgetFolderById()メソッドを使うことで、そのフォルダ内のファイルだけを取得できます。
DriveAppクラスのgetFilesByType(MimeType)メソッドを使えば、指定したMimeタイプのファイルだけを取得できます。
実際にファイルを取得するときは、スプレッドシートに出力して使うことが多いと思います。
スプレッドシートへの出力については、以下の記事を参考にしてください。