LoginSignup
6
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-30

やるきっかけ

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

今回のゴール

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

イメージ↓
スクリーンショット 2019-11-03 23.58.23.png

名前列挙

とりあえず作業用スプレッドシートを作成して、
A列に名前をガンガン入れていきます
スクリーンショット 2019-11-02 23.38.54.png

作るゾ☆

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

test.gs
function readSheet() {
  var sheet = SpreadsheetApp.openByUrl("URL");
  var range = sheet.getDataRange(); 
  var values = range.getValues();

  Logger.log(values);
}

さあ実行だ!

スクリーンショット 2019-11-03 1.32.52.png

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

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

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]);
  });
}

これどこにフォルダー作られるんだろうな??と思いつつ実行。

お、できたかな??
どれどれ
スクリーンショット 2019-11-03 23.35.07.png

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

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

スクリーンショット 2019-11-03 23.37.02.png

あーね。

調べてみると、フォルダIDなるものを使ってフォルダを特定してやればいけそうです
※フォルダIDは↓の黒く塗りつぶしてる部分
スクリーンショット 2019-11-03 23.45.15.png

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]);
  });
}

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

スクリーンショット 2019-11-03 23.51.21.png

わーい!できたー

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

var files = DriveApp.getFiles();
while (files.hasNext()) {
  var file = files.next();
  Logger.log(file.getName());
}

リファレンスにこれで行けるで!って書いてあるけど、
hasNext()やらnext()とはって感じなのでもうちょいリファレンス読みます。

スクリーンショット 2019-11-26 0.12.33.png

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

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

とりあえず2つくらいファイル作成。
スクリーンショット 2019-11-26 0.49.50.png

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());
  }
}

スクリーンショット 2019-11-26 0.50.11.png

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

スクリーンショット 2019-11-26 1.10.08.png

お〜きたきた。

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

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("入ってるで!");
    }
  }
}

スクリーンショット 2019-11-27 22.16.08.png

いけたわ。

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

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0