概要
Google Docs(Document, Spreadsheet, Slide)を手動やGoogle Apps Script、APIなどを使ってコピー(複製の作成)すると、Docs本体やバウンドスクリプトはコピーされるのですが、Docs内に書かれたコメントやコメントへの返事はコピーされません。コメントやコメントへの返事を全部削除したい場合はこの仕様で問題ないのですが、それらを一緒にコピーしたいと思った時、少し悩まされましたので、解決方法も含めてこの記事でGoogle Docs内に書かれたコメント、コメントへの返事をコピーする方法について紹介させていただきます。
試したこと
- Google Docsをweb interfaceを使って手動でコピー、Drive apiのdrive.files.copyやDriveAppのmakecopyでコピー
- コメント自体が失われる。
- 使用: ✖
- Google DocsをMicrosoft Docs(Word, Excel, Powerpoint)へ変換して、それを再びGoogle Docsへ変換
- コメント並びに返事は残るが、アンカーがおかしくなるため、コメントの場所情報が失われる。
- 使用: ✖
- Drive APIのDrive.Commentsを使ってコピー
- コメント、返事、場所ともにコピー可能
- 使用: 〇
- Drive.Comments.listでコメントと返事を取得し、Drive.Comments.insertでコメントをコピーしてDrive.Replies.insertでコピーしたコメントに対して返事をコピー(専用のAPIがあるので素直にそれを使いましょうということですね。)
DriveAppではコメントを取得したりインサートするメソッドが今のところ見当たらないため、Drive APIのDrive.Commentsを使用しました。Drive APIを使用しますので、スクリプトを変更することで外部からの操作も可能です。
サンプルスクリプト
スクリプトの実行前にすること
このサンプルを使用する際は、Googleの拡張サービスとAPIコンソールでDrive APIを有効にしてください。
-
- スクリプトエディタから リソース -> Googleの拡張サービス を開き、Drive APIを有効にしてください。バージョンは今のところv2のみを選択することができます。
-
APIコンソール
- スクリプトエディタから リソース -> Cloud Platform プロジェクト を開き、右下の 「APIコンソールを表示」 をクリックします。
- スタートガイドの中にある「APIを有効化し、鍵などの認証情報を取得」をクリックします。
- 「有効な API またはサービスがありません」と表示されている場合は、その下にある「Google Drive API」をクリックして「有効にする」ボタンを押して有効にします。
- 「有効な API またはサービスがありません」と表示されていない場合は、左側の「ライブラリ」を開いて「APIとサービスを検索」のテキストボックスへ「Drive API」と入力して検索し、「Google Drive API」をクリックして「有効にする」ボタンを押して有効にします。
これで準備は完了です。
サンプルスクリプト
このサンプルスクリプトはGoogle Apps Script用です。スクリプトエディタへコピー&ペーストしてお使いください。コピー元となるコメントやコメントへの返事が書かれているGoogle DocsのファイルIDをsrc
としたサンプルスクリプトは下記の通りです。
var src = "#####"; // コメントのコピー元になるGoogle DocsのファイルID. この部分は入力してください。
var dst = DriveApp.getFileById(id).makeCopy().getId(); // コメントのコピー先になるGoogle DocsのファイルID
var commentList = Drive.Comments.list(src);
commentList.items.forEach(function(item) {
var replies = item.replies;
delete item.replies; // item.repliesを削除しないとエラーになる。
var commentId = Drive.Comments.insert(item, dst).commentId;
replies.forEach(function(reply) {
Drive.Replies.insert(reply, documentId, dst);
});
});
スクリプトの流れとポイント
スクリプトの流れは次の通りです。
- コピー元のファイルをコピー
- コピー元のファイルからコメントと返事を取得
- コピーしたファイルへコメントと返事をコピー
コメントと返事をコピーする際のポイントは次の通りです。
- コメントをコピーする際はDrive.Comments.insertを使って新規で作成します。コンテンツやアンカー情報はDrive.Comments.listで取得したオブジェクトに含まれていますのでそのまま使用します。このとき、コピーするオブジェクトに返事のオブジェクトを含めているとエラーになってしまいます。
- コメントへの返事をコピーする際は、insertしたコメントからコメントIDを取得してDrive.Replies.insertを使ってコピーします。
制限
このスクリプトの制限としては、コメントや返事が書かれた日付はインサート時のリクエストボディや後からのアップデートを使っても変更できなかったため、残念ながら日付情報についてはコピーはできません。これはDrive API v3で試してもできませんでした。コンテンツは変更できますが、日付の変更ができませんでした。何か他の方法が見つかった際はこの記事を更新したいと思います。