2012年11月12日

Google Drive 上の文書をまとめて別アカウントへ移す方法

はてなブックマークに登録

Google Docs の文書はウェブブラウザから手軽に扱えるので何かと便利です。OS プラットフォームの違いを意識する必要がないため共同作業にも適していますね。
先日ちょっとした経緯から「アカウント A の Google Drive 上の Docs 文書・フォルダ群をまとめてアカウント B の環境へコピーするにはどうすればいいか?」というテーマに遭遇しました。次のみっつの条件つきです。

  • アカウント A の保持する既存のリソースの オーナーや共有設定の変更は不可
  • アカウント A の保持する既存のリソースに付与されている共有設定もコピーの対象とする
  • アカウント A とアカウント B のペアは複数存在する

今回はこの話題について考えた内容と、道具として作成したコードを紹介します。

案1:ダウンロード&アップロード?

実現方法のひとつとしてまず考えられるのは、「アカウント A の文書を一旦まとめてダウンロードしあらためてアカウント B 環境へアップロードする」という手順です。しかし、アップロード後に共有設定やフォルダ構成を再現する手間を度外視したとしても、残念ながらこの方法は採用できません。なぜなら、現時点では Docs 文書をダウンロードする際には必ず所定の形式に「変換」する必要があり、この変換によって元の文書の書式が崩れたり情報の一部が欠落する可能性があるためです。この問題はブラウザインターフェイスのみならず Google の提供する API を利用しても同じです。

    関連記事: Downloading a doc in native Google format - Google Groups

案2:リソースのコピーに共有を設定しそれを取り込めばいいかも?

そこで、冗長ではあるものの堅実と思われる次の手順を考えました。

1: アカウント A 側の操作

  1. Google Drive 上に、アカウント B を「共同編集者」とするフォルダ F/ を作成する
  2. 自分がオーナーの文書・サブフォルダを F/ 配下へ再帰的にコピー。この時コピー元リソースの共有設定をコピー先リソースへ反映しておく

2: アカウント B 側の操作

  1. Google Drive 上に作業用フォルダ X/ を作成する
  2. アカウント A から提供された共有フォルダ F/ 配下の文書・サブフォルダを X/ 配下へ再帰コピー (コピー先リソースのオーナーはアカウント A となる)。 あわせてコピー元リソースの共有設定をコピー先リソースへ反映する

一連の手順が終わった後でアカウント A の作った共有フォルダ F/ を削除すればコピー完了というわけです。これなら大丈夫でしょう。

手作業ではつらいので

ただ、今のところ Google Drive のブラウザインターフェイスにはフォルダをコピーする機能はありません。また、ブラウザ上の操作でコピーした文書に元の文書の共有設定は反映されません。そのため上述の「案2」を手作業でやるのは結構大変そうです。
それでもアカウント A とアカウント B のペアがひと組だけなら一度きりのことと割り切って我慢することもできなくはないでしょう。しかし、今回の話題にはこのペアが複数存在するという前提があります。そのためさすがに手作業での対応は大変なので、プログラムで自動化することにしました。

Windows アプリ版「GDMigrate」

まず作ってみたのは Google Drive & Google Docs 両サービスのクライアントとして動作する Windows 用のツールです。以前作成した「MyCloudFile」というアプリで Google Documents List API に触れていたため手早くこの API セットを使って実装し、ツールに「GDMigrate」と名前をつけました。GDMigrate の処理内容を図に示します。

※クリックすると大きな図が開きます

この Windows 版 GDMigrate はひとまず期待通りに動作したのですが、次のふたつの点がひっかかっていました。

  • 今回の話題でのアカウント A および B の該当者は Windows ユーザばかりではない
  • ツールは本質的には Google 側の API を順次直線的に叩いているのみであり、何らかの方法で Google サーバ側で処理を実行できればクライアント−サーバ型で処理を行う必然性はない

Google Apps Script 版「GDMigrate」

そこで、ウェブブラウザ上で開発・起動ができ、サーバサイドで動作する Google Apps Script (以下 GAS)に関心を持ちました。勉強をかねて試作した GAS 版の GDMigrate を公開します。使い方は以下の通りです。

※実行にはふたつの Google アカウントを使用します
※GAS の DocsList Services リファレンス を併読すればスクリプトの処理を追い易いでしょう

手順1:アカウント A での操作
アカウント A の Google Drive 上にある既存のリソース群の共有用コピーを作成する

  1. アカウント A でウェブブラウザから Google Drive を開く
  2. 新しいスプレッドシートを適当な名前で作成し、同シートの「ツール」メニューから「スクリプトエディタ」を選択
  3. スクリプトエディタが開く 〜 初回に展開するパネル上の「空のプロジェクト」をクリック
  4. エディタ上に GDMigrate スクリプト をコピペ 〜 コードを保存 〜 関数選択ボックスから「main」を選択
  5. 初回実行時には実行承認が求められる
  6. 承認後にあらためて実行ボタンを押下 〜 元のスプレッドシートの画面に戻ると以下のダイアログが展開している
  7. ダイアログの「はい」ボタンを押下 〜 展開する「アカウントの指定」ダイアログでリソース移管の対象とするアカウント B のメールアドレスを入力し「OK」を押下
  8. 既存リソースのコピーが始まりシート上にログが出力される 〜 終了を待つ
  9. 終了後にアカウント A の Google Drive を覗いてみると、マイドライブ直下に「GDMIGRATE_SHARED_FOLDER」というフォルダが作成されその配下に既存のリソースが丸ごとコピーされていることがわかる。同フォルダの共有設定には上記 7. で指定したアカウント B が共同編集者として登録されている

手順1:アカウント B での操作
上記の「手順1」によってアカウント A から提供された共有リソース群をまとめてアカウント B の Google Drive 領域へ取り込む

  1. アカウント B でウェブブラウザから Google Drive を開く
  2. 上記「手順1」の 2.〜 6. の操作を行い、図のダイアログで「いいえ」を押下
  3. アカウント A の提供した共有リソースの取り込みが始まりシート上にログが出力される 〜 終了を待つ
  4. 終了後にアカウント B の Google Drive を覗いてみると、マイドライブ直下にユニーク名のフォルダが作成されその配下にアカウント A の提供した共有リソースが丸ごと取り込まれていることがわかる
  5. 必要に応じてユニーク名フォルダ下に格納されたリソースを移動

以上でアカウント A からアカウント B へのリソース移管は終わりです。最後にアカウント A の Google Drive から「GDMIGRATE_SHARED_FOLDER」フォルダを削除すれば完了です。


以下に、アカウント A の一件の元文書での共有設定内容の例と、一連の操作を経てアカウント B 側で取り込みを終えた同文書の共有設定の状態を示します。オーナーがアカウント A からアカウント B に変わり、その他の共有設定は維持されています。


(tanabe)
klab_gijutsu2 at 10:07│Comments(0)TrackBack(0)cloud | win

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント
最新トラックバック
Archives