人の手でデータ管理とか「は？」って感じだからGASでドライブをゴニョゴニョする話

#やるきっかけ
社内で資料格納されているか手作業で確認してたので、技術で殴って解決しようと思います。

#今回のゴール
スプシのA列にフォルダ名を列挙します。
そのフォルダ名を元にフォルダを作成します。
特定のフォルダの中に特定の拡張子のファイルを入れたら、スプシのB列に「入ってるで！」と更新してもらいましょう。

イメージ↓
<img width="594" alt="スクリーンショット 2019-11-03 23.58.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/bce0c03c-1aca-2fc8-158e-265822d1b8b4.png">


#名前列挙
とりあえず作業用スプレッドシートを作成して、
A列に名前をガンガン入れていきます
<img width="691" alt="スクリーンショット 2019-11-02 23.38.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/23014dc3-900a-a735-2e6d-e6b9c0f62430.png">

#作るゾ☆
それではまず、スプシから文字を取得しましょう。
URLを使えば読み込めるらしいです。
getDataRangeは値がある範囲のみ読み込む仕様になってるみたいなんで、今回は範囲指定しません。

```JS:test.gs
function readSheet() {
  var sheet = SpreadsheetApp.openByUrl("URL");
  var range = sheet.getDataRange(); 
  var values = range.getValues();
  
  Logger.log(values);
}
```
さあ実行だ！

<img width="896" alt="スクリーンショット 2019-11-03 1.32.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/44936a7e-6935-804f-7e2e-28bbf8a54b62.png">


おぉ、取得できてますね。

じゃあ次はこの名前の順番にフォルダを作っていきましょう
`createFolder(name) `を使えばいけるらしいです

```JS:test.gs
function readSheet() {
  var sheet = SpreadsheetApp.openByUrl("URL");
  var range = sheet.getDataRange(); 
  var values = range.getValues();
  
  values.forEach(function(folderName) {
    DriveApp.createFolder(folderName[0]);
  });
}
```
これどこにフォルダー作られるんだろうな？？と思いつつ実行。

お、できたかな？？
どれどれ
<img width="1314" alt="スクリーンショット 2019-11-03 23.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/77e09d9c-f99f-9ca4-f146-efb3db3ee14f.png">

HAHAHA !
どこにもできてないじゃないか！！
どこに行ったんだ！！

と、思ったらマイドライブの直下にできていました。

<img width="1324" alt="スクリーンショット 2019-11-03 23.37.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/29652612-546c-a460-b6c7-d65a6816ecb2.png">

あーね。

調べてみると、フォルダIDなるものを使ってフォルダを特定してやればいけそうです
※フォルダIDは↓の黒く塗りつぶしてる部分
<img width="530" alt="スクリーンショット 2019-11-03 23.45.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/7e280875-dc55-16f7-e012-6b29b5f1b686.png">


```JS:test.gs
function readSheet() {
  var folder  = DriveApp.getFolderById("フォルダID");
  var sheet = SpreadsheetApp.openByUrl("URL");
  var range = sheet.getDataRange(); 
  var values = range.getValues();
  
  values.forEach(function(folderName) {
    folder.createFolder(folderName[0]);
  });
}
```

さあさあ、これでできるじゃろ！

<img width="1347" alt="スクリーンショット 2019-11-03 23.51.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/3e602c40-df4b-6047-2d73-b9dd33f0602d.png">

わーい！できたー

それでは、とりあえず「hogeフォルダ」の中に何かファイルが入っているか入っていないかの判定を作ってみましょう。

```JS
var files = DriveApp.getFiles();
while (files.hasNext()) {
  var file = files.next();
  Logger.log(file.getName());
}
```
リファレンスにこれで行けるで！って書いてあるけど、
`hasNext()`やら`next()`とはって感じなのでもうちょいリファレンス読みます。

<img width="866" alt="スクリーンショット 2019-11-26 0.12.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/b2b5a774-d047-bea6-cd4f-d571bcabda67.png">

まず`next()`は、ファイル内のアイテムを返してくれるやるで、
`hasNext()`はそもそも`next()`がアイテム返してくれんの？？って判断してくれるやつだそうです。
もうちょい詳しくみると、`next()`はアイテムが残ってない場合、exceptionが発生するとかしないとか(英語不自由)

ま、動作見てみれば分かるよね！！

とりあえず２つくらいファイル作成。
<img width="643" alt="スクリーンショット 2019-11-26 0.49.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/2391a21e-eeaf-7622-90e6-5c5498d22224.png">


```JS:test.gs
function readFileName(){
  var folder = DriveApp.getFolderById("とりあえずhogeのID直に入れた");
  var files = folder.getFiles();
  
  while (files.hasNext()) {
    var file = files.next();
    Logger.log(file.getName());
  }
}
```

<img width="778" alt="スクリーンショット 2019-11-26 0.50.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/76db0ca1-72ab-b7e9-3c6d-662dcff00bef.png">

ただ今回欲しいのはファイル名ではなく、ファイルの種類
`getMimeType()`これを使えば種類が判別できるらしい。

<img width="751" alt="スクリーンショット 2019-11-26 1.10.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/deca4eb5-abbd-1456-bcbf-17d131a6e626.png">

お〜きたきた。

今回はドキュメントは入った場合のみB列に「入ったで」と入れるようにしましょう。
まずスプシにGASから文字を書く方法を調べます。
`setValue`なるものでいけるそうです。
とりあえず直値入れて、コード綺麗にするのも後回しにしてやってみますね

```JS:test.gs
function readFileType(){
  var folder = DriveApp.getFolderById("ID");
  var files = folder.getFiles();
  var sheet = SpreadsheetApp.openByUrl("URL");
  
  while (files.hasNext()) {
    var file = files.next();
    Logger.log(file.getMimeType());
    
    if(file.getMimeType().indexOf('spreadsheet') != -1){
      sheet.getRange("B1").setValue("入ってるで！");
    }
  }
}
```
<img width="465" alt="スクリーンショット 2019-11-27 22.16.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191497/6323f91b-edf5-d735-ad6d-66ed3c3daddf.png">

いけたわ。

ふむ。
まぁあとは全部つなげるだけなので
それはまた次回にでも書きますかね。