オーナー権限を変更するスクリプトもあったのですが、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; }