Amazonで商品を見るセール会場へ

Googleドライブ│フォルダ内のファイルをまとめてスプレッドシート・スライド・ドキュメントに自動変換する方法

eyecatch-google-apps-script-convert-spreadsheet

Driveフォルダ直下のExcel・CSVをGoogleスプレッドシート、PowerPointをGoogleスライド、WordをGoogleドキュメントへ変換するGASの例です。元ファイルを残し、別の空フォルダに変換結果を新規作成します。

Microsoft Office形式のまま編集できる場合もあり、共同編集のために必ず変換が必要なわけではありません。Google形式を必要とする処理や運用に合わせて使ってください。

目次

事前準備:Drive API v3と練習用フォルダ

Apps Scriptの新規プロジェクトを作り、エディタ左側の「サービス」の追加からDrive APIを選択します。以下のコードはv3を使用します。既定のCloudプロジェクトでは、サービス追加に伴ってAPIが有効になります。標準のCloudプロジェクトを関連付けている場合は、そのプロジェクトのGoogle CloudコンソールでもDrive APIを有効にしてください。

この拡張サービスの例では、APIキーやブラウザー用OAuthクライアントIDを手動作成しません。初回実行時は自分で作ったコードであること、要求される権限、実行アカウントを確認して認可します。組織の制限で許可できない場合は、管理者へ確認してください。

マイドライブに少数の練習用Officeファイルを入れた変換元フォルダと、空の出力先フォルダを別々に作ります。コードのSOURCE_FOLDER_IDとOUTPUT_FOLDER_IDを、それぞれのフォルダURLの「/folders/」に続くIDへ変更します。URL全体や末尾のクエリは含めません。出力先の共有範囲も確認してください。

スポンサーリンク

変換コード:まずDRY_RUNで件数を確認する

最初はDRY_RUNをtrueのままconvertPracticeFilesを実行します。実行ログのtargetsが対象件数、skippedが対象外の件数です。trueでは変換ファイルを作りません。件数と元フォルダの内容を照合し、まず1件で試すための準備ができたらfalseにして保存し、同じ関数を実行します。Webアプリのデプロイや定期トリガーは不要です。

function convertPracticeFiles() {
  const SOURCE_FOLDER_ID = '変換元フォルダID';
  const OUTPUT_FOLDER_ID = '空の出力先フォルダID';
  const DRY_RUN = true; // 確認後にfalseへ変更すると新規作成します。
  const mapping = {
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'application/vnd.google-apps.spreadsheet',
    'application/vnd.ms-excel': 'application/vnd.google-apps.spreadsheet',
    'text/csv': 'application/vnd.google-apps.spreadsheet',
    'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'application/vnd.google-apps.presentation',
    'application/vnd.ms-powerpoint': 'application/vnd.google-apps.presentation',
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'application/vnd.google-apps.document',
    'application/msword': 'application/vnd.google-apps.document'
  };
  if (SOURCE_FOLDER_ID === OUTPUT_FOLDER_ID) throw new Error('別の出力先フォルダを指定してください');
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(5000)) throw new Error('同じプロジェクトで実行中です');
  try {
    const source = DriveApp.getFolderById(SOURCE_FOLDER_ID);
    const output = DriveApp.getFolderById(OUTPUT_FOLDER_ID);
    if (output.getFiles().hasNext() || output.getFolders().hasNext()) {
      throw new Error('出力先は空にしてください。前回の結果がある場合は再実行せず確認してください');
    }
    const imports = Drive.About.get({fields: 'importFormats'}).importFormats || {};
    const files = source.getFiles(), plan = [];
    let scanned = 0, skipped = 0;
    while (files.hasNext()) {
      const file = files.next();
      if (++scanned > 100) throw new Error('直下100ファイル以内で試してください');
      if (file.isTrashed()) continue;
      const mime = file.getMimeType();
      const target = mapping[mime];
      if (!target) { skipped++; continue; }
      if (!(imports[mime] || []).includes(target)) throw new Error('APIが対応しない変換です');
      if (file.getSize() > 5 * 1024 * 1024) throw new Error('練習例は1ファイル5MiB以下にしてください');
      plan.push({file, mime, target});
      if (plan.length > 10) throw new Error('変換対象は10ファイル以内で試してください');
    }
    console.log(JSON.stringify({dryRun: DRY_RUN, targets: plan.length, skipped}));
    if (DRY_RUN) return;
    for (const item of plan) {
      const blob = item.file.getBlob().setContentType(item.mime);
      const created = Drive.Files.create({
        name: item.file.getName(),
        mimeType: item.target,
        parents: [OUTPUT_FOLDER_ID]
      }, blob, {fields: 'id,name,mimeType'});
      console.log(JSON.stringify({sourceId: item.file.getId(), outputId: created.id, mimeType: created.mimeType}));
    }
  } finally {
    lock.releaseLock();
  }
}

