MENU

GAS×Googleドライブ連携|ファイル管理を自動化する方法【2026年版】

GAS×Googleドライブ連携|ファイル管理を自動化する方法【2026年版】

Googleドライブのファイルが増えてくると、どこに何があるかわからなくなる。毎月のバックアップ作業も忘れがちだし、古いファイルの削除は手作業だと必ず漏れが出る。

GASにはGoogleドライブを操作するためのDriveAppというサービスが用意されている。ファイルの一覧取得、整理、バックアップ、削除まで、すべてコードで制御できる。

目次

GAS×Googleドライブ連携のメリット

なぜGASでドライブを操作するのか

メリット 説明
無料 GASもGoogleドライブも無料で使える
自動実行 トリガーで定期実行、手作業ゼロに
大量処理 数百〜数千ファイルも一括処理
他サービス連携 スプレッドシート、Gmail、カレンダーと連携可能
プログラミング不要 コピペでOK、カスタマイズも簡単

こんな作業を自動化できる

  • ファイル一覧の出力 → スプレッドシートに自動で書き出し
  • ファイルの自動整理 → 日付別、種類別にフォルダ分け
  • 定期バックアップ → 重要フォルダを毎日コピー
  • 古いファイルの削除 → 90日以上前のファイルを自動削除
  • 共有設定の一括変更 → 複数ファイルの権限を一括管理

フォルダIDの取得方法

GASでGoogleドライブを操作するには、フォルダIDが必要になる。

取得手順

  • Googleドライブで対象フォルダを開く
  • URLを確認

https://drive.google.com/drive/folders/1ABC123XYZ789...
                                       ↑ここがフォルダID
  • folders/ の後ろの文字列がフォルダID

例: 1ABC123XYZ789defGHI456jkl がフォルダID

マイドライブのルートを指定する場合


// マイドライブのルートフォルダを取得
const rootFolder = DriveApp.getRootFolder();

DriveAppの基本メソッド一覧

GASでGoogleドライブを操作するための主要メソッドを整理した。

フォルダ操作

メソッド 説明 戻り値
DriveApp.getFolderById(id) IDでフォルダを取得 Folder
DriveApp.getRootFolder() マイドライブのルートを取得 Folder
folder.createFolder(name) 新しいフォルダを作成 Folder
folder.getFolders() 子フォルダ一覧を取得 FolderIterator
folder.getFiles() フォルダ内のファイル一覧を取得 FileIterator

ファイル操作

メソッド 説明 戻り値
DriveApp.getFileById(id) IDでファイルを取得 File
file.getName() ファイル名を取得 String
file.getUrl() URLを取得 String
file.getDateCreated() 作成日時を取得 Date
file.getLastUpdated() 更新日時を取得 Date
file.getSize() ファイルサイズを取得 Number
file.getMimeType() ファイルタイプを取得 String
file.moveTo(folder) フォルダに移動 File
file.makeCopy(name, folder) コピーを作成 File
file.setTrashed(true) ゴミ箱に移動 File

検索

メソッド 説明 戻り値
DriveApp.searchFiles(query) 条件でファイル検索 FileIterator
DriveApp.searchFolders(query) 条件でフォルダ検索 FolderIterator

実践例① フォルダ内ファイル一覧をスプレッドシートに出力

指定フォルダ内のすべてのファイル情報を、スプレッドシートに書き出す。

コード


/**
 * ============================================================
 * フォルダ内ファイル一覧をスプレッドシートに出力
 * ============================================================
 *
 * 【使い方】
 * 1. FOLDER_ID に対象フォルダのIDを設定
 * 2. listFilesToSheet() を実行
 * 3. アクティブなスプレッドシートに一覧が出力される
 */

// 対象フォルダのID
const FOLDER_ID = 'ここにフォルダIDを貼り付け';

/**
 * フォルダ内ファイル一覧をスプレッドシートに出力
 */
