同じパスのフォルダやファイルが複数存在可能なGoogleDriveで階層が深いフォルダを一発で指定したり、階層が深いフォルダを一回で作成するための関数を検討してみた。簡単な動作確認では思ったとおりに動作しているようだ。まったくオブジェクト志向ではないコードになってしまいました。
/**
* フォルダパスを指定してフォルダを生成する。
*
* @param {String} path フォルダパス
* @param {Folder} base ベースフォルダ(省略時はルート)
* @return {Folder} 生成したフォルダ。失敗時はnull。
*/
function createFolder(path,base)
{
if(typeof base === 'undefined'){
base = DriveApp.getRootFolder();
}
var splitpath = path.split("/");
if( splitpath[0] == "" ){
splitpath.splice(0,1);
}
if( splitpath[0] == "" ){
base = DriveApp.getRootFolder();
splitpath.splice(0,1);
}
var parent= new Array();
var child=new Array();
parent[0] = base;
for( var level=0; level < splitpath.length && splitpath[level]!=""; level++ ){
for( var i = 0; i<parent.length ; i++ ){
var folders = parent[i].getFoldersByName(splitpath[level]);
while( folders.hasNext() ){
child.push( folders.next() );
}
}
if( child.length == 0 ){
child[0] = parent[0].createFolder( splitpath[level] );
}
parent = [];
parent = [].concat(child);
child=[];
}
return parent[0];
}
/**
* フォルダパスを指定してフォルダを取得する。
*
* @param {String} path フォルダパス
* @param {Folder} base ベースフォルダ(省略時はルート)
* @return {Folder} ファイルパスを指定してファイルを取得する。失敗時はnull。
*/
function getFoldersByPathName(path,base)
{
if(typeof base === 'undefined'){
base = DriveApp.getRootFolder();
}
var splitpath = path.split("/");
if( splitpath[0] == "" ){
splitpath.splice(0,1);
}
if( splitpath[0] == "" ){
base = DriveApp.getRootFolder();
splitpath.splice(0,1);
}
var parent= new Array();
var child=new Array();
parent[0] = base;
for( var level=0; level < splitpath.length && splitpath[level]!=""; level++ ){
for( var i = 0; i<parent.length; i++ ){
var folders = parent[i].getFoldersByName(splitpath[level]);
while( folders.hasNext() ){
child.push( folders.next() );
}
}
if( child.length != 0 ){
parent = [];
parent = [].concat(child);
child=[];
}else{
return null;
}
}
return parent;
}
0 件のコメント:
コメントを投稿
質問、要望、指摘など書いていただいてもよいですが、対応できるとは限りませんのでご了承ください。私に対するものも含め他の人を嫌な気分になるようなコメントは避けてください。