Googleドライブで、フォルダー直下のファイルを別フォルダーへコピーする方法を説明します。
GAS(Google Apps Script)は、Googleサービスを操作するスクリプトです。
サブフォルダー、その中のファイル、階層全体は複製しません。
本稿のGASは、マイドライブ内のフォルダー直下にある50ファイル以内を、空の別フォルダーへ複製します。
少数なら手作業、多数なら対象をプレビューしてからGASを実行します。
2026年10月25日に公式資料と掲載コードを再確認しました。
今回行った動作確認はWindowsのNode.js 24.15.0による模擬テストで、GASの実認可・実行は未検証です。
ファイルコピー・階層の複製・ショートカットを分ける
| 目的 | 選ぶ操作 |
|---|---|
| 直下のファイルだけをコピー | 新しいファイルIDの複製を作る。本稿のGASの対象 |
| 階層全体を複製 | 子フォルダーの作成と再帰的な処理が別途必要。本稿のコードの対象外 |
| 同じ元ファイルを別の場所から開く | ショートカットを使う。独立した複製ではない |
| 元ファイルの保存先を変える | 移動。コピー元から元ファイルがなくなる操作 |
少数ファイルを手作業で複製する場合
パソコンのChromeでGoogleドライブを開き、コピー元のファイルを選んで右クリックし、「コピーを作成」を選びます。
子フォルダーまで一緒に選ばないでください。
新しいコピーだけを選び、右クリックの「整理」→「移動」からコピー先を指定します。
移動先とファイル数を確認し、元ファイルが元の場所に残っているかも確かめます。
Googleの標準コピー機能はファイルが対象で、フォルダー自体はコピーできません。
公式:ファイルのコピーと移動で操作範囲を確認できます。
練習フォルダーと期待する結果
コピー元へsample_sample.txtとnotes.txtを置き、子フォルダーの中にchild.txtを置きます。
自分のマイドライブに、別の空の「コピー先」を作ります。
直下コピーの結果は2ファイルで、child.txtと子フォルダーはコピー先に入りません。
ZIP内の3つのテキストファイルを使って配置を再現できます。
練習用データは練習用ファイル・コード・ローカル検証をまとめたZIPから取得できます。
次の画像とDrive APIでの確認内容は、以前の検証記録です。
今回、その実機検証の再実行や新規撮影は行っていません。