拡張子の見た目だけでなく、Driveが返すMIMEタイプで変換先を選びます。Google形式の既存ファイル、画像、PDF、ショートカットなど、この例の対応表にないものは対象外です。子フォルダはたどりません。CSVがtext/csv以外として登録されている場合も対象外になるため、件数が合わなければ元ファイルの形式を確認してください。

Drive APIのimportFormatsで対応する変換か確認してから作成します。直下100ファイル、変換対象10ファイル、対象1件5MiB以下はこの練習コード独自の制限です。Googleの全形式共通の上限ではなく、この範囲でも内容・認可・実行時間・サービス制限などで失敗する場合があります。

結果の確認と再実行時の注意

出力先で件数とファイル名を確認し、各ファイルを開いて数式、シート、改行、画像、フォント、レイアウトを元ファイルと比較します。CSVは文字コード、区切り、先頭の0、日付への自動変換も確認してください。マクロやOffice固有機能まで再現されるとは限りません。

出力先にファイルか子フォルダがあれば、作成前に停止します。そのため同じ出力先への単純な再実行による重複を抑えますが、変換済みの元ファイルを永続的に記録する仕組みではありません。別の空フォルダを指定すれば、同じ元ファイルも再び変換されます。

途中で失敗した場合、すでに作成した結果は残ります。通信エラーでもサーバー側では作成済みの場合があるため、自動再試行は行いません。出力先とログのsourceId・outputIdを照合し、未処理の元ファイルだけを別の練習フォルダに分けて確認してください。

ロックで防ぐのは同じスクリプトプロジェクトの同時実行です。別プロジェクトからの実行や手動編集は防げません。処理中は元フォルダと出力先を他の人や処理が変更しない運用で試してください。ファイル名・IDを含む結果や実行ログの共有にも注意してください。

旧コードとの違いとよくあるエラー

Drive.Files.insert is not a functionは、旧v2用コードをv3で実行した場合などに起きます。本文のv3コードはDrive.Files.create、name、ID文字列の配列であるparentsを使用します。Driveが未定義なら拡張サービスの追加、APIエラーなら関連CloudプロジェクトでのAPI有効化と権限を確認してください。

PowerPointをSheetsへ変換するような変更はしません。本文ではExcel/CSV・PowerPoint・Wordに対応する変換先を自動選択するため、mimeTypeだけを無条件に書き換える必要はありません。共有ドライブへの対応や大量ファイルの再開処理は、この例の対象外です。

実行をやめるときは次の実行を行わず、練習用に作成した結果を確認して整理します。コードは元ファイルの削除・上書きや共有設定の変更を行いません。結果を削除しても元のOfficeファイルは残ります。

検証範囲と公式資料

2026年10月23日に本文とコードを更新しました。ローカルの模擬環境で、変換先選択、DRY_RUN、空でない出力先の拒否、件数・サイズ制限、途中失敗時の停止を確認しています。Google実環境での認可・変換・表示や、変換後の内容の再現性は未確認です。既存の画像も現行画面として再確認したものではありません。

拡張ドライブサービス、拡張サービスの有効化、Drive APIのアップロードと形式変換を参照してください。

旧コードはGitHubのMOTOKI-LLC/cg-method-codeにもあります。今回の改訂コードと同じ版とは限らないため、このページのコードを使用してください。

旧画面の参考資料

以下は旧エディタ・旧設定フローの画像です。現行の操作手順ではありません。「リソース」メニュー、認証情報作成、ユーザータイプ「内部」の選択などをそのまま再現せず、上の現行手順に従ってください。

GoogleドライブからGoogle Apps Scriptを選択して新規プロジェクトを作成する手順。
上部メニューのリソースからGoogleの拡張サービスを選択する画面。
コンソール画面のAPI一覧や検索窓からGoogle Drive APIを検索して選択する手順。
Google Drive APIの詳細画面で有効にするボタンをクリックする手順。
API管理画面で認証情報を作成をクリックする操作。
必要な認証情報の指定で各項目を設定し、次へ進む設定画面。
ユーザータイプの選択画面で内部を指定する操作。
認証情報設定でアプリケーション名を入力する画面。
画面の案内に沿って認証情報の作成を完了した状態。
スクリプトエディタの上部メニューのリソースからGoogleの拡張サービスを再度開く画面。
拡張サービス一覧でDrive APIをオンに切り替えて有効にする手順。
スクリプト初回実行時に表示される実行権限の承認画面。
スクリプト実行によりフォルダ内に変換後のファイルが生成された様子。
スポンサーリンク

関連するDrive操作

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次