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

Googleドライブ│フォルダ内ファイルを一覧取得するツール

Googleドライブ内のファイルを一括で一覧化する方法です。

この例はマイドライブの小さなフォルダを対象に、実行者が閲覧できるファイルを列挙します。共有ドライブを含む組織全体の棚卸しを保証するものではありません。

手作業での確認は手間がかかります。

本記事ではGoogle Apps Script(GAS)を使って、フォルダのURLを入力するだけで、閲覧できるファイル情報をスプレッドシートに一覧出力するツールの実装手順を解説します。

処理の流れ

スプレッドシートに追加されたカスタムメニューから実行し、入力フォームにGoogleドライブのフォルダURLを入力すると、新規シートに対象ファイルの一覧が出力されます。

Googleドライブのフォルダ内ファイル一覧を取得したスプレッドシートの出力例。

スプレッドシートに出力される項目は以下の通りです。

  • フォルダ名
  • ファイル名
  • 作成日
  • オーナー
  • ファイルURL
目次

導入・使用手順

  1. 新規または利用対象のGoogleスプレッドシートを開きます。
  2. 上部メニューの「拡張機能」から「Apps Script」を選択します。
  3. 表示されたエディタにスクリプトコードを貼り付けて保存します(ファイル名は Code.gs)。
  4. 「ファイルを追加」からHTMLファイルとして FolderInputForm.html を作成し、対応するHTMLコードを貼り付けて保存します。
  5. スプレッドシートを再読み込みするとメニューバーに専用メニューが表示され、そこから実行できます。

初回実行時には、Googleアカウントへのアクセス権限を承認するダイアログが表示されます。

以下が実装コードです。既存のonOpenがある場合はメニュー追加処理を統合してください。まずテスト用フォルダとシートで試します。Google実機の認可・列挙・画面表示は今回未検証です。

初回実行時に表示されるGoogleアカウントへのアクセス権限承認ダイアログ。

スプレッドシートに関するほかの自動化手順は、関連記事にまとめています。

スポンサーリンク

スクリプトコード(Code.gs)

まずはスプレッドシートの「拡張機能」から開いたスクリプトファイル(Code.gs)へ記述します。

上の新規プロジェクトのリンクから独立したスクリプトを作ると、この例のメニューや出力先をそのまま使えません。

フォルダURLにresourcekeyが付いている場合は、その部分も含めてコピーしてください。

