GoogleドライブにあるMS OfficeファイルをGoogleドキュメントに一括変換するGoogle Apps Script

2020-10-21

その他

t f B! P L

Googleドライブの内容を他のアカウントに移動させる目的でフォルダをローカルにダウンロードして展開すると、GoogleドキュメントのファイルがすべてMS Office形式のファイルに変換されていました。 このまま他のアカウントのGoogleドライブにアップロードしてもこれらのMS OfficeファイルがGoogleドキュメントに自動的には変換されないので、Google Apps Scriptで一括変換しました。

 MS Officeのファイルを一括変換するBatchConverter

 このスクリプトを使うにはGoogleドライブのためのGoogle Apps Scriptを使うための準備-p--qをしておかないといけません。

// Googleドライブ内のOfficeファイルをGoogleドキュメント形式に一括変換する。
// グローバルオブジェクトのDriveを有効にする必要がある。
function convertToNative() {
  [
   MimeType.MICROSOFT_EXCEL,
   MimeType.MICROSOFT_EXCEL_LEGACY,
   MimeType.MICROSOFT_POWERPOINT,
   MimeType.MICROSOFT_POWERPOINT_LEGACY,
   MimeType.MICROSOFT_WORD,
   MimeType.MICROSOFT_WORD_LEGACY
  ].forEach(mime => {  // 変換元のmimeType。
            let docs = DriveApp.getFilesByType(mime);  // 指定したmimeTypeのファイルイテレータを取得。 
            while (docs.hasNext()) {  // for文ではイテレートできない。
              let doc = docs.next();  // ドキュメントを取得。
              let docid = doc.getId();  // ドキュメントのIDを取得。
              let parent = doc.getParents().next();  // 親フォルダを取得。
              try {
                Drive.Files.copy({parents: [{id: parent.getId()}]}, docid, {convert: true});  // 同じフォルダに変換したドキュメントを出力。同名ファイルがあっても上書きしない。
                Drive.Files.remove(docid);  // 変換元のファイルを完全削除。
                Logger.log('Converted: %s in %s', doc.getName(), parent.getName());  // ログの出力。
              } catch (e) {
                console.error('%s in %s\n%s', doc.getName(), parent.getName(), e);
              }
            }
  });
}

 

変換元ファイルは完全に削除されて元には戻せませんので、絶対に消えては困るファイルは事前にダウンロードしてバックアップをとっておかないといけません。

このコードをDrive APIを有効にしたGoogle Apps Scriptエディタにペーストして保存します。

パスワードがかかっていたり、サイズの大きなファイルは変換に失敗するので、変換に失敗したファイル名とその親フォルダ名を出力にするようにしています。

実行結果をみる

 291秒かかって、833.4MBが746MBに減りました。

 変換に失敗したファイル

変換に失敗していたのは、次の3つのファイルでした。

 

パスワードがかかったxlsファイル

 

149MBのpptxファイル

 

183MBのpptxファイル

 

これらはパスワードやファイルサイズが大きすぎるという理由で、そもそもGoogleアプリでは開くことができないものでした。

上記のpptxファイルはもともとGoogleスライドのファイルだったのをダウンロードしたときにpptxファイルに変換されたものです。大きなスライドは一旦ダウンロードしてしまったら、もうGoogleスライドには戻せないということですね。

ちなみに最初はGoogleアカウントのバックアップを作成してデータの移行をしようと思ったのですが、それだと800MB程度のはずのデータが1TBのバッグアップデータになったのでその方法は諦めました。 

アップロードする前であればGoogleドライブの設定で、「アップロードしたファイルをGoogleドキュメントエディタ形式に変換します」にチェックをつけるとアップロード時に変換されるはずですが、これら変換できないファイルはアップロード自体に失敗します。

新しいアカウントに移動させたいファイルを「共有」させてオーナーを変更するとファイルの移動ができますが、大きなファイルはコピーに失敗するので元のアカウントにファイルを残しておくことはできませんでした。

できるだけGoogleドキュメントに一括変換するBatchConverter

もう面倒なのでテキストファイルもOpenDocument形式もすべてGoogleドキュメント形式に変換することにしました。

// Googleドライブ内のファイルをGoogleドキュメント形式に一括変換する。
// グローバルオブジェクトのDriveを有効にする必要がある。
function convertToNative() {
  [
   MimeType.PLAIN_TEXT, 
   MimeType.OPENDOCUMENT_GRAPHICS, 
   MimeType.OPENDOCUMENT_PRESENTATION,
   MimeType.OPENDOCUMENT_SPREADSHEET,
   MimeType.OPENDOCUMENT_TEXT,
   MimeType.MICROSOFT_EXCEL,
   MimeType.MICROSOFT_EXCEL_LEGACY,
   MimeType.MICROSOFT_POWERPOINT,
   MimeType.MICROSOFT_POWERPOINT_LEGACY,
   MimeType.MICROSOFT_WORD,
   MimeType.MICROSOFT_WORD_LEGACY
  ].forEach(mime => {  // 変換元のmimeType。
            let docs = DriveApp.getFilesByType(mime);  // 指定したmimeTypeのファイルイテレータを取得。 
            while (docs.hasNext()) {  // for文ではイテレートできない。
              let doc = docs.next();  // ドキュメントを取得。
              let docid = doc.getId();  // ドキュメントのIDを取得。
              let parent = doc.getParents().next();  // 親フォルダを取得。
              try {
                Drive.Files.copy({parents: [{id: parent.getId()}]}, docid, {convert: true});  // 同じフォルダに変換したドキュメントを出力。同名ファイルがあっても上書きしない。
                Drive.Files.remove(docid);  // 変換元のファイルを完全削除。
                Logger.log('Converted: %s in %s', doc.getName(), parent.getName());  // ログの出力。
              } catch (e) {
                console.error('%s in %s\n%s', doc.getName(), parent.getName(), e);
              }
            }
  });
}
PDFファイルも変換できるようですが、やってみると結構文字化けするので、変換していません。

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