2021年3月21日日曜日

Google PhotosとGoogle Driveのデータを他のアカウントに移行する方法

大学からもらったアカウントでGoogleフォトやGoogleドライブを運用していて、そのまま卒業して大事な青春時代のデータを失くす人がちらほらいるので、そうならないようにデータを移行する方法をまとめた。


Googleデータのエクスポート機能でパソコンのHDDにデータを保存するのが良い。その方法についてはhttps://support.google.com/accounts/answer/3024190?hl=jaに記載されているので参照するとよい。この際にデータをDriveに保存したりメールで受信する方法もあるが、アカウントが消えるとDriveにアクセスできなくなるし、メールも閲覧できなくなるので確実にパソコンにダウンロードしておくことをお勧めする。


Googleフォトのデータ移行

これについてはGoogleフォトのデータを別のアカウントに移行するを参照してください。


Google Apps ScriptによるGoogleドライブのデータ移行

Googleドライブにはデータ共有機能があるが共有しただけではオーナーアカウントが消えたときにデータがなくなってしまう。共有設定だけでなくオーナー変更も行う必要がある。

ファイル数が少ない場合は手動で行えばよいが、データが多いときに手動で実行するのは大変です。そこで登場するのがその手順を自動で実行してくれるGoogle Apps Script(GAS)です。
Google Apps Scriptを使ったことがない人はGoogle Apps Scriptの始め方はみてほしい。

当然すべてのケースを検証しているわけではないので保障はできないので、この方法でデータが紛失しても責任は負えません。事前にのGoogleデータのエクスポート機能でパソコンにダウンロードしておくことをお勧めします。

手順

  1. 移行元アカウントでGoogleドライブにログインしGoogle Apps Scriptを作成する。
    この時スクリプト名としてわかりやすい名前を付ける。
    後ほど紹介するスクリプトを張り付け、移行先のアカウントの指定部分だけ編集する。
  2. 移行元アカウントでGoogle Apps Scriptを実行する。
  3. 以降先アカウントに上記スクリプトも含めて移行されるが、マイドライブの下に紐づけられていないので、紐づけを行うためにもう一度スクリプトを実行する。
    手順1で作成したスクリプトも移行されているはずなので、再度同じスクリプトをそのまま実行する。スクリプトが見つからない場合は手順1でつけたわかりやすい名前で検索する。

スクリプトの紹介

  • 下で紹介しているスクリプトの"移行先アカウント@gmail.com""移行先アカウント確認用@gmail.com"を編集してください。
    • 移行先のアカウントを間違えるとほかの人にデータが移動してしまうので注意が必要です。
    • "移行先アカウント@gmail.com"と"移行先アカウント確認用@gmail.com"とで別の値を設定しています。
    • 実際に動かすときは同じ値にしてください。
  • 以降元アカウントで実行するときと、移行先アカウントで実行するときで処理を分けています。(日本語の気持ち悪い関数名にしています。)
    • 移行元アカウントで実行するときは、すべてのフォルダおよびファイルのオーナーを変更します。
    • 移行先アカウントで実行すると、移行されたデータをマイドライブに紐づけます。

function myFunction() {
  ////////////////////////////////////////////////
  // ここだけカスタマイズが必要(同じ値を設定する)
  var 移動先アカウント       = "移行先アカウント@gmail.com";
  var 移動先アカウント確認用 = "移行先アカウント確認用@gmail.com";
  ////////////////////////////////////////////////
  if( 移動先アカウント != 移動先アカウント確認用 )
  {
    return;
  }

  var スクリプト実行アカウント = Session.getActiveUser().getUserLoginId();

  if( 移動先アカウント == スクリプト実行アカウント ) {
    移行先アカウントで実行する処理();
  }
  else
  {
    移行元アカウントで実行する処理(スクリプト実行アカウント,移動先アカウント);
  }
}

function 移行元アカウントで実行する処理(predecessorId,successorId) {
  var folders = DriveApp.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    try {
      folder.addEditor( successorId );
      folder.setOwner( successorId );
//      folder.removeEditor( predecessorId );
    }
    catch(e) {
      Logger.log(e)
    }
  }
  
  var files = DriveApp.getFiles();
//  var scriptId = ScriptApp.getScriptId();
  while (files.hasNext()) {
    var file = files.next(); 
    try {
      file.addViewer( successorId );
      file.setOwner( successorId );
//      if( scriptId != file.getId())
//      {
//        file.removeEditor( predecessorId );
//      }
    }
    catch(e) {
      Logger.log(e)
    }
  }
}

function 移行先アカウントで実行する処理() {
  var root = DriveApp.getRootFolder();

  var folders = DriveApp.getFolders();
  while( folders.hasNext() )
  {
    var folder = folders.next();
    var parents = folder.getParents();
    if( parents.hasNext() == false){
      root.addFolder(folder);
    }
  }

  var files = DriveApp.getFiles();
  while( files.hasNext() )
  {
    var file = files.next();
    var parents = file.getParents();
    if( parents.hasNext() == false){
      root.addFile(file);
    }
  }

}

注意事項

  • ここで記載した方法で何かトラブルが発生しても責任は負えません。解決に向けて多少の協力は行えるかもしれません。
  • 2021/3/21時点で動作確認しています、Google側の仕様変更などで動作が変更される場合がありますのでご注意ください。
  • 本格的に検証していません、スクリプトの意味が分かる人が内容を理解したうえで実行してください。Drive ServiceのAPIリファレンスを参照にしてください。
  • 移行先アカウントの容量が足りないときにどのようになるか検証できていません。
  • Google Apps Scriptは一回に実行できる時間に制限があります。1回実行し途中までしか移行できていない場合、コメントアウトしている3箇所(合計6行)のコメントアウトを外したうえですべてのデータが移行できるまで繰り返し実行してください。
    • 移行完了したファイルやフォルダが移行元アカウントから見えなくなるのでスクリプトを実行するたびに移行未完了データを処理できるようになります。
    • スクリプトファイルが見えなくなると繰り返し実行できなくなるので除外するようにしています。
  • Googleデータのエクスポート機能で別の場所に保存してから実行することをお勧めします。