Google Drive は非常に便利ですが、 フォルダごとコピーすることができません。
ほかにも、 GSUITE のアカウントのドライブに、 別の Google/GSUITE アカウント で管理しているファイル・フォルダを移すことができません。
解決方法
フォルダのコピーはコードを書けばできます。
別のドメインの Google account にファイルを移すことはできませんが、 アクセス権さえあればコピーできます。
フォルダごとコピーできるウェブサイトがありますが、 GSUITE の設定次第では、実行できない場合があります。
そこで、フォルダの中身をコピーするスクリプトを書きました。
プログラム
function myFunction() {
// put source folder ID.
const fromFolder = DriveApp.getFolderById('1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ')
// put destination folder ID.
const toFolder = DriveApp.getFolderById('1234567abcdefghijklmnopqrstuvwxyz')
// copy the folder content recursively.
copy(fromFolder, toFolder)
}
function copy(fromFolder, toFolder) {
// copy files
var files = fromFolder.getFiles()
while (files.hasNext()) {
var file = files.next();
var newFile = file.makeCopy(toFolder)
newFile.setName(file.getName())
}
// copy folders
var folders = fromFolder.getFolders()
while (folders.hasNext()) {
var folder = folders.next()
var newFolder = toFolder.createFolder(folder.getName())
copy(folder, newFolder)
}
}
解説
これは フォルダのコンテンツのみをコピーするものです。
A
というフォルダを複製するものではなく、 A/*
に該当するファイル・フォルダを宛先フォルダにコピーします。
getFolderById
の引数に、フォルダを表すIDを入れて実行すると中のファイル・フォルダが宛先のフォルダにコピーされます。
フォルダのIDとは、フォルダをブラウザで開いた時に表示される URL (例: https://drive.google.com/drive/u/0/folders/1bA93FHfmrji2948j24nga24tg5H
) の最後の部分です。
コピーの処理自体は関数 copy
で行っています。 ファイルをそれぞれコピーし、 フォルダをそれぞれコピーし、 フォルダについてはその中身についてコピーするため再起的に copy
を呼び出しています。
ファイルのコピーについては makeCopy
関数 でコピーするだけでは、 コピー元と違ったファイルになってしまいます。 日本語だと "{original name} のコピー", 英語だと "Copy of {original name}" のように、 コピーされたことを表す文字が付加されてしまいます。 そこで、 makeCopy
を実行した後で改めて setName
を使って名前を再設定しています。
さらに追加できるもの
コピーのログを SpreadSheet に出す、 コピー後にオーナーが自分になっているファイルは消す、 インターフェース(Webページ) を作るなど、 コードを変更することで追加できます。
(私の場合は必要なかったので追加しませんでしたが。)
その他
フォルダごとコピーしたい場合は myFunction
を次のように書き換えます。
function myFunction() {
// put source folder ID.
const fromFolder = DriveApp.getFolderById('1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ')
// put destination folder ID.
const toFolder = DriveApp.getFolderById('1234567abcdefghijklmnopqrstuvwxyz')
// create new folder
var newFolder = toFolder.createFolder(folder.getName())
// copy the folder content recursively.
copy(fromFolder, newFolder)
}