フォルダ整理プログラムを作りたい!*”フォルダ名”含むファイルをそのフォルダに移動させるスクリプト/GAS

ちょっと前に、googleフォームの回答を
共有ドライブに移動させるプログラムを
どうにかこしらえたんですが、

次はその移動先でフォルダを自動で
整理できたらなあと思いました。

業務の関係上、移動先にはすでに
フォルダができているテイで
話は進んでいます。

タイトルの通りではあるんですが、
「フォルダ名」を含む”ファイル”を
その「フォルダ」にぶちこみたい、
っていうのがゴールです。

読みにくくて申し訳ないですが、
完成はこちらです↓

function personalFolder() {
  //親フォルダ取得
  const folderId='(フォルダのID)';
  const folder=DriveApp.getFolderById(folderId);

  //親フォルダ内の子フォルダ名取得
    const childFolder=folder.getFolders();
    while(childFolder.hasNext()){
      const namedFolder=childFolder.next();
      const name=namedFolder.getName();

  //親フォルダ内に子フォルダ名含むファイルあるか探してあったら移動
  const parentFolderId='(フォルダのID)';
  const parentFolder=DriveApp.getFolderById(parentFolderId);
  const files=parentFolder.getFiles();
   while(files.hasNext()){
    const file=files.next();
    if(file.getName().match(name)){
      const moveFile=file.moveTo(namedFolder);
    }else{}
  }
    }
}

やったこと

全部が入っているフォルダ(親フォルダ)取得

親フォルダ内にあるフォルダ(子フォルダ)名取得

親フォルダ内のファイルとファイル名を取得

ファイル名に子フォルダ名含むものがあるか探す

ファイルを該当子フォルダに移動

//親フォルダ取得

const folderId='(フォルダのID)';
const folder=DriveApp.getFolderById(folderId);

フォルダのIDは、フォルダを開いた
リンクの中の、folders/から先です。

...//drive.google.com/drive/u/0/folders/asdfGHjkLZXcvBnMqweRtyuIop

オレンジマーカーのところです
(値はダミーです)。

フォルダのIDのことを、
folderIdと呼ぶことにして、
DriveApp.getFolderById(folderId);で
IDでフォルダを取得、
取得したフォルダをfolderと呼ぶことにします。

//親フォルダ内の子フォルダ名取得

「next」を使ってファイルやフォルダを
取得するのですが、万が一なかった時エラーが
出てしまうとのことなので、
「has next」を使って存在確認をしなさいと
あちらこちらに口酸っぱく(?)
書かれていました。

存在するから取得するのになかったらエラー
だなんておかしなこと言うなあと
思ったんですが、
そもそもhas next使わなかったら
うまく動いてくれなかったので、
ちゃんと言うこと聞くことにします笑

一個前で取得した親フォルダの中にある
フォルダを取得したいので、
folder.getFolders();

条件つけるとかではないので、
引数(かっこの中)は空で。

(拾ったもの入れるところなのかなって
適当に私は理解しています。)

親フォルダの中で取得した子フォルダを
childFolderと呼ぶことにします。

そこから、ひとつずつ存在確認をするのを
繰り返す作業なので、繰り返しの「while」
使います。

while(childFolder.hasNext()){
const namedFolder=childFolder.next();
const name=namedFolder.getName();

繰り返しの中でないと名前取得できないので、
一個ずつ存在確認→名前取得
を子フォルダの数だけ繰り返しています。

同じく繰り返しに「for」がありますが、
こっちは繰り返す回数が決まってる場合、
whileは対象の数だけ繰り返す場合だそうです。

無限ループに陥らないように
気を付けて、とのことです。

childFolderの中で存在確認できたものを
namedFolderと呼び、その名前を
getNameで取得。

これで、親フォルダの中にある
子フォルダの名前はnameで
呼び出せるようになりました。

//親フォルダ内に子フォルダ名含むファイルあるか探してあったら移動

const parentFolderId='(フォルダのID)';
const parentFolder=DriveApp.getFolderById(parentFolderId);

最初に親フォルダ取得しているんですが、
while使ってブロック{}の中だと
取得したはずのフォルダ呼び出せなかったので
同じやつをもう一回取得しています...

調べた感じ、定数constではなく
変数varとか使えば一回で済みそうなんですが、
あちこちにvarは非推奨とか書かれていて
とりあえずconstで統一するかと思い
二回同じフォルダ取得しています。

const files=parentFolder.getFiles();
while(files.hasNext()){
const file=files.next();

上記と同じくwhileを使って
フォルダの中のファイルを取得しています。

if(file.getName().match(name)){
const moveFile=file.moveTo(namedFolder);
}else{}
}

matchは直後の( )内を含むものを
抽出してくれます。

もし(if)、file.getNameで取得したファイル名
の中に子フォルダ名(name)を含むなら、
moveTo(移動先フォルダ)で
該当フォルダに移動。

namedFolderは、一個前に取得した
子フォルダのことでした。

※elseは別になくても動くのと、
この後別に呼び出すことないので
moveFileの宣言はいらないかもです。


といった感じで、「実行」ボタン押したら
該当フォルダにファイルが
自動的に格納されるようにしてみました。

使う場面は、個人名のついたフォルダに、
同じく個人名のついたファイルを格納して
人別に情報を管理したいときです。

まあ、現状数少ないので、
別に手動で構わないんですがね( ̄▽ ̄)

しかも、フォルダを取得してその中の
フォルダとかファイルを探すのって
googleドライブ>新規(+)>AppsScript
からでないとできません。

それだと、フォーム送信時とか
スプレッドシート上でボタン押したときとか、
任意のタイミングで発動させる
”トリガー”をつけられず。

〇時間おきに...とかならできますが。

わざわざこのスクリプト画面開いて
実行押さないと動かないので、
あんまり便利ではないかも(笑)

初心者の勉強用なので、
別に良いのです。

皆さんも、なにかしらきっかけ見つけて
プログラムで遊んでみましょ^^

そうそうひとつ注意点なのが、match使う時は
文字の間にスペースとか入ってたら
同じ文字列判定されなかったこと。

苗字 名前

みたいに半角スペースとか
微妙に入ってたら、
エラー出ないのに動かなくて
1~2週間頭抱えてました( ̄▽ ̄)

ファイル名をプログラムであてがう段階で、
replace(/[\s\t\n]/g,"")
使って文字間のスペースは全駆除
するようにしました。

ということで、今回は以上です。
ではまた!

この記事の投稿者

入社半年の採用アシスタント兼広報担当。
学歴高卒/完全未経験で拾っていただき、日々勉強しながら&調べながら発信中。
とりあえずITパスポートは入社後3週間ちょいで取得済。
最近は開発部門のテスト作業も手伝わせてもらえることに。
趣味は絵(アナログ)とカラオケ(週1~)と自転車(眺める専)、九州の実家には拾った猫3匹&カメ1匹が鎮座。