function listFilesToSheet() {
  // フォルダを取得
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();

  // スプレッドシートを準備
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();

  // ヘッダー行を設定
  const headers = ['No', 'ファイル名', 'URL', '作成日', '更新日', 'サイズ(KB)', 'タイプ'];
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold').setBackground('#d9e2f3');

  // ファイル情報を取得
  const data = [];
  let count = 1;

  while (files.hasNext()) {
    const file = files.next();
    data.push([
      count,
      file.getName(),
      file.getUrl(),
      Utilities.formatDate(file.getDateCreated(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'),
      Utilities.formatDate(file.getLastUpdated(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'),
      Math.round(file.getSize() / 1024),  // KB単位
      file.getMimeType()
    ]);
    count++;
  }

  // データを書き込み
  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, headers.length).setValues(data);
  }

  // 完了メッセージ
  SpreadsheetApp.getUi().alert(`${data.length}件のファイルを出力しました`);
}

/**
 * サブフォルダも含めて全ファイルを一覧出力(再帰処理)
 */
function listAllFilesRecursive() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();

  // ヘッダー
  const headers = ['No', 'フォルダパス', 'ファイル名', 'URL', '更新日', 'サイズ(KB)'];
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold').setBackground('#d9e2f3');

  const data = [];
  let count = 1;

  // 再帰的にファイルを取得
  function getFilesInFolder(folder, path) {
    const files = folder.getFiles();
    while (files.hasNext()) {
      const file = files.next();
      data.push([
        count++,
        path,
        file.getName(),
        file.getUrl(),
        Utilities.formatDate(file.getLastUpdated(), 'Asia/Tokyo', 'yyyy/MM/dd'),
        Math.round(file.getSize() / 1024)
      ]);
    }

    // サブフォルダを処理
    const subFolders = folder.getFolders();
    while (subFolders.hasNext()) {
      const subFolder = subFolders.next();
      getFilesInFolder(subFolder, path + '/' + subFolder.getName());
    }
  }

  getFilesInFolder(folder, folder.getName());

  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, headers.length).setValues(data);
  }

  SpreadsheetApp.getUi().alert(`${data.length}件のファイルを出力しました`);
}

実践例② 日付別フォルダに自動整理

ファイルの作成日に基づいて、自動的に日付別フォルダに振り分ける。

コード


/**
 * ============================================================
 * ファイルを日付別フォルダに自動整理
 * ============================================================
 *
 * 【動作】
 * 指定フォルダ内のファイルを、作成日に基づいて
 * YYYY-MM フォルダに自動移動します。
 *
 * 【例】
 * 2026年1月15日作成のファイル → 2026-01 フォルダ
 */

const SOURCE_FOLDER_ID = 'ここに整理元フォルダIDを貼り付け';

/**
 * ファイルを日付別フォルダに整理
 */
function organizeFilesByDate() {
  const sourceFolder = DriveApp.getFolderById(SOURCE_FOLDER_ID);
  const files = sourceFolder.getFiles();

  let movedCount = 0;
  const folderCache = {}; // 作成済みフォルダをキャッシュ

  while (files.hasNext()) {
    const file = files.next();
    const createdDate = file.getDateCreated();

    // YYYY-MM 形式のフォルダ名
    const folderName = Utilities.formatDate(createdDate, 'Asia/Tokyo', 'yyyy-MM');

    // フォルダを取得または作成
    let targetFolder;
    if (folderCache[folderName]) {
      targetFolder = folderCache[folderName];
    } else {
      targetFolder = getOrCreateFolder(sourceFolder, folderName);
      folderCache[folderName] = targetFolder;
    }

    // ファイルを移動
    file.moveTo(targetFolder);
    movedCount++;

    console.log(`移動: ${file.getName()} → ${folderName}/`);
  }

  console.log(`完了: ${movedCount}件のファイルを整理しました`);
}

/**
 * フォルダを取得、なければ作成
 */
function getOrCreateFolder(parentFolder, folderName) {
  const folders = parentFolder.getFoldersByName(folderName);

  if (folders.hasNext()) {
    return folders.next();
  } else {
    return parentFolder.createFolder(folderName);
  }
}

/**
 * ファイル種類別に整理(画像、PDF、ドキュメント等)
 */
function organizeFilesByType() {
  const sourceFolder = DriveApp.getFolderById(SOURCE_FOLDER_ID);
  const files = sourceFolder.getFiles();

  // ファイル種類とフォルダ名の対応
  const typeMapping = {
    'image/': '01_画像',
    'application/pdf': '02_PDF',
    'application/vnd.google-apps.spreadsheet': '03_スプレッドシート',
    'application/vnd.google-apps.document': '04_ドキュメント',
    'application/vnd.google-apps.presentation': '05_スライド'
  };

  let movedCount = 0;

  while (files.hasNext()) {
    const file = files.next();
    const mimeType = file.getMimeType();

    // 対応するフォルダ名を検索
    let folderName = '99_その他';
    for (const [typePrefix, folder] of Object.entries(typeMapping)) {
      if (mimeType.startsWith(typePrefix)) {
        folderName = folder;
        break;
      }
    }

    const targetFolder = getOrCreateFolder(sourceFolder, folderName);
    file.moveTo(targetFolder);
    movedCount++;
  }

  console.log(`完了: ${movedCount}件のファイルを種類別に整理しました`);
}

実践例③ ファイルの自動バックアップ

重要なフォルダを定期的にバックアップする仕組みを作る。

コード


/**
 * ============================================================
 * フォルダの自動バックアップ
 * ============================================================
 *
 * 【動作】
 * 指定フォルダ内のすべてのファイルを、
 * バックアップフォルダにコピーします。
 *
 * 【推奨トリガー設定】
 * 時間主導型 → 日タイマー → 深夜帯
 */

const BACKUP_SOURCE_ID = 'ここにバックアップ元フォルダIDを貼り付け';
const BACKUP_DEST_ID = 'ここにバックアップ先フォルダIDを貼り付け';

/**
 * フォルダをバックアップ
 */
function backupFolder() {
  const sourceFolder = DriveApp.getFolderById(BACKUP_SOURCE_ID);
  const destFolder = DriveApp.getFolderById(BACKUP_DEST_ID);

  // バックアップ日時のフォルダを作成
  const timestamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd_HHmm');
  const backupFolder = destFolder.createFolder('backup_' + timestamp);

  // ファイルをコピー
  const files = sourceFolder.getFiles();
  let copiedCount = 0;

  while (files.hasNext()) {
    const file = files.next();
    file.makeCopy(file.getName(), backupFolder);
    copiedCount++;
  }

  console.log(`バックアップ完了: ${copiedCount}件のファイルをコピーしました`);
  console.log(`保存先: ${backupFolder.getUrl()}`);

  // 完了通知(LINE Notifyと連携する場合)
  // sendLineNotify(`バックアップ完了: ${copiedCount}件`);
}

/**
 * サブフォルダも含めてバックアップ(再帰処理)
 */
function backupFolderRecursive() {
  const sourceFolder = DriveApp.getFolderById(BACKUP_SOURCE_ID);
  const destFolder = DriveApp.getFolderById(BACKUP_DEST_ID);

  const timestamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd_HHmm');
  const backupRoot = destFolder.createFolder('backup_' + timestamp);

  let totalCount = 0;

  function copyFolder(source, dest) {
    // ファイルをコピー
    const files = source.getFiles();
    while (files.hasNext()) {
      const file = files.next();
      file.makeCopy(file.getName(), dest);
      totalCount++;
    }

    // サブフォルダを再帰的に処理
    const subFolders = source.getFolders();
    while (subFolders.hasNext()) {
      const subFolder = subFolders.next();
      const newSubFolder = dest.createFolder(subFolder.getName());
      copyFolder(subFolder, newSubFolder);
    }
  }

  copyFolder(sourceFolder, backupRoot);

  console.log(`バックアップ完了: ${totalCount}件のファイルをコピーしました`);
}

実践例④ 古いファイルの自動削除

指定日数以上前のファイルを自動でゴミ箱に移動する。

コード


/**
 * ============================================================
 * 古いファイルの自動削除
 * ============================================================
 *
 * 【動作】
 * 指定フォルダ内で、最終更新日が指定日数以上前の
 * ファイルをゴミ箱に移動します。
 *
 * 【注意】
 * ゴミ箱のファイルは30日後に完全削除されます。
 * 誤削除に備えて、最初は削除せずログ出力のみで確認推奨。
 */

const CLEANUP_FOLDER_ID = 'ここに削除対象フォルダIDを貼り付け';
const DAYS_THRESHOLD = 90;  // 何日前以上のファイルを削除するか

/**
 * 古いファイルを削除(ゴミ箱に移動)
 */
function deleteOldFiles() {
  const folder = DriveApp.getFolderById(CLEANUP_FOLDER_ID);
  const files = folder.getFiles();

  // 基準日を計算
  const now = new Date();
  const threshold = new Date(now.getTime() - DAYS_THRESHOLD * 24 * 60 * 60 * 1000);

  let deletedCount = 0;
  const deletedFiles = [];

  while (files.hasNext()) {
    const file = files.next();
    const lastUpdated = file.getLastUpdated();

    if (lastUpdated < threshold) {
      deletedFiles.push({
        name: file.getName(),
        lastUpdated: Utilities.formatDate(lastUpdated, 'Asia/Tokyo', 'yyyy/MM/dd')
      });

      // ゴミ箱に移動
      file.setTrashed(true);
      deletedCount++;
    }
  }

  // ログ出力
  console.log(`${DAYS_THRESHOLD}日以上前のファイルを${deletedCount}件削除しました`);
  deletedFiles.forEach(f => {
    console.log(`  - ${f.name} (最終更新: ${f.lastUpdated})`);
  });

  // スプレッドシートに削除ログを記録(オプション)
  logDeletedFiles(deletedFiles);
}

/**
 * 削除対象ファイルの確認(削除せずログのみ)
 */
function previewOldFiles() {
  const folder = DriveApp.getFolderById(CLEANUP_FOLDER_ID);
  const files = folder.getFiles();

  const now = new Date();
  const threshold = new Date(now.getTime() - DAYS_THRESHOLD * 24 * 60 * 60 * 1000);

  let count = 0;

  console.log(`=== ${DAYS_THRESHOLD}日以上前のファイル一覧 ===`);

  while (files.hasNext()) {
    const file = files.next();
    const lastUpdated = file.getLastUpdated();

    if (lastUpdated < threshold) {
      console.log(`${file.getName()} (最終更新: ${Utilities.formatDate(lastUpdated, 'Asia/Tokyo', 'yyyy/MM/dd')})`);
      count++;
    }
  }

  console.log(`=== 合計: ${count}件 ===`);
}

/**
 * 削除ログをスプレッドシートに記録
 */
function logDeletedFiles(deletedFiles) {
  if (deletedFiles.length === 0) return;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let logSheet = ss.getSheetByName('削除ログ');

  if (!logSheet) {
    logSheet = ss.insertSheet('削除ログ');
    logSheet.getRange(1, 1, 1, 3).setValues([['削除日時', 'ファイル名', '最終更新日']]);
    logSheet.getRange(1, 1, 1, 3).setFontWeight('bold').setBackground('#f4cccc');
  }

  const now = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');
  const logData = deletedFiles.map(f => [now, f.name, f.lastUpdated]);

  const lastRow = logSheet.getLastRow();
  logSheet.getRange(lastRow + 1, 1, logData.length, 3).setValues(logData);
}

ファイル共有設定の自動化

複数ファイルの共有設定を一括で変更できる。

コード


/**
 * フォルダ内全ファイルの共有設定を一括変更
 */
function setFolderSharingSettings() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();

    // リンクを知っている全員が閲覧可能に設定
    file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

    console.log(`共有設定を変更: ${file.getName()}`);
  }
}

/**
 * 特定ユーザーに編集権限を付与
 */
function addEditorToFiles() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();
  const editorEmail = 'user@example.com';  // 追加するユーザーのメール

  while (files.hasNext()) {
    const file = files.next();
    file.addEditor(editorEmail);
    console.log(`編集権限を付与: ${file.getName()}`);
  }
}

/**
 * 全ての共有を解除(自分のみアクセス可)
 */
function removeAllSharing() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();

  while (files.hasNext()) {
    const file = files.next();

    // 共有を解除
    file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE);

    // 編集者・閲覧者を削除
    const editors = file.getEditors();
    editors.forEach(editor => file.removeEditor(editor));

    const viewers = file.getViewers();
    viewers.forEach(viewer => file.removeViewer(viewer));

    console.log(`共有を解除: ${file.getName()}`);
  }
}

トリガー設定でスケジュール実行

作成したスクリプトを定期的に自動実行するには、トリガーを設定する。

設定手順

  • GASエディタで「トリガー」(時計アイコン)をクリック
  • 「トリガーを追加」をクリック
  • 設定例:
用途 関数 トリガータイプ 頻度
毎日バックアップ backupFolder 日タイマー 午前2〜3時
毎週ファイル整理 organizeFilesByDate 週タイマー 月曜 午前6時
毎月古いファイル削除 deleteOldFiles 月タイマー 1日 午前3時

よくあるエラーと対処法

エラー1: フォルダが見つからない


原因: フォルダIDが間違っている
対処: URLからIDを正しくコピーしているか確認

エラー2: 権限がありません


原因: 対象フォルダへのアクセス権がない
対処: Googleドライブでフォルダにアクセスできるか確認

エラー3: 実行時間が長すぎる


原因: ファイル数が多すぎて6分制限に達した
対処: フォルダを分割するか、バッチ処理に変更

まとめ

今回のポイント

  • DriveAppでGoogleドライブを自由に操作できる
  • 4つの実践例を紹介した

– ファイル一覧をスプレッドシートに出力

– 日付別・種類別にファイル自動整理

– フォルダの自動バックアップ

– 古いファイルの自動削除

  • トリガー設定で定期実行すれば完全自動化が実現する

次のステップ

  • 今日: フォルダID取得とファイル一覧出力を試す
  • 今週中: 自動整理か自動バックアップを実装してみる
  • 来月: LINE通知と組み合わせて運用を回す
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次