Google Apps ScriptでGoogleドライブのフォルダ・ファイルのオーナー権を一括変更する方法

「Googleドライブのフォルダやファイルのオーナー権を一括で変更したいけど、手動でやるのは面倒…」と感じたことはありませんか?

特に、フォルダ内に多くのファイルやサブフォルダがある場合、一つずつオーナーを変更するのは手間がかかります。

そこで、本記事ではGoogle Apps Script(GAS)を使って、フォルダ内のファイルとサブフォルダのオーナー権を一括で譲渡する方法 をご紹介します。(親フォルダは除く)

スプレッドシートにフォルダ情報を入力し、スクリプトを実行するだけで、簡単かつ効率的にオーナー権を変更できます。

目次

完成イメージ

フォルダ構成とオーナー権の変更可否(スクリプト実行の場合)

📂 親フォルダ (オーナー権変更不可 ❌)
├── 📂 サブフォルダA (オーナー権変更可能 ✅)
│ ├── 📄 ファイルA1 (オーナー権変更可能 ✅)
│ ├── 📄 ファイルA2 (オーナー権変更可能 ✅)
│ └── 📂 孫フォルダA1 (オーナー権変更可能 ✅)
│ ├── 📄 ファイルA1-1 (オーナー権変更可能 ✅)
│ └── 📄 ファイルA1-2 (オーナー権変更可能 ✅)
├── 📂 サブフォルダB (オーナー権変更可能 ✅)
│ ├── 📄 ファイルB1 (オーナー権変更可能 ✅)
│ └── 📄 ファイルB2 (オーナー権変更可能 ✅)

スプレッドシートの構成

A列B列
フォルダ名(対象のフォルダ名を入力)
フォルダID(対象のフォルダIDを入力)
新しいオーナーのメールアドレス(譲渡先のメールアドレス)
実行結果(ログ)成功 (X 件のファイル/フォルダを譲渡)

スクリプトを実行すると、サブフォルダ・孫フォルダ・すべてのファイルのオーナー権を一括譲渡
親フォルダのオーナー権はGoogleの仕様上、変更できないため手動で対応が必要

スクリプトを実行できる条件

今回のスクリプトを実行するには、以下の条件を満たしている必要があります。

Google Workspace ユーザーであること

Googleの仕様上、スクリプトを使ってオーナー権を譲渡できるのは、Google Workspace(企業向けアカウント) のみです。

個人アカウント(@gmail.com)では、オーナー権移行はサポートされていないため、手動での変更が必要です。

同じドメイン(同じ組織)のユーザー間であること

Google Workspaceのポリシーにより、異なるドメインのアカウントにはオーナー権を譲渡できない制限があります。

自分がオーナーであるファイル・フォルダのみ変更可能

他のユーザーがすでにオーナーのファイルは、スクリプトで変更できません。

組織の管理者設定による制限がないこと

Google Workspaceの管理者がオーナー権の譲渡を制限している場合、スクリプトが動作しない可能性があります。

手順

STEP
スプレッドシートの準備

Google スプレッドシートを開き、A列に次のヘッダーを記入します。

  • A1: フォルダ名
  • A2: フォルダID
  • A3: 新しいオーナーのメールアドレス
  • A4: 実行結果(ログ)

B列に対象のフォルダ名・IDと新しいオーナーのメールアドレスを入力します。

フォルダ名かフォルダIDのどちらかの入力でOKです。

フォルダIDの確認方法
  1. Google ドライブでフォルダをダブルクリックします。
  2. 画面上部に表示されるURL「https://drive.google.com/drive/folders/〇〇〇〇〇〇」の 〇〇〇〇〇〇 の部分がフォルダIDです。

シート名を「オーナー権譲渡」とし、スクリプト実行時にこのシートを参照します。

(シート名を変更する場合は、併せてスクリプトもご変更ください。)

STEP
GASエディタを開く

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
スクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

function changeOwnerFromSheet() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.alert(
    "オーナー権を譲渡しますか?", 
    "この操作は元に戻せません。\n続行する場合は「はい」を押してください。",
    ui.ButtonSet.YES_NO
  );

  if (response != ui.Button.YES) {
    Logger.log("処理がキャンセルされました。");
    return;
  }

  const sheetName = "オーナー権譲渡"; // シート名を指定
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

  if (!sheet) {
    Logger.log(`シート "${sheetName}" が見つかりません。シート名を確認してください。`);
    return;
  }

  const dataRange = sheet.getRange(1, 1, sheet.getLastRow(), 2).getValues(); // A列とB列のデータ取得
  const header = dataRange.map(row => row[0]); // A列(ヘッダー)の配列
  const data = dataRange.map(row => row[1]);  // B列(データ)の配列

  // 必要なヘッダーのインデックスを取得
  const folderNameIndex = header.indexOf("フォルダ名");
  const folderIdIndex = header.indexOf("フォルダID");
  const emailIndex = header.indexOf("新しいオーナーのメールアドレス");
  const resultIndex = header.indexOf("実行結果(ログ)");

  if (folderIdIndex === -1 || emailIndex === -1 || resultIndex === -1) {
    Logger.log("必要なヘッダー(フォルダ名、フォルダID、新しいオーナーのメールアドレス、実行結果(ログ))が不足しています。");
    sheet.getRange(4, 2).setValue("エラー: ヘッダーが正しくありません");
    return;
  }

  let successCount = 0; // オーナー権譲渡の成功件数
  let errorCount = 0;   // エラー件数

  try {
    let folder;
    const folderName = data[folderNameIndex]; // フォルダ名
    const folderId = data[folderIdIndex];     // フォルダID
    const newOwnerEmail = data[emailIndex];   // 新しいオーナーのメールアドレス

    if (!folderId && !folderName) {
      throw new Error("フォルダIDまたはフォルダ名が空です");
    }

    // フォルダIDで特定
    if (folderId) {
      folder = DriveApp.getFolderById(folderId);
    } else if (folderName) {
      // フォルダ名で特定
      const folders = DriveApp.getFoldersByName(folderName);
      if (folders.hasNext()) {
        folder = folders.next();
      } else {
        throw new Error(`フォルダ名 "${folderName}" に一致するフォルダが見つかりません`);
      }
    }

    // フォルダが特定できた場合にオーナー権限を変更
    const count = changeOwnerRecursive(folder, newOwnerEmail);
    successCount += count;

  } catch (e) {
    Logger.log(`エラー: ${e.message}`);
    errorCount++;
  }

  // **B4セルに結果を記録**
  if (successCount > 0) {
    sheet.getRange(4, 2).setValue(`成功 (${successCount} 件のファイル/フォルダを譲渡)`);
  } else {
    sheet.getRange(4, 2).setValue(`エラー (${errorCount} 件の処理失敗)`);
  }

  // **完了後のポップアップ**
  ui.alert("処理が完了しました。");
}

function changeOwnerRecursive(folder, newOwnerEmail) {
  if (!folder) {
    Logger.log("エラー: 無効なフォルダが渡されました。処理をスキップします。");
    return 0;
  }

  let count = 0;
  const userEmail = Session.getActiveUser().getEmail(); // 実行者のメールアドレスを取得

  // フォルダ内のファイルのオーナーを変更
  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    try {
      const currentOwner = file.getOwner().getEmail();
      if (currentOwner === userEmail) { // 現在のオーナーが自分の場合のみ変更
        file.setOwner(newOwnerEmail);
        count++;
        Logger.log(`File: ${file.getName()} のオーナーを ${newOwnerEmail} に変更しました。`);
      } else {
        Logger.log(`File: ${file.getName()} は既に ${currentOwner} がオーナーのため変更をスキップしました。`);
      }
    } catch (e) {
      Logger.log(`File: ${file.getName()} のオーナー変更中にエラー: ${e.message}`);
    }
  }

  // サブフォルダのオーナーを変更
  const subfolders = folder.getFolders();
  while (subfolders.hasNext()) {
    const subfolder = subfolders.next();
    try {
      if (!subfolder) {
        Logger.log("エラー: 無効なサブフォルダが見つかりました。スキップします。");
        continue;
      }

      const currentOwner = subfolder.getOwner().getEmail();
      if (currentOwner === userEmail) { // 現在のオーナーが自分の場合のみ変更
        subfolder.setOwner(newOwnerEmail);
        count++;
        Logger.log(`Folder: ${subfolder.getName()} のオーナーを ${newOwnerEmail} に変更しました。`);
      } else {
        Logger.log(`Folder: ${subfolder.getName()} は既に ${currentOwner} がオーナーのため変更をスキップしました。`);
      }
      count += changeOwnerRecursive(subfolder, newOwnerEmail);
    } catch (e) {
      Logger.log(`Folder: ${subfolder.getName()} のオーナー変更中にエラー: ${e.message}`);
    }
  }

  return count;
}
スクリプトの説明
changeOwnerFromSheet():メインの関数
function changeOwnerFromSheet() {
  • この関数がメインの処理を担当します。
実行前にポップアップで確認
const ui = SpreadsheetApp.getUi();
const response = ui.alert(
  "オーナー権を譲渡しますか?", 
  "この操作は元に戻せません。\n続行する場合は「はい」を押してください。",
  ui.ButtonSet.YES_NO
);

if (response != ui.Button.YES) {
  Logger.log("処理がキャンセルされました。");
  return;
}
  • スクリプト実行前に、誤操作を防ぐための確認ポップアップを表示します。
  • 「はい」を押した場合のみ処理を継続 します。
スプレッドシートのデータを取得
const sheetName = "オーナー権譲渡";
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

if (!sheet) {
  Logger.log(`シート "${sheetName}" が見つかりません。`);
  return;
}

const dataRange = sheet.getRange(1, 1, sheet.getLastRow(), 2).getValues();
const header = dataRange.map(row => row[0]);
const data = dataRange.map(row => row[1]);

const folderIdIndex = header.indexOf("フォルダID");
const emailIndex = header.indexOf("新しいオーナーのメールアドレス");
  • スプレッドシートの「オーナー権譲渡」シートから フォルダID・新しいオーナーのメールアドレス を取得します。
  • ヘッダー(A列)を検索し、必要なデータ(B列)を取得
フォルダを特定
let folder;
const folderId = data[folderIdIndex];
const newOwnerEmail = data[emailIndex];

if (!folderId) {
  throw new Error("フォルダIDが空です");
}

folder = DriveApp.getFolderById(folderId);
  • スプレッドシートに記載された フォルダID またはフォルダ名 からフォルダを取得します。
  • フォルダが見つからなかった場合はエラーを返します。
フォルダ内のファイルとサブフォルダのオーナー権を変更
const count = changeOwnerRecursive(folder, newOwnerEmail);
  • オーナー権の変更は、changeOwnerRecursive() 関数で実行します。
実行結果をスプレッドシートに記録
if (count > 0) {
  sheet.getRange(4, 2).setValue(`成功 (${count} 件のファイル/フォルダを譲渡)`);
} else {
  sheet.getRange(4, 2).setValue("エラー: オーナー権を譲渡できませんでした。");
}
  • 処理結果を B4 セルに記録します。
changeOwnerRecursive(folder, newOwnerEmailファイルとサブフォルダのオーナー権変更
function changeOwnerRecursive(folder, newOwnerEmail) {
  let count = 0;
  const userEmail = Session.getActiveUser().getEmail();
  • この関数では、フォルダ内のすべての ファイルとサブフォルダのオーナー権を変更 します。
  • 実行者(現在のオーナー)のメールアドレスを取得
フォルダ内のファイルのオーナーを変更
const files = folder.getFiles();
while (files.hasNext()) {
  const file = files.next();
  try {
    if (file.getOwner().getEmail() === userEmail) {
      file.setOwner(newOwnerEmail);
      count++;
      Logger.log(`File: ${file.getName()} のオーナーを ${newOwnerEmail} に変更しました。`);
    }
  } catch (e) {
    Logger.log(`File: ${file.getName()} のオーナー変更中にエラー: ${e.message}`);
  }
}
  • ファイルごとにオーナーを変更し、処理件数をカウント
フォルダ内のサブフォルダのオーナーを変更
const subfolders = folder.getFolders();
while (subfolders.hasNext()) {
  const subfolder = subfolders.next();
  try {
    if (subfolder.getOwner().getEmail() === userEmail) {
      subfolder.setOwner(newOwnerEmail);
      count++;
      Logger.log(`Folder: ${subfolder.getName()} のオーナーを ${newOwnerEmail} に変更しました。`);
    }
    count += changeOwnerRecursive(subfolder, newOwnerEmail);
  } catch (e) {
    Logger.log(`Folder: ${subfolder.getName()} のオーナー変更中にエラー: ${e.message}`);
  }
}
  • サブフォルダごとにオーナーを変更し、再帰的に処理
STEP
スクリプトを保存

スクリプトを書いたら、名前を付けて保存します。

(例:「オーナー権譲渡」)

STEP
スクリプトを実行

スクリプトを実行してオーナー権を譲渡します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

スクリプト実行後、ポップアップが表示されるので [はい] を選択します。

(フォルダ名またはID、新しいオーナーのメールアドレスが間違いないことを再確認)

STEP
オーナー変更完了

処理が完了すると、B4セルに「成功 (X 件のファイル/フォルダを譲渡)」が表示されます。

該当するファイル、サブフォルダが新しいオーナーに切り替わったことをGoogleドライブ内で確認します。

注意事項

親フォルダのオーナー権は手動で変更する必要あり

Google Apps Scriptでは、親フォルダのオーナー権を変更できないため、手動で変更する必要があります。

すでに他のユーザーがオーナーのファイルは変更できない

スクリプトは、現在のオーナーが実行者(自分)の場合のみオーナー権を変更します。

すでに他のユーザーがオーナーのファイルはスキップされます。

スクリプトの最大実行時間は6分

Google Apps Scriptの実行時間制限は6分間 です。

フォルダやファイルが大量にある場合、すべてのオーナー権を譲渡する前にスクリプトが中断される可能性があります。

ファイル数が多い場合は分割して処理する

スクリプトが途中で中断されると、一部のファイルやフォルダのオーナー権が変更され、残りが未変更のままとなる可能性があります。

1回の実行で処理しきれない場合は、フォルダをいくつかに分けてスクリプトを実行することを推奨 します。

Google Workspace のポリシーにより変更が制限される場合がある

Google Workspace の管理者がオーナー権の変更を制限している場合、スクリプトが正しく動作しないことがあります。

一度オーナー権を譲渡すると元に戻せないので注意

オーナー権を譲渡すると、元の所有者はオーナー権を取り戻すことができません。

(元に戻す場合は新しいオーナーからオーナー権を譲渡してもらう必要があります。

変更前に再度ご確認してからスクリプトを実行してください。

まとめ

Google Apps Scriptを使えば、Googleドライブ内のフォルダやファイルのオーナー権を一括で変更できます。(Google Workspaceユーザーのみ)

スプレッドシートに情報を入力し、スクリプトを実行するだけで手作業の負担を減らせます。

ですが、親フォルダのオーナー権は手動対応が必要なことや、ファイルのオーナー権を変更後は元に戻せないためご注意ください。

今回のスクリプトを活用すれば、Googleドライブの管理がより効率的になり、チームやプロジェクトの引き継ぎ作業などにも役立てることができます。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

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

コメント

コメントする

目次