有馬総一郎のブログ

(彼氏の事情)

2026年01月26日 08:19:35 JST - 5 minute read - Google

rcloneでGoogleドライブ間のコピー・同期をする。MSオフィスからGoogle形式への変換やエラー回避策

rcloneを使ってリモート間のコピーを行う。つまり、GoogleユーザーAからGoogleユーザーBにファイル、フォルダをコピーする。

rcloneを使ってOAuth認証でGoogle Driveを自動マウントするなどを参考にリモート設定を二つ作成しておく。

$ rclone config                                                           
Current remotes:

Name                 Type
====                 ====
GoogleDrive          drive
NewUser              drive

リモート間コピー

rcloneは、指定したコピー元ディレクトリの中身を、コピー先ディレクトリの直下にコピーするので、コピー元と先は同じディレクトリとする。この時、コピー先にOfficeがなくても、Officeが作成された上で、その直下にSourceディレクトリは作成されず、中身だけがコピーされる。

$ rclone copy "GoogleDrive:Source" "NewUser:Office" \
  --progress \
  --log-file="/home/arimasou16/remote_copy.log" \
  --log-level INFO \
  --drive-import-formats docx,xlsx,pptx

これでリモート間同士のコピーが行われる。しかし、最初--drive-import-formats docx,xlsx,pptxというオプション1を知らず(付けず)、実行してしまったので、Googleオフィスファイル2は、そのままコピーされると期待したが、Microsoftオフィスファイル3になってコピーされてしまった。

--drive-import-formats docx,xlsx,pptxというオプション1を使えば、仮にコピー元がMicrosoftオフィスファイルだったとしても、Googleオフィスファイルとしてコピーしてくれる。当然ながら、これはファイルの中身が変わってしまう、損失してしまう危険があるので注意。

コピー、同期は行う場合は、どちらも--dry-runオプションを付けてコピー、同期内容を確認することお勧めする。

MicrosoftオフィスからGoogleオフィス変換

Microsoftオフィスとしてコピーしてしまった。なので、Google Apps ScriptでのGoogleオフィスに変換して、変換元ファイルはゴミ箱行きにするスクリプトを載せておく。

このスクリプトを実行するには、Google Apps Scriptのエディタの左側にある サービス から Drive API を追加する必要がある。 Drive API を追加した上でコードstartConversionを実行する必要がある。

Google Apps Script
Google Apps Script

function startConversion() {
  // ==========================================
  // 【設定】ここに対象の「親フォルダ」のIDを入力してください
  const ROOT_FOLDER_ID = '親フォルダのID';
  // ==========================================

  const rootFolder = DriveApp.getFolderById(ROOT_FOLDER_ID);
  processFolder(rootFolder);
}

function processFolder(folder) {
  Logger.log('フォルダ処理中: ' + folder.getName());

  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    convertFile(file, folder);
  }

  const subFolders = folder.getFolders();
  while (subFolders.hasNext()) {
    processFolder(subFolders.next());
  }
}

function convertFile(file, folder) {
  const fileName = file.getName();
  const mimeType = file.getMimeType();
  
  let newMimeType = null;

  // 1. Excel (新 .xlsx / 旧 .xls)
  if (mimeType === MimeType.MICROSOFT_EXCEL || 
      mimeType === MimeType.MICROSOFT_EXCEL_LEGACY) {
    newMimeType = MimeType.GOOGLE_SHEETS;
  }
  // 2. Word (新 .docx / 旧 .doc)
  else if (mimeType === MimeType.MICROSOFT_WORD || 
           mimeType === MimeType.MICROSOFT_WORD_LEGACY) {
    newMimeType = MimeType.GOOGLE_DOCS;
  }
  // 3. PowerPoint (新 .pptx / 旧 .ppt)
  else if (mimeType === MimeType.MICROSOFT_POWERPOINT || 
           mimeType === MimeType.MICROSOFT_POWERPOINT_LEGACY) {
    newMimeType = MimeType.GOOGLE_SLIDES;
  }

  // 変換対象の場合のみ実行
  if (newMimeType) {
    try {
      // 拡張子(.xlsx, .xls, .docx, .doc, .pptx, .ppt)をファイル名から除去
      const newName = fileName.replace(/\.(xlsx|xls|docx|doc|pptx|ppt)$/i, '');

      const resource = {
        name: newName,
        mimeType: newMimeType,
        parents: [folder.getId()] 
      };
      
      Drive.Files.create(resource, file.getBlob());
      Logger.log('  変換成功: ' + fileName);
      file.setTrashed(true);
      Logger.log('  ゴミ箱へ移動 ' + fileName);
    } catch (e) {
      Logger.log('  エラー: ' + fileName + ' / ' + e.message);
    }
  }
}

もし大量のファイルの変換する場合、6分間の実行制限4があるので、ファイル数が多い場合は親フォルダを変えて数回に分けて実行する必要がある。

Googleオフィスファイルへのコピー、同期

当然ながら、Google Drive上でしか、GoogleオフィスファイルはGoogleオフィスとして開けない。しかし、パソコン上ではMicrosoftオフィスファイルとして存在する。このファイルをコピー、もしくは同期すると、エラーとなる。

$ rclone sync "~/Document" "NewUser:Office" \
  --drive-skip-gdocs \
  --progress \
  --log-file="/home/arimasou16/remote_sync.log" \
  --log-level INFO
2026/01/29 18:50:46 ERROR : メモ.xlsx: Failed to copy: can't update google document type without --drive-import-formats
2026/01/29 18:51:30 ERROR : Attempt 3/3 failed with 1 errors and: can't update google document type without --drive-import-formats
2026/01/29 18:51:30 NOTICE: Failed to sync: can't update google document type without --drive-import-formats

こうした場合、先程--drive-import-formats docx,xlsx,pptxを使うか、もしくはGoogleオフィスファイルをスキップする--drive-skip-gdocsオプション5を使えば良い。この時、Microsoftオフィスファイルとして存在するものは、同期、コピーされる。

Googleドライブは、例えばメモ.xlsx(Excelオフィス形式)とメモ(Googleスプレッドシート形式)といった同じ名前で形式が違うファイルが共存できるが、rcloneから見ると別物として認識されるため、同期のとき、毎回同期してしまう?挙動が見られる。

どちらのオプション使うにしろ、このフォルダ配下はGoogle、またはMicrosoftオフィスファイルしか置かないと決めておいたり、形式が違う同名ファイルを置きことは避けた方が良さそうだ。

以上。


  1. Google drive #import-export-of-google-documents ↩︎ ↩︎

  2. Google Workspaeとドライブ固有のMIMEタイプ。“application/vnd.google-apps.spreadsheet”、“application/vnd.google-apps.document”、“application/vnd.google-apps.presentation”。 Google Workspace と Google ドライブでサポートされている MIME タイプ  |  Google Drive  |  Google for Developers ↩︎

  3. Microsoft Office MIME タイプ。“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”、“application/vnd.ms-excel”、“application/vnd.openxmlformats-officedocument.wordprocessingml.document”、“application/msword”、“application/vnd.openxmlformats-officedocument.presentationml.presentation”、“application/vnd.ms-powerpoint” Google Workspace ドキュメントの MIME タイプをエクスポートする  |  Google Drive  |  Google for Developers ↩︎

  4. Google サービスの割り当て  |  Apps Script  |  Google for Developers ↩︎

  5. Google drive #drive-skip-gdocs ↩︎