【GAS】フォルダ内ファイル一覧をスプレッドシートに作成＋GAS実行時の日付も残す方法

## はじめに
業務で社内・社外のマニュアルをパワーポイントで作成し、<br>Google Driveで保存・共有をしています。
マニュアルの管理がなされておらず、<br>最新版がどれなのか、一目ではわからない状態でした。<br>
そのため、マニュアル内の、商標や問い合わせ先を修正した際、<br>いつ時点のファイルには更新されているのか、<br>一つ一つファイルを開けるのが大変でした。

なので今回、GASで指定のフォルダ内のファイル名、URL、最終更新日を取得して、<br>以下を達成しようと試みました。
1. 最終更新日を取得することで修正対象のファイルを把握
2. 修正対応後、再度GASを実行→最終更新日の再取得で「対応済みかどうか」の確認

## 今回工夫したポイント
・ファイルの最終更新日時の取得
・GASを実行した日時を残す
・ファイル一覧を最新状態にしたいので、前に作成した一覧は一度クリアにする
（前回GAS実行時より、ファイル数が減っていると、古いファイル一覧が一部残ってしまうため）

## コードの流れ~ファイル一覧の取得準備~
1.日付を取得する

```javascript

//現在の日付を取得する
  var date = new Date(); 
  var dateStr = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm:ss');

```
:::note info
日付だけではなく、時間も記録したいため`'yyyy-MM-dd HH:mm:ss'`で、日付の表示形式を変更しました
:::

***
2.ファイル一覧を作成したいスプレッドシートを取得する
3.シート内の値をクリアにする
4.取得対象のフォルダをIDを変数に入れる
```javascript

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート名');
  sheet.clearContents();
  const folderId = 'フォルダID';

```

:::note info
フォルダIDはURLから確認できます。
`'https://drive.google.com/drive/u/1/folders/{フォルダID}'`
:::

***

4.ファイル一覧データを格納する`'list(array)`'を用意する
5.書き出す`'row'`,`'colum'`を指定しておいてあげる

```javascript
  // ファイル一覧データを入れるリストを用意（後ほど、ここにデータを格納します）
  var list = [];

  // スタートのrowとcolumを指定する
  var rowIndex = 1;
  var colIndex = 1;

```

## コードの流れ~ファイル一覧を取得して、スプレッドシートに貼り付ける~

6.ファイル名、ファイルURL、最終更新日を取得する
7.予め用意してあった`'list(array)'`に格納してあげる
```javascript
  // フォルダIDを指定して、ファイル（複数）を取得する 
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();

  while(files.hasNext()){
    var buff = files.next();
    var fileName = buff.getName();
    var fileUrl = buff.getUrl();
    var lastUpdateDate = Utilities.formatDate(buff.getLastUpdated(),'JST', 'yyyy-MM-dd HH:mm:ss');

  // 取得したfileName,file,lastUpdateDateを追加する 
    list.push([fileName,fileUrl,lastUpdateDate]);
  }
```
***

8.格納したarrayを登録した順にするため、順序を逆にする
9.格納したarrayをスプレッドシートに貼り付ける(手順５で指定していたrow,columを使用)
```javascript
  // listの順序を並び替える
  list.reverse();

  // 一覧を貼り付けたい場所を取得する
  var ranges = sheet.getRange(rowIndex, colIndex, list.length, list[0].length);

  // 取得した場所に、一覧を貼り付ける
  ranges.setValues(list);

```

***
10.貼り付けたリストの一番下のrangeを取得して、日付を貼り付ける
```javascript
  // A列の値を取得
  var aValues = sheet.getRange('A:A').getValues();

  // A列で値がはいっているrowを取得する
  var lastRow = aValues.filter(String).length;

  // 日付を入れたい箇所＝lastRowにプラス１をする
  var dateRow = lastRow + 1;
  var rangeDate = sheet.getRange(dateRow,1);

  // 手順１で設定した日付を貼り付ける
  rangeDate.setValue(dateStr);

```

## GAS実行後のスプレッドシート
A列にファイル名、B列にファイルURL、C列に最終更新日が取得できました。

![list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614869/b922fb3c-c387-d2a2-670f-d06119ee92a1.png)

## まとめと今後の課題
・よかった点
これまで、値を取得して、スプレッドシートに貼り付ける際、一つ一つループを回す→一つ一つ貼り付けるといったコードを書いていましたが、ファイル名等の取得する際に、一度リストにしてしまってから貼り付ける方法を知り、書くコードが一部短くすることができました。
他にも、最終更新日を確認でき、修正が必要なファイルを確認することができました。

・今後の課題
ただ、複数フォルダに複数ファイルが散在するので１フォルダにまとめないと、このGASは実行できない難点もあるなと感じました。複数フォルダ間の操作も、今後トライしてみたいと思います。

加えて、トリガーの設定（ファイル編集時か起動時、または時限式か？など）も検討していきたいです。

## 今回参考にさせていただいた記事
▼Google Drive上の指定のフォルダ以下のファイル一覧をSpreadSheetに書き出す
https://qiita.com/akiko-pusu/items/43c89dcfeb1d544cce38

▼【コピペで使える】GASでフォルダ/ファイルの最終更新日時を取得してみる
https://for-dummies.net/gas-noobs/how-to-get-updated-date-of-folders-and-files-on-google-drive/#1