[googleDrive]共有ドライブ内ファイル一覧を出す

# このツールは
googleDriveの共有ドライブの配下のファイルをリンク付きですべて出力します。

- 共有ドライブは自分のgoogleアカウントがアクセスできるすべての共有ドライブを対象とします。


# 使い方

1. [スプレッドシート](https://docs.google.com/spreadsheets/d/11AJegi0QTeV3o2qVKMevtNQHXNQ_4q_jPWCf28miPfc/edit?usp=sharing)をコピー
2. 「概要」シートの犬の画像をクリック！
3. 「file」シートに共有ドライブ配下の全ファイルが出力されます


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172695/439e054a-caae-3ad3-8fce-9b2225504a6a.png)

# ソース

main処理です。

```javaScript:main.gs
function main() {

  const driveList = getDriveList();
  
  const outList = driveList.reduce((outList, drive) => {
    return outList.concat(drive.getOutListFileSheet());
  }, []);

  refreshSheet(
    SHEET_FILE.name,
    outList,
    SHEET_FILE.column.name,
    SHEET_FILE.row.data
  );
}

```

google関係の処理をまとめています。

```javaScript:google.gs
function getDriveList(){
  // 共有ドライブリストを取得
  const teamDriveList = Drive.Teamdrives.list().items;
  return teamDriveList.map(teamDrive => new GoogleDrive(teamDrive));
}

// フォルダーを再帰的に取得
function getGoogleFolderList(folderId){
  let folderList = [];
  const folders = DriveApp.getFolderById(folderId).getFolders();
  while(folders.hasNext()){
    const folder = folders.next();
    const googleFolder = new GoogleFolder(
      folder,
      getGoogleFolderList(folder.getId()),

    );
    folderList.push(googleFolder);
  }
  return folderList;
}

// ファイルリストを取得
function getFileList(folder){
  const fileList = [];
  const files = folder.getFiles();
  while(files.hasNext()){
    fileList.push(files.next());
  }
  return fileList;
}

```

共有ドライブのクラスです。

```javaScript:class/GoogleDrive.gs
class GoogleDrive{
  constructor(teamDrive){
    this.teamDrive = teamDrive;
  }

  getLink(){
    return getHyperLink(this.teamDrive.name, `https://drive.google.com/drive/folders/${this.teamDrive.id}`);
  }

  getOutListFileSheet(){

    return getGoogleFolderList(this.teamDrive.id).reduce((outList, googleFolder) => {
      const pathList = [googleFolder];
      return outList.concat(googleFolder.getOutList(pathList, this.getLink())); 
    }, []);
  }

  getOutListDriveSheet(){
    return [
      this.getLink()
    ];
  }
}

```


フォルダーのクラスです。


```javaScript:class/GoogleFolder.gs
class GoogleFolder{
  constructor(folder,  subGoogleFolderList){
    this.folder = folder;
    this.subGoogleFolderList = subGoogleFolderList;
  }

  isExistSubFolder(){
    return this.subGoogleFolderList.length > 0;
  }
  
  getText(){
    return getHyperLink(this.folder.getName(), this.folder.getUrl());
  }

  getOutList(pathList, teamDriveLink){

    const fileList = getFileList(this.folder);
    
    const outList = fileList.map(file => {
      const googleFile = new GoogleFile(file);

      const pathOutList = [...Array(20)].map((_, index) => {
        return pathList[index] === undefined ? '-' : pathList[index].getText();
      });
      return [
        googleFile.getText()
      ].concat(
        teamDriveLink,
        pathOutList
      );
    });


    return outList.concat(
      this.subGoogleFolderList.reduce((outList, subGoogleFolder) => {
        return outList.concat(
          subGoogleFolder.getOutList(pathList.concat(subGoogleFolder), teamDriveLink)
        );
      }, [])
    );

  }
}

```

ファイルのクラスです。


```javaScript:class/GoogleFile.gs
class GoogleFile{
  constructor(file){
    this.file = file;
  }

  renameFile(){
    const name = this.file.getName();
    const rename = name.replace(' のコピー', '');
    if(rename === name) return;
    
    file.setName(rename);
  }

  getText(){
    return getHyperLink(this.file.getName(), this.file.getUrl());
  }
}

```

スプレッドシート操作用です

```javaScript:sheet.gs
var SHEET_FILE = {
  name : 'file',
  row : {
    data : 3,
  },
  column : {
    name : 1,
  },
};

var SHEET_DRIVE = {
  name : 'drive',
  row : {
    data : 2,
  },
  column : {
    name : 1,
  },
};

function getHyperLink(text, url){
  return `=HYPERLINK("${url}", "${text}")`;
}

function refreshSheet(sheetName, outList, startColumn, startRow, spreadSheetId){

  if(!outList[0].length) return;
  const sheet = getSheet(sheetName, spreadSheetId);

  startRow = startRow ? startRow : 2;
  startColumn = startColumn ? startColumn : 1;
  sheet.getRange(startRow, startColumn, sheet.getLastRow(), outList[0].length).clear();
  sheet.getRange(startRow, startColumn, outList.length, outList[0].length).setValues(outList);
}

function getSheet(sheetName, spreadSheetId){
  const ss = (spreadSheetId !== undefined) ? SpreadsheetApp.openById(spreadSheetId) : SpreadsheetApp.getActive();
  return ss.getSheetByName(sheetName);
}
```