前提として、同じ名前のフォルダは唯一であるとしています。
(理由は後述)
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にする程度)でできるので、参考程度にはなると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。