2015年1月17日土曜日

Google Apps Scriptのファイル/フォルダ操作(2)

同じパスのフォルダやファイルが複数存在可能な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 件のコメント:

コメントを投稿