40 代おっさん GASのフォルダ・ファイルのコレクションを操作する

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## フォルダ・ファイルをコレクションとして取得する

ファイル・フォルダをコレクションとして取得するメソッドが用意されている。

ファイル・フォルダのコレクションを取得するメソッド
|メソッド|説明|DriveApp|Folder|
|--------|----|--------|-----|
|getFiles()|すべてのファイル|　　〇|　〇|
|getFolders()|すべてのフォルダ|　　〇|　〇|
|getFilesByName(name)|該当するファイル名のファイル|　　〇|　〇|
|getFoldersByName(name)|該当するフォルダ名のフォルダ|　　〇|　〇|
|getFilesByType(mimeType)|該当するMIMEのフォルダ|　　〇|　〇|
|getTrashedFiles()|ゴミ箱内のファイル|　　〇||
|getTrashedForders()|ゴミ箱内のフォルダ|　　〇||
|searchFiles(params)|検索条件に一致したファイル|　　〇|　〇|
|searchFolders(params)|検索条件に一致したフォルダ|　　〇|　〇|

これらのメソッドを取得できるのは
FolderIteratorオブジェクト
FileIteratorオブジェクト
と呼ばれるもので、フォルダ・ファイルのコレクションになる
操作を行うには、コレクションから個々のオブジェクトを取り出す必要がある。

### フォルダ・ファイルのコレクションの反復処理

FolderIteratorクラス・FileIteratorクラスとは
フォルダとファイルのコレクションを操作する機能を提供する物

FolderIteratorクラス・FileIteratorクラスの主なメンバ
|メンバ|戻り値|説明|
|------|-----|----|
|hasNext()|Boolean｜｜次のフォルダまたはファイルが存在するかを判定する|
|next()|Folder/File｜｜次のフォルダまたはファイルを取得する|

nextメソッドは、フォルダ・ファイルのコレクションについての反復処理において、取り出していないフォルダ・ファイルを取り出す。

構文

```javascript
FolderIteratorオブジェクト.next()
FileIteratorオブジェクト.next()
```

フォルダ・ファイルが見つからない場合、例外がスローされる。
それを防ぐためにフォルダ・ファイル存在するか判定する。
hasNextメソッドを使用

構文

```javascript
FolderIteratorオブジェクト.hasNext()
FileIteratorオブジェクト.hasNext()
```

お試し

```javascript
function tosiki() {
  const id     = '1BxF2vAvoSvfc9mEpaOIt6mPT37BMeHSV';
  const targetFolder = DriveApp.getFolderById(id);

  const subFolders = targetFolder.getFolders();
  while (subFolders.hasNext()) {
    const folder =subFolders.next();
    console.log(folder.getName());
  }
}
```

while文でhasNextを条件式にすれば例外を出すことなく実施できる。

### MIMEタイプによりファイルを取得する

MIMEタイプとは
ファイルの形式を識別するためのコード体系

Googleドライブ内または、フォルダ内から特定のMIMEタイプのファイルコレクションを収得するには
getFilesByTypeを使用

構文

```javascript
DriveApp.getFilesByType(MIMEタイプ)
Folderオブジェクト.getFilesByType(MIMEタイプ)
```

文字列表記を指定して用いることもできるが、EnumとしてEnum MimeTypeが用意されている。

構文

```javascript
Enum名.プロパティ
```

＊Enum MimeTypeのプロパティの図は、参考資料の本を見ていただくか、ネットで調べください。

ちなみにこちらで書いてありました。
<https://hirachin.com/post-4364/>

お試し

```javascript
function tosiki() {
  const id           = '****************';
  const targetFolder = DriveApp.getFolderById(id);

  const files = targetFolder.getFilesByType(MimeType.PLAIN_TEXT);
  while(files.hasNext()) {
    const file = files.next();
    console.log(file.getName());
  }
}
```

### 検索によりファルダ・ファイルを取得する

searchFordersメソッド
searchFilesメソッド
を使うことでGoogleドライブ内またはフォルダ内を特定の条件で検索できる。

構文(searchFordersメソッド)

```javascript
DriveApp.searchForders(検索条件)
Folderオブジェクト.searchForders(検索条件)
```

構文(searchFilesメソッド)

```javascript
DriveApp.searchFiles(検索条件)
Folderオブジェクト.searchFiles(検索条件)
```

検索条件の主なフィールド
|プロパティ|値|説明|
|---------|--|----|
|title|string|名前|
|fullText|string|名前,説明,内容及びインデックス可能なすべてのテキスト|
|mimeType|string|MIMEタイプ|
|trashed|boolean|ゴミ箱にあるかどうか|
|starred|boolean|スターが付与されているかどうか|
|parents|collection|親フォルダのフォルダIDのコレクション|

検索条件に使用する演算子
|演算子|説明|
|-----|----|
|contains|文字列が含まれている|
|　 =|等しい|
|　 !=|等しくない|
|　 in|要素がコレクション内に含まれている|
|　 and|かつ|
|　 or|または|
|　 not|否定|

お試し

```javascript
function tosiki() {
  const params = 'title contains "to" and starred = true';

  const files = DriveApp.searchFiles(params);
  while(files.hasNext()) {
    const file = files.next();
    console.log(`${file.getName()}:${file.getMimeType()}`);
  }
}
```

## 参考資料

<https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Google-Apps-Script%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88/dp/4798064742>