撮影前に専用の2ファイルをDrive APIでコピーし、新しいIDと保存先、元と同じ読み取り本文、所有者だけの権限を確認しました。
元の子フォルダーにはchild.txtが残っています。
これはDrive APIでの実機確認で、以下のGASを実行した結果ではありません。
直下50ファイル以内をコピーするGAS
自分が所有する練習用ファイルと、非公開の練習フォルダーで始めてください。
このコードは共有ドライブ用ではありません。
共有ドライブを扱う場合は、公式DriveAppの案内にある高度なDriveサービスを使う別の実装が必要です。
50件は、この練習コードが設けた上限で、Googleドライブ全体のコピー上限ではありません。
Google形式ではドキュメント・スプレッドシート・スライド・図形描画を許可しています。
コピー先にファイルまたは子フォルダーがある場合は、再実行による重複を避けるため停止します。
ショートカットやApps Scriptプロジェクトなど、この例で扱わないGoogle形式も事前に停止します。
プロジェクトとフォルダーIDを準備する
Apps Scriptを開き、「新しいプロジェクト」を作ります。
エディターの初期コードを次のコードに置き換えます。
コピー元とコピー先をブラウザーで開き、URLの/folders/以降のIDをそれぞれ控えます。
URLに?以降のパラメーターが付いている場合は、IDに含めません。
COPY_SOURCE_IDとCOPY_DESTINATION_IDの引用符内を、それぞれのIDに置き換えて保存します。
作成・実行の基本操作は、公式のスタンドアロンスクリプト手順で確認できます。
const COPY_SOURCE_ID = 'コピー元の練習用フォルダーID';
const COPY_DESTINATION_ID = '空のコピー先フォルダーID';
function directCopyPlan_() {
if (COPY_SOURCE_ID === COPY_DESTINATION_ID) {
throw new Error('コピー元とコピー先は別フォルダーにしてください');
}
const source = DriveApp.getFolderById(COPY_SOURCE_ID);
const destination = DriveApp.getFolderById(COPY_DESTINATION_ID);
if (destination.getFiles().hasNext() || destination.getFolders().hasNext()) {
throw new Error('コピー先が空ではありません。再実行せず結果を確認してください');
}
const iterator = source.getFiles(); // 子フォルダーには入らない
const files = [];
while (iterator.hasNext()) {
if (files.length >= 50) throw new Error('練習対象は50ファイル以内です');
const file = iterator.next();
const mime = file.getMimeType();
const nativeAllowed = [MimeType.GOOGLE_DOCS, MimeType.GOOGLE_SHEETS,
MimeType.GOOGLE_SLIDES, MimeType.GOOGLE_DRAWINGS];
if (mime.startsWith('application/vnd.google-apps.') && !nativeAllowed.includes(mime)) {
throw new Error('この練習では扱わない種類です: ' + file.getName());
}
files.push(file);
}
return { destination, files };
}
function previewDirectCopy() {
const plan = directCopyPlan_();
console.log(JSON.stringify(plan.files.map(file => ({ id: file.getId(), name: file.getName() })), null, 2));
}
function copyDirectFiles() {
const plan = directCopyPlan_(); // 全件確認を終えてから複製する
const results = [];
try {
for (const file of plan.files) {
const copy = file.makeCopy(file.getName(), plan.destination);
results.push({ sourceId: file.getId(), copyId: copy.getId(), name: copy.getName() });
console.log(JSON.stringify(results[results.length - 1]));
}
} catch (error) {
console.log(JSON.stringify({ completed: results, error: String(error) }));
throw error; // 途中成功したコピーは残る。コピー先を確認してから復旧する
}
console.log('コピーしたファイル数: ' + results.length);
return results;
}
プレビュー・実行・照合の順番
1. プレビューと初回の認可
エディター上部の関数選択でpreviewDirectCopyを選び、「実行」を押します。
初回に許可画面が出たら、使用するアカウントと要求されるDrive権限を確認します。
自分で作成したこのコードの処理と一致することを確認してから許可してください。
プレビュー自体はコピーしませんが、許可範囲はプロジェクト全体のコードから決まります。
コピー処理も含むため、プレビューだけでも書き込みを含むDrive権限を求められます。
詳しくは公式の認可の仕組みを確認してください。
2. 対象を確認してコピー
実行ログに表示された対象ID・名前を読み、練習なら直下2ファイルだけであることを確かめます。
元と先が同じではないこと、コピー先が空で非公開であることも確かめます。
対象とコピー先を確認後、関数選択をcopyDirectFilesへ変えて一度だけ実行します。
実行時には対象を読み直しますが、プレビュー結果との差分を自動で検出する機能はありません。
プレビュー後に元フォルダーが変わった場合は、プレビューから確認し直してください。
同時実行を防ぐロックはないため、他の人の操作や複数タブからの実行を重ねないでください。
3. 新しいIDと元ファイルを照合
ログにはsourceIdとcopyIdが出ます。
新しいIDのファイルがコピー先にあり、元ファイルはコピー元に残ることを確認します。
makeCopy(name, destination)で保存先を指定できるため、コピー後にDrive APIのparentsを書き換える処理は不要です。
このコードは組み込みのDriveAppだけを使うため、高度なDriveサービスの追加は不要です。
仕様はFile.makeCopyの公式説明とFolder.getFilesの公式説明を参照できます。
失敗後に再実行せず、残ったコピーを確認する
途中で権限や利用制限のエラーが起きると、成功済みのコピーは残ります。
エラー時に出力されたcompletedと、コピー先の件数・IDを照合します。
実行の強制終了などで最後のログが残らない場合も、コピー先の実ファイルを確認してください。
コピー先が空ではないため、そのままの再実行は停止します。
必要なら別の空の練習用コピー先で、対象を見直してから実行します。
元を削除して帳尻を合わせる方法は使いません。
元へ戻したい場合は、元ファイルが変わっていないことを確認して元を使用します。
コピーの整理はcopyIdで対象を特定し、元ファイルと取り違えないように行ってください。
元ファイルの削除や、ゴミ箱を空にする処理はこのコードにはありません。
コピーで維持されるものを決めつけない
アクセス権、コメント、版履歴、Apps Scriptのトリガーや外部認証が元と同じになるとは判断しないでください。
共有先や保存先の権限はGoogleドライブ│共有設定と権限の違い|閲覧者・コメント可・編集者・リンク共有で確認します。
コピーを自分が所有すると、自分の保存容量を使用するのでGoogleドライブの容量が減らないときに見る順番|消しても空かない理由も確認してください。
2026年10月25日のローカル模擬テストでは、プレビュー・2件コピー・空の元・50件・51件超過・同一フォルダーなど13ケースを確認しました。
空でないコピー先、対象外の形式、アクセス失敗、途中失敗後の記録と再実行停止も確認しています。
これはDriveAppを模擬した結果で、実際の権限取得やGoogle形式ファイルのコピー成功を示すものではありません。
関連する既存記事と案内
続けてDrive内のファイル整理やGASの操作を調べる場合は、次の記事を参照してください。






