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通知と組み合わせて運用を回す
コメント