オーナー権限を変更するスクリプトもあったのですが、G Suite(Google Workspace)の制約で組織外のユーザーに権限移行ができないため、今回はフォルダ階層を維持したままコピーするスクリプトを作成しましたり
アカウントを廃止するなどの目的でGoogleDriveで共有されたフォルダを自分のアカウントにコピーするスクリプトです。ご利用は自己責任で、、、
var me;
function CopyFolders() {
var url = "https://drive.google.com/drive/folders/6dpqdZ1ESK<< ここはコピー元のフォルダURL >>yPoQBdhwEOP";
var idAndResoucekey = url.replace(/.*\//g,"").split("?");
var id = idAndResoucekey[0];
var resoucekey = null;
me = Session.getActiveUser();
if( idAndResoucekey.length == 2 )
{
resoucekey = idAndResoucekey[1].replace(/.*=/,"");
}
var srcFolder = DriveApp.getFolderByIdAndResourceKey(id,resoucekey);
var dstFolder = getFolder( null, '共有フォルダからのコピー', false );
CopyFolder( srcFolder, dstFolder );
}
function CopyFolder(src,dst){
var folders = src.getFolders();
var files = src.getFiles();
while( folders.hasNext() )
{
var folder = folders.next();
CopyFolder( folder, getFolder( dst, folder.getName() ) );
if( src.getFiles().hasNext() )
{
Logger.log("削除できないファイルが残ってる?");
}else{
folder.removeEditor(me);
}
}
while( files.hasNext() )
{
var file = files.next();
try
{
file.makeCopy(file.getName(),dst);
file.removeEditor(me);
}
catch(e)
{
Logger.log(file.getName()+" 削除失敗");
}
}
}
/**
* 指定されたフォルダ取得する、フォルダがないときは新規に作成する。
*
* @param {Folder} parent 基準フォルダ、null指定時はルートフォルダ
* @param {string|Array of strings} name 取得・生成するフォルダ名
* string 指定時はnameを取得。生成する
* Array of strings 指定時は多階層フォルダを一括作成
* @param {bool} noCreate 作成は行わず既存のフォルダを取得するときにtrue
* 省略可能、省略時はfalseとして動作
* @return {Folder|undefined} 取得・生成したフォルダ
*/
function getFolder( parent, name, noCreate ) {
// 親フォルダが指定されなかった場合はルートフォルダを取得する。
if ( parent == null ){
var folder = DriveApp.getRootFolder();
}else{
var folder = parent;
}
// フォルダ名に配列が指定されていない場合は配列にする。
if( !Array.isArray( name ) ){
name = [name];
}
// noCreateが指定されていない場合はfalseにする。
if ( noCreate !== true ){
noCreate = false;
}
while( name.length > 0 ){
var newFolder = name.shift();
var childs = folder.getFoldersByName( newFolder );
if( childs.hasNext() ){
// フォルダが見つかった場合は最初のフォルダを採用
folder = childs.next();
} else {
if( noCreate ){
// noCreateの場合はnullを返す
return undefined;
}else{
// フォルダが見つからなかった場合はフォルダを作成
folder = folder.createFolder( newFolder );
}
}
}
return folder;
}