0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2022-02-14

このツールは

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

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

使い方

  1. スプレッドシートをコピー
  2. 「概要」シートの犬の画像をクリック!
  3. 「file」シートに共有ドライブ配下の全ファイルが出力されます

image.png

ソース

main処理です。

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関係の処理をまとめています。

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;
}

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

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()
    ];
  }
}

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

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)
        );
      }, [])
    );

  }
}

ファイルのクラスです。

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());
  }
}

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

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);
}
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?