LoginSignup
1
1

More than 3 years have passed since last update.

Google Drive のフォルダの中身をコピーするスクリプト

Last updated at Posted at 2021-03-01

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)
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1