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

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

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

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2934閲覧

GoogleAppsscriptでGoogleドライブの多階層フォルダの一括作製について

ken21

総合スコア17

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/02/10 13:49

前提・実現したいこと

現在、GoogleAppsscriptを使って多階層のフォルダの一括作製を試みています。
具体的には以下のように1層目、2層目のデータがから図の右側のようにどこかのフォルダの配下または毎ドライブ配下に2層のフォルダを作成したいです。

イメージ説明

試したこと

Createfolderとfor文によって及びセル情報の取得を組み合わせて一層目をセルの値を取得して一括作成することは出来ました。
しかし、2層目になるとどのように作成したらいいかよくわからないのでご質問させていただきました。
私の案としては2層目はif文を使いA=Aだったら、A配下に1,2のフォルダを作成するというぐらいしか思いつきません。
何か他にいい案はありませんでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提として、同じ名前のフォルダは唯一であるとしています。
(理由は後述)

javascript

1/* 2準備 3 表示メニューから「マニフェスト ファイルを表示」にチェックをつけます。 4 appsscript.jsonに `"runtimeVersion":"V8"` を追加します。 5//```json: 例 6{ 7 "timeZone": "Asia/Tokyo", 8 "dependencies": { 9 }, 10 "exceptionLogging": "STACKDRIVER", 11 "runtimeVersion":"V8" 12} 13//``` 14* */ 15const q240620 = () => { 16 const sheetName = 'シート1'; 17 const myDrive = DriveApp.getRootFolder(); 18 let existing = new Map([...getFolders()].map(f=>[f.getName(),f])); 19 SpreadsheetApp.getActive().getSheetByName(sheetName).getDataRange().getValues().forEach(r=>{ 20 r.forEach((c,i,a)=> { 21 const parent = i === 0? myDrive:existing.get(a[i-1]); 22 let folder = existing.get(c); 23 if(folder === undefined) folder = parent.createFolder(c); 24 existing.set(c, folder); 25 parent.addFolder(folder); 26 } 27 ); 28 }); 29} 30function* getFolders() { 31 const folderIterator = DriveApp.getFolders(); 32 while(folderIterator.hasNext()) { 33 yield folderIterator.next(); 34 } 35}

理由:
ありていに言えば、ローカル PC での考え方を Cloud にもってくるのは要領が悪いです。

Google Drive の仕様として、同じ名前のフォルダを同じ場所に作れます(具体的には A フォルダに one フォルダが2つあっても良い)。
さらに、フォルダは複数の親に帰属することができます( A フォルダの中の one フォルダと B フォルダの中の one フォルダが同じ実体であってよい)。

内部実装を Google が公開するとは思えませんが、gas の DriveApp から扱ううえでは id ベースの key-value ストアで、双方向リスト(親→子の単方向かも)でフォルダ構造を持っているのだと理解するのが適切だと考えています。
この構造を gas から扱うことを考えると、ユニークキーでデータ構造をもたないと親子階層が多階層化したときに、計算効率が極端に悪化します。
逆に名前がユニークであると考えると、親子とか考えることなしに、その名前のフォルダがあれば作らないなければ作る、親を左セルに指定する、というごく単純な処理でまわせます。しかも API アクセスを減らせる。

質問者様は A/1 の 1 と B/1 の 1 はそれぞれ別のフォルダである、という前提に立っておられると思います。
が、マイドライブに A があったら A を作らないなければ作る、A の 下に 1 があったら作らないなければ作る、みたいなのを階層を重ねて実施する「賢い判定」は Google Drive ではまったく賢くないです(フォルダの数にもよりますが、無料の Google アカウントだと 5 分の実行制限にかかりやすくなります)。

一案として、セルに ”A/<id文字列>” のように、ファイル名や id に利用されない文字を区切文字として、id を書き込む、ということをすれば、やりたいことをスマートに実現できると思います。ただ、試した限りでは Google Drive のフォルダ名として、普通のフォルダには使えない ? とか \ とかが使えるように思えたため、そういう実装はしませんでした。利用者のお約束として絶対に使わない文字を決められるなら、やる価値はあると思います。この場合でも、原理的には、この回答を少しいじる(Mapのキーをidにする程度)でできるので、参考程度にはなると思います。

投稿2020/02/11 14:14

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問