質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

4825閲覧

Google Apps Scriptで2階層下にあるフォルダに対して指定した処理を複数回繰り返したい。

Koz1

総合スコア10

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2018/07/08 09:09

編集2018/07/09 10:43

解決したい内容

Google Apps Scriptで2階層下にあるフォルダに対して指定した処理を複数回繰り返したい。

Top_Folder
|--2nd_Folder01
| |--3rd_Folder01
| |--4th_Folder01
| |--4th_Folder02
|
|--2nd_Folder02
|
...

といったフォルダ構成になっています。そのほか、ファイル名を取得するためのフォルダ(Other_Folder)が別に用意されています。
このOther_Folderにあるファイル名の一部と3rd_Folderの中にある4th_Folder群のフォルダ名を一致させたいため、繰り返し文を作りたいです。

すみませんが、よろしくお願いいたします。

問題点

while(folders.hasnext())で繰り返しを行うと、一つのファイルだけで反復が終わってしまいます。Other_Folderの中のファイルは複数あるため、同じ処理を全ファイルに行いたいです。hasnext()だと、一度ファイルの読み込みが終わると次に行ってしまいます。

Google

1function sample_Function() { 2 var top_folder_id = 'Top_Folder_Id'; //一番上のフォルダID 3 var second_folders = DriveApp.getFolderById(top_folder_id).getFolders(); //下の階層フォルダ内のフォルダコレクション取得 4 var files = DriveApp.getFolderById('Other_Folder_Id').getFiles(); //ファイル名を取得したいフォルダ内のファイルコレクション取得 5 6 7 while(files.hasNext()) { 8 var file = files.next(); 9 10 while(second_folders.hasNext()) { 11 var second_folder = second_folders.next(); 12 var third_folders = second_folder.getFolders(); //さらに下の階層のフォルダコレクション取得 13 14 while(third_folders.hasNext()) { 15 var third_folder = third_folders.next(); 16 17 if(third_folder.getName().toUpperCase() == file.getName().slice(0,2).toUpperCase()){ 18 19 break; 20 } 21 22 } 23 24 } 25 26 } 27 28} 29

試したこと

フォルダの数が決まっているのでfor文でも試しましたが、うまくいきませんでした。hasnext()の状態を元に戻せるか、0やnullを代入してみましたが、エラーが出てしまいました^^;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2018/07/09 00:16

var files = DriveApp.getFolderById('FiLES_Id').getFiles();ここにあるFiLES_Idって、どのファイルIDを指定していますか?ここが問題のような気がします。
Koz1

2018/07/09 06:24

失礼しました。ファイルのIDではなく、フォルダのIDの記入ミスでした。'Other_Folder_Id'に訂正しました。
guest

回答3

0

自己解決

has.Next(),next()と配列を使って、まず欲しいファイル名を入れました。その後、for文にて実施することにしました。それ以下のフォルダも全部配列で入れた後に実施したい処理を行いました。

Google

1for(var i = 0; second_folders.hasNext(); i++) { 2 var second_folder = second_folders.next(); 3 array_2nd[i] = second_folder; 4 }

ありがとうございました。

投稿2018/07/10 07:31

Koz1

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

if文で、一致しているとbreakでループを抜けるようになっているので、1つめのファイル名が一致していたら終了になっているだけのようです。
どういう意図でbreakしているのかわからないですが、それをやめれば、全ファイルの探査は完了するかと思います。

投稿2018/07/10 00:08

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koz1

2018/07/10 07:26

回答ありがとうございます。規定ファイルが条件に一致したら、その後フォルダの検索の繰り返しを避けるためにbreakをしました。実は、外しても思い通りのような動きにはなっていませんでした。。ちょっと色々と考えて、自己解決致しました。 ありがとうございました。
guest

0

記載されたソースが正しいとすれば

js

1var third_folders = third_folder.getFolders(); //さらに下の階層のフォルダコレクション取得

ここは

js

1var third_folders = second_folder.getFolders(); //さらに下の階層のフォルダコレクション取得

じゃないといけないはず。

投稿2018/07/09 08:43

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koz1

2018/07/09 10:44

その通りです。直しました。 実際のソースでは、指摘の通りに記述していたのですが、説明用に書いたソースでごちゃごちゃになっていました。。失礼しました。。
macaron_xxx

2018/07/09 23:56

元のソースをコピペしてから、不要な部分を削除するようにしてください。 そうでないと、ちんぷんかんぷんな回答しかつきません。 他に間違いはないですよね? 再度確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問