このコードはキー付きURLをキー対応の取得メソッドへ渡します。

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Drive一覧').addItem('ファイル一覧を出力', 'showFolderInputModal').addToUi();
}
function showFolderInputModal() {
  const html = HtmlService.createHtmlOutputFromFile('FolderInputForm').setWidth(420).setHeight(250);
  SpreadsheetApp.getUi().showModalDialog(html, 'フォルダURLを入力');
}
function processFolderUrl(folderUrl) {
  const match = String(folderUrl).trim().match(/^https:\/\/drive\.google\.com\/drive\/(?:u\/\d+\/)?folders\/([a-zA-Z0-9_-]+)(?:[?#][^\s]*)?$/);
  if (!match) throw new Error('drive.google.comのフォルダURLを指定してください');
  const keyMatch = String(folderUrl).trim().split('#')[0].match(/[?&]resourcekey=([^&]*)/);
  let resourceKey = '';
  if (keyMatch) {
    try { resourceKey = decodeURIComponent(keyMatch[1]); }
    catch (e) { throw new Error('resourcekeyを含む元のURLをコピーし直してください'); }
    if (!/^[a-zA-Z0-9_-]+$/.test(resourceKey)) throw new Error('resourcekeyの形式が不正です');
  }
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(10000)) throw new Error('同じスクリプトで処理中です');
  try {
    const root = resourceKey
      ? DriveApp.getFolderByIdAndResourceKey(match[1], resourceKey)
      : DriveApp.getFolderById(match[1]);
    const queue = [{folder: root, path: root.getName()}];
    const seen = new Set(), rows = [];
    for (let i = 0; i < queue.length; i++) {
      const {folder, path} = queue[i];
      if (seen.has(folder.getId())) throw new Error('重複フォルダIDのため中止しました');
      seen.add(folder.getId());
      const files = folder.getFiles();
      while (files.hasNext()) {
        if (rows.length >= 1000) throw new Error('1000ファイルを超えるため中止しました');
        const file = files.next();
        if (file.isTrashed()) continue;
        const owner = file.getOwner();
        rows.push([safeCell_(path), safeCell_(file.getName()), file.getDateCreated(),
          safeCell_(owner ? owner.getName() : '所有者情報なし'), file.getUrl()]);
      }
      const children = folder.getFolders();
      while (children.hasNext()) {
        const child = children.next();
        if (child.isTrashed()) continue;
        if (queue.length >= 100) throw new Error('100フォルダを超えるため中止しました');
        queue.push({folder: child, path: path + ' > ' + child.getName()});
      }
    }
    // 列挙がすべて成功してから、新規シートへ出力します。
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const name = 'ファイル一覧_' + Utilities.getUuid();
    const sheet = ss.insertSheet(name, 0);
    if (sheet.getMaxRows() < rows.length + 1) {
      sheet.insertRowsAfter(sheet.getMaxRows(), rows.length + 1 - sheet.getMaxRows());
    }
    sheet.getRange(1, 1, rows.length + 1, 5).setValues([['フォルダ', 'ファイル名', '作成日', 'オーナー', 'URL'], ...rows]);
    sheet.activate();
    return {name, files: rows.length, folders: seen.size};
  } finally {
    try { SpreadsheetApp.flush(); }
    finally { lock.releaseLock(); }
  }
}
function safeCell_(value) {
  const text = String(value);
  return /^[=+@-]/.test(text) ? "'" + text : text;
}

続いて、URL入力画面となるモーダル用のHTMLコード(FolderInputForm.html)です。

<!DOCTYPE html>
<html><head><base target="_top"><style>
body {font-family:sans-serif;} input {box-sizing:border-box;width:100%;padding:8px;} button {margin-top:12px;} #status {white-space:pre-wrap;}
</style></head><body>
<label for="folderUrl">Google DriveのフォルダURL</label>
<input type="url" id="folderUrl" placeholder="https://drive.google.com/drive/folders/xxxxx">
<button id="run" onclick="submitFolder()">実行</button><p id="status" role="status"></p>
<script>
let running = false;
function submitFolder() {
  if (running) return;
  running = true;
  const button = document.getElementById('run');
  const status = document.getElementById('status');
  button.disabled = true; status.textContent = '処理中です。画面を閉じずにお待ちください。';
  google.script.run.withSuccessHandler(result => {
    status.textContent = result.name + 'へ' + result.files + '件を出力しました。画面を閉じて結果を確認してください。';
    // 同じダイアログからの重複出力を防ぐため、ボタンは無効のままです。
  }).withFailureHandler(error => {
    status.textContent = '処理に失敗しました。実行ログと作成済みシートを確認してください。' + error.message;
    running = false; button.disabled = false;
  }).processFolderUrl(document.getElementById('folderUrl').value);
}
</script></body></html>

一覧にはファイル名・所有者名・URLを転記します。元ファイルの共有設定は変えませんが、結果シートの閲覧者にはこれらの情報が見えるため、出力先の共有範囲を確認してください。

親1ファイル・子1ファイル・空フォルダの練習例で2件が出るか、0件の場合に見出しだけになるかを確認します。成功後の同じダイアログでは再実行できません。

出力結果のイメージ

次は架空の出力例です。実測結果ではありません。作成日はシートのタイムゾーンと表示形式にも依存します。

フォルダファイル名作成日オーナー名ファイルURL
メインフォルダ企画書.docx2024/12/01 10:32鈴木 太郎https://drive.google.com/…
メイン > 子1デザイン案.pptx2024/12/01 11:05鈴木 太郎https://drive.google.com/…
フォルダ名やファイル名などの取得結果が出力されたスプレッドシートの表示画面。

注意点

  • 対象フォルダに対する閲覧権限がない場合、ファイル一覧を取得できません。
  • 結果は「ファイル一覧_」とUUIDの名前で新規作成します。フォルダ名の禁止文字や同じ分の実行による名前衝突を避けます。
  • 親を含め100フォルダ・1000ファイルを超えると出力前に停止します。上限内でも実行時間・権限・ブックの容量で失敗する場合があります。途中再開はありません。

関連コードはGitHubのMOTOKI-LLC/cg-method-codeにもあります。本文の修正版と同じ版とは限らないため、差分を確認してください。

Googleドライブのファイルやフォルダを扱う記事は、ほかにもあります。

スポンサーリンク

まとめ

GASを活用することで、手作業で行っていたGoogleドライブ内のファイル確認や棚卸しを自動化できます。

ショートカットのリンク先はたどりません。空フォルダはファイル行を作りません。元データは削除・変更せず、結果だけを新規シートへ書きます。書込時に失敗した場合は空または途中のシートが残ることがあるため、完成した一覧として使わないでください。

2026年10月28日は、キー付きURLの分岐と出力確定・ロック解除をローカルの模擬試験で確認しました。

Google Driveへの実アクセスや認可画面、出力シートの表示は未検証です。

少数の練習データで確認してください。元に戻す場合は、追加した結果シートの名前と内容を確認して整理します。

フォルダ内のファイル一覧についてよくある質問

このツールは、何を一覧にしますか?

フォルダのURLを入力すると、サブフォルダを含む対象ファイルの情報を、新規シートに一覧出力します。出力項目は、フォルダ名・ファイル名・作成日・オーナー・ファイルURLです。

どうやって実行しますか?

スプレッドシートに追加されるカスタムメニューから実行します。入力フォームにGoogleドライブのフォルダURLを入力すると、新規シートに一覧が出力されます。

ファイルは、何と何を作成しますか?

Apps Scriptのエディタで、Code.gs(スクリプト)と、HTMLファイルのFolderInputForm.html(URL入力画面)を作成します。保存したあとにスプレッドシートを再読み込みすると、メニューバーに専用メニューが表示されます。

初回の実行時に、権限の確認が出るのはなぜですか?

Googleアカウントへのアクセス権限を、承認するダイアログが表示されます。内容を確認してから承認してください。

フォルダを指定しても、一覧が出ません。

対象フォルダに対する閲覧権限がないと、ファイル一覧を取得できません。

フォルダのURLと、自分のアカウントの権限を確認してください。

リンク共有のURLにresourcekeyがある場合は、省略せず入力します。

キーを指定しても、アクセスできないフォルダの権限を取得できるわけではありません。

シートを作成できないことはありますか?

権限やブックの容量などで作成・書込みに失敗する場合があります。列挙が成功してからUUID付きの新規シートを作成しますが、書込み失敗時は空や途中の結果が残ることがあります。

共有ドライブのファイルも対象にできますか?

この例では共有ドライブを含む網羅的な取得は未確認です。共有ドライブを扱う場合はAdvanced Drive ServiceやDrive APIでの実装を検討し、対応範囲・権限を別途検証してください。

コードの最新の動作は、どう確認すればよいですか?

Google実機での再検証は未実施です。DriveAppの仕様と共有ドライブの注意、Folderの列挙仕様を確認し、小さな練習フォルダで試してください。

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

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

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

作業環境の作り方

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