GASを使って自分がオーナーのGoogleドライブ内のファイル・フォルダ一覧を出力→オーナー権限移譲まで実施する

## はじめに

:::note info
※本記事は、GAS(Google Apps Script)やバッチファイルを使って、バックオフィス周りの業務効率化、業務改善を実施している非エンジニアによる記事です。
:::

Google Driveを利用していると、自分がオーナーのファイルやフォルダが増えすぎて管理が難しくなることがあります。特に、**退職者のデータを他のユーザーに引き継ぐ場合**や、**プロジェクトを別の担当者に移譲する必要がある場合**、一つ一つ手動で対応するのは非常に手間がかかります。
※実際に、私が所属している会社では、「**退職者が権限移譲を実施しておらず大事なファイルが消えてしまい、情シスの方々に復活対応してもらう**」といったケースを何度も見てきました。

この記事では、**Google Apps Script (GAS)** を活用して以下のタスクを効率化する方法を解説します。

1. **自身がオーナーの「ファイル」一覧を出力**
2. **「ファイル」のオーナー権限を他ユーザーに移譲**
3. **自身がオーナーの「フォルダ」一覧を出力**
4. **「フォルダ」のオーナー権限を他ユーザーに移譲**

---
## 実践するスクリプトの概要

### 1. 自身がオーナーの「ファイル一覧」を出力するスクリプト

#### 主な機能

- Google Drive内の、自分がオーナーのファイルをスプレッドシートに一覧として出力します。
- ファイル名、URL、MIMEタイプ、オーナー情報を含む詳細を取得します。

#### コード

```javascript
function listMyOwnedDriveFilesAll() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ファイル一覧");
  const startRow = sheet.getRange(sheet.getMaxRows(), 2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1;
  const startColumn = 2;

  // 現在のユーザーのメールアドレスを取得
  const myEmail = Session.getActiveUser().getEmail();
  const files = DriveApp.searchFiles('"me" in owners');
  const data = [];

  // ファイル情報を配列に追加
  while (files.hasNext()) {
    const file = files.next();
    data.push([file.getName(), file.getUrl(), file.getMimeType(), myEmail]);
  }

  // スプレッドシートに出力
  if (data.length > 0) {
    sheet.getRange(startRow, startColumn, data.length, 4).setValues(data);
  }
}
```

#### 実行手順

1. 新しいスプレッドシートを作成し、シート名を`ファイル一覧`に変更します。
※添付のようなフォーマットにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/db7cd7a2-f9d4-73b7-898f-aaafe4545edd.png)

2. `拡張機能`→`Apps Script`をクリックし、GASプロジェクトを新規作成し、上記コードをコピー＆ペーストしてください。
※GASのファイル名は、ご自身にとって分かりやすいファイル名にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/4d0477f7-7fd2-4998-e606-0b8143d74f93.png)

3. スクリプトを実行すると、スプレッドシートにファイル一覧が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/eed572e2-1ef8-d542-fd1f-ee03cda4775f.png)


---

### 2. ファイルのオーナー権限を移譲するスクリプト

#### 主な機能

- 出力したファイル一覧をもとに、指定した新しいオーナーに権限を移譲します。

#### コード

```javascript
function transferOwnershipFiles() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ファイル一覧");

  // 出力の始まりの行番号（ファイル情報のリストが始まる行）
  const startRow = 5;

  // C列：ファイルURL, H列：新しいオーナーのメールアドレス
  const fileUrlColumn = 3; // C列（ファイルURL）
  const newOwnerColumn = 8; // H列（新しいオーナーのメールアドレス）
  const statusColumn = 9; // I列（ステータス）

  // データの範囲を取得（C列とH列のデータを取得）
  const dataRange = sheet.getRange(startRow, fileUrlColumn, sheet.getLastRow() - startRow + 1, 7); // C列からI列までの範囲
  const data = dataRange.getValues();
  
  // データを1行ずつ処理
  for (var i = 0; i < data.length; i++) {
    var fileUrl = data[i][0]; // C列のファイルURL
    var newOwnerEmail = data[i][5]; // H列の新しいオーナーのメールアドレス

    if (fileUrl && newOwnerEmail) {
      try {
        // ファイルIDをURLから抽出
        var fileId = fileUrl.match(/[-\w]{25,}/);
        if (fileId) {
          var file = DriveApp.getFileById(fileId[0]);

          // 新しいオーナーに権限を与え、オーナー権限を移譲
          file.addEditor(newOwnerEmail); // 新しいオーナーに編集権限を付与
          file.setOwner(newOwnerEmail); // 新しいオーナーを設定
          
          // I列（ステータス列）に「完了」をセット
          sheet.getRange(startRow + i, statusColumn).setValue('完了');
          
          console.log('オーナー権限を' + newOwnerEmail + 'に移譲しました。ファイルURL：' + fileUrl);
        } else {
          console.log('ファイルIDがURLから取得できませんでした: ' + fileUrl);
        }
      } catch (e) {
        console.log('エラー: ' + e.message + ' ファイルURL: ' + fileUrl);
      }
    }
  }
}

```

#### 実行手順

1. ファイル一覧を出力後、H列（新しいオーナーのメールアドレス）を入力します。
2. スクリプトを実行すると、指定した新しいオーナーに権限が移譲され、I列に`完了`のステータスが反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/aa072923-9dc1-e9e6-777b-ec42d4aed941.png)

---

### 3. 自身がオーナーの「フォルダ一覧」を出力するスクリプト

#### コード

```javascript
function listMyOwnedFolders() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォルダ一覧");

  // B列の最終行の1行下から出力開始
  const startRow = sheet.getRange(sheet.getMaxRows(), 2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1;
  const startColumn = 2; // B列

  // 現在のユーザーのメールアドレスを取得
  const myEmail = Session.getActiveUser().getEmail();

  // 自分がオーナーのフォルダを検索
  const folders = DriveApp.searchFolders('"me" in owners');
  const data = []; // フォルダ情報を蓄積する配列

  console.log("フォルダ検索を開始しました");

  // フォルダを1つずつ処理して配列に追加
  while (folders.hasNext()) {
    const folder = folders.next();

    // フォルダの情報を取得
    const folderName = folder.getName();
    const folderUrl = folder.getUrl(); // フォルダURLを取得
    const folderType = "application/vnd.google-apps.folder";
    const ownerEmail = myEmail; // オーナーは自分自身なので、直接設定

    console.log(`フォルダ名: ${folderName}, URL: ${folderUrl}, MIMEタイプ: ${folderType}`);

    // フォルダ情報を配列に追加
    data.push([folderName, folderUrl, folderType, ownerEmail]);
  }

  // まとめてシートに書き込み
  if (data.length > 0) {
    sheet.getRange(startRow, startColumn, data.length, 4).setValues(data);
  } else {
    console.log("検索結果は0件でした。");
  }
}

```

#### 実行手順

1. 新しいスプレッドシートを作成し、シート名を`フォルダ一覧`に変更します。
※添付のようなフォーマットにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/0635c31a-3504-3b43-9191-3f8c47682818.png)

2. 先ほど作成したGASプロジェクト内で、ファイルを新規作成し、上記コードをコピー＆ペーストしてください。
※GASのファイル名は、ご自身にとって分かりやすいファイル名にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/4619f844-68c5-c358-5407-8d7168b59532.png)

3. スクリプトを実行すると、スプレッドシートにフォルダ一覧が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/beaea2ee-a791-76df-1380-7dc2911fa0bc.png)

---

### 4. フォルダのオーナー権限を移譲するスクリプト

#### コード

```javascript
function transferOwnershipFolders() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォルダ一覧");

  // 出力の始まりの行番号（フォルダ情報のリストが始まる行）
  const startRow = 5;

  // C列：フォルダURL, H列：新しいオーナーのメールアドレス
  const folderUrlColumn = 3; // C列（フォルダURL）
  const newOwnerColumn = 8; // H列（新しいオーナーのメールアドレス）
  const statusColumn = 9; // I列（ステータス）

  // データの範囲を取得（C列とH列のデータを取得）
  const dataRange = sheet.getRange(startRow, folderUrlColumn, sheet.getLastRow() - startRow + 1, 7); // C列からI列までの範囲
  const data = dataRange.getValues();
  
  // データを1行ずつ処理
  for (var i = 0; i < data.length; i++) {
    var folderUrl = data[i][0]; // C列のフォルダURL
    var newOwnerEmail = data[i][5]; // H列の新しいオーナーのメールアドレス

    if (folderUrl && newOwnerEmail) {
      try {
        // フォルダIDをURLから抽出
        var folderId = folderUrl.match(/[-\w]{25,}/);
        if (folderId) {
          var folder = DriveApp.getFolderById(folderId[0]);

          // 新しいオーナーに権限を与え、オーナー権限を移譲
          folder.addEditor(newOwnerEmail); // 新しいオーナーに編集権限を付与
          folder.setOwner(newOwnerEmail); // 新しいオーナーを設定
          
          // I列（ステータス列）に「完了」をセット
          sheet.getRange(startRow + i, statusColumn).setValue('完了');
          
          console.log('オーナー権限を' + newOwnerEmail + 'に移譲しました。フォルダURL：' + folderUrl);
        } else {
          console.log('フォルダIDがURLから取得できませんでした: ' + folderUrl);
        }
      } catch (e) {
        console.log('エラー: ' + e.message + ' フォルダURL: ' + folderUrl);
      }
    }
  }
}

```

---

## 実行手順
1. フォルダ一覧を出力後、H列（新しいオーナーのメールアドレス）を入力します。
2. スクリプトを実行すると、指定した新しいオーナーに権限が移譲され、I列に`完了`のステータスが反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/a50ec6b6-1668-ed1d-fe6c-22f248b21bbf.png)

:::note info
スプレッドシートのメニューバーからスクリプト実行できるようにしておくと便利です。
[やり方はこちらから](https://qiita.com/yuto-h/items/a683d8ac45ad00645e98)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628613/0896dedc-73ec-ea83-8b34-65a0727f3e2f.png)


---

## おわりに

いかがでしたでしょうか。
この記事で紹介したスクリプトを活用すれば、権限移譲がスムーズかつ短時間で実施でき、ストレスフリーな引継ぎ作業が実現できると思います。

ぜひ試してみてください！

---