GASとGoogleドライブとの連携方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの9日目の記事です。今年も完走目指して頑張るぞ！

今日はGASからGoogleドライブを操作する方法についてみていきます。

# GASからGoogleドライブを操作する方法
GASには、[DriveAppクラス](https://developers.google.com/apps-script/reference/drive/drive-app?hl=ja)が用意されており、これらを使うことでGoogleドライブを操作することが可能です。
よく使うメソッドについていくつか見ていきましょう。

## DriveAppクラス

| メソッド | 説明 |
|---------|------|
| getFolders() | ユーザーのルートフォルダ内のすべてのフォルダを取得します。 |
| getFiles() | ユーザーのルートフォルダ内のすべてのファイルを取得します。 |
| getFileById(id) | ファイルのIDを指定してファイルを取得します。 |
| getFolderById(id) | フォルダのIDを指定してフォルダを取得します。 |
| createFolder(name) | 新しいフォルダを指定した名前で作成します。 |
| createFile(blob) | バイナリデータ（Blob）から新しいファイルを作成します。 |
| getFilesByName(name) | 指定した名前のファイルを取得します。 |
| getFoldersByName(name) | 指定した名前のフォルダを取得します。 |
| removeFile(file) | ファイルを削除します。 |
| removeFolder(folder) | フォルダを削除します。 |


# 作るもの
Googleドライブの特定のフォルダを監視して、前日に新規で作成されたファイルをメールで通知するスクリプトを作っていきます。

# GASを書いていく

```javascript
  const folderId = 'フォルダのID'; 
  const recipients = 'sample@example.com'; // 通知を受け取るユーザーのメールアドレス
```

本当はフォルダのIDやメールアドレスは[スクリプトプロパティ](https://qiita.com/kakakaori830/private/f3c1a1539b875d933b7a#webhook-url%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)に登録してそれを参照するほうがセキュリティ的にはいいのですが、今回は ~~めんどくさい~~ 時間短縮のために直接コードに書いていっちゃいます。

![スクリーンショット 2023-12-02 20.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/4149c292-7f26-6261-947f-5d7ea1d5a510.png)

フォルダIDはこの部分。

```javascript
  var today = new Date();
  today.setHours(0, 0, 0, 0); // 今日の日付を取得して時刻をリセット
  
  var yesterday = new Date(today);
  yesterday.setDate(yesterday.getDate() - 1); // 前日の日付を取得
``` 

「昨日作成されたファイル」だけを検知するようにしたいので日付を取得しておきます。

```javascript
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
  var newFiles = [];
```

DriveAppクラスの`getFolderById`と`getFiles`メソッドを使い、指定されたフォルダにあるすべてのファイルを取得します。そして昨日作成されたファイルのみを`newFiles`の配列に格納していきます。

```javascript
  while (files.hasNext()) {
    var file = files.next();
    var dateCreated = file.getDateCreated();
    // 前日に追加されたファイルを抽出
    if (dateCreated >= yesterday && dateCreated < today) {
      newFiles.push(file);
    }
  }
```

`files.hasNext()`とすることでファイルを１つずつ見ていきます。前日に追加されたファイルか否かは`getDateCreated`メソッドでファイルの生成日を取得して、その日時と先程生成した今日と昨日の日付との比較を行います。昨日生成されたものだった場合のみ`newFiles`に追加していきます。

```javascript
  if (newFiles.length > 0) {
    var fileNames = newFiles.map(function(file) {
      return file.getName();
    }).join(", ");
    
    var message = "前日に追加されたファイル: " + fileNames;
    MailApp.sendEmail(recipients, '前日に追加されたファイルがあります', message);
  }
```

最後にメールで通知する処理についてです。今回は新しいファイルがあった場合のみ通知したかったのでifで`newFiles`の有無を確認して分岐を入れています。`file.getName()`でファイル名を取得して
`join(", ")`を使って「,」区切りの文字列にしています。
そして`message`変数に本文としてファイル名を追加して`MailApp.sendEmail`を使ってメールの送信を行っています。

# 完成品がこちら

## GASのコード

```javascript
function checkForNewFilesAndNotify() {
  const folderId = 'フォルダのID'; 
  const recipients = 'sample@example.com'; // 通知を受け取るユーザーのメールアドレス
  var today = new Date();
  today.setHours(0, 0, 0, 0); // 今日の日付を取得して時刻をリセット
  
  var yesterday = new Date(today);
  yesterday.setDate(yesterday.getDate() - 1); // 前日の日付を取得
  
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
  var newFiles = [];

  while (files.hasNext()) {
    var file = files.next();
    var dateCreated = file.getDateCreated();
    // 前日に追加されたファイルを抽出
    if (dateCreated >= yesterday && dateCreated < today) {
      newFiles.push(file);
    }
  }

  if (newFiles.length > 0) {
    var fileNames = newFiles.map(function(file) {
      return file.getName();
    }).join(", ");
    
    var message = "前日に追加されたファイル: " + fileNames;
    MailApp.sendEmail(recipients, '前日に追加されたファイルがあります', message);
  }
}

```

## 実行結果

無事に新規追加されたファイルを検知してメールを送ることが出来ました！

![スクリーンショット 2023-12-02 20.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e3871c04-9f52-311c-1df0-627939849a3e.png)

これを毎日定期実行するようにしたいのでトリガーに登録をしておきます。

![スクリーンショット 2023-12-02 20.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/9459b37e-0249-5c12-f8f5-2de542b7dfbd.png)

こうすることで毎日0時から1時の間に該当のスクリプトが実行され前日に新規で追加されたファイルを検知して自動で通知できるようになります。

# 最後に
今日はGASからGoogleドライブを操作する方法についてサンプルコードを添えて見ていきました。今日のサンプル以外にも例えば

- ファイルの自動バックアップとバージョン管理
    - 特定のフォルダ内のファイルを定期的にバックアップし、バージョン管理を行う。
- ファイルタグ付け
    - ファイルの内容や属性に基づいて自動的にタグを付けてスプレッドシートに記録する。
- 自動的なファイル分類と整理
    - ファイルの内容や種類に応じて自動的に分類し、整理する。例えば、画像ファイルを自動的に画像フォルダに移動するとか。
- ファイルへのアクセスログの自動収集
    - 特定のファイルに誰がアクセスしたかを記録し、アクセスログを自動的に収集する。
- OCRを使用した画像ファイルのテキスト変換
    - Googleドライブにアップロードされた画像ファイルのテキストを自動的に抽出し、検索可能なテキストファイルに変換し記録しておく。

なども実装することが可能です。いろいろ活用できそうですね！

明日はGASをつかってGoogleマップを操作する方法をみていきます。