見出し画像

GASでマイドライブ内の構造をスプレッドシートに出力してみた.ver2


マイドライブ内の構造をスプレッドシートに書き出す

以前にも作ったコードを修正しました。ファイル名にハイパーリンクを埋め込み、カーソルがファイル名の上に置くとプレビューが表示されます。
フォルダの色も階層によって変化します。薄いほど下の階層です。
出来上がりが以下の画像です。IDは隠しています。

GASとは

GASは簡単に言えばグーグルが提供しているプログラミング言語です。無料で利用できます。

フォルダ内一覧表示のサンプルコード

GASをある程度知っている方…下のコードをコピペすれば完了です。
GASをあまりよく分からない方…コードの下に説明を詳しく入れています。ご参照ください。

function ドライブ内表示() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('マイドライブ内表示シート') || SpreadsheetApp.getActiveSpreadsheet().insertSheet('マイドライブ内表示シート');
  sheet.clear(); // シートをクリア

  // シートのヘッダー設定
  sheet.getRange("A1:F1").setValues([["作成日時", "更新日時", "名前", "種類", "ファイルサイズ", "ID"]]);

  // 列幅の設定
  sheet.setColumnWidth(1, 130); // C列の幅を150に設定
  sheet.setColumnWidth(2, 130); // C列の幅を150に設定
  sheet.setColumnWidth(3, 200); // C列の幅を150に設定
  sheet.setColumnWidth(4, 150); // D列の幅を150に設定
  sheet.setColumnWidth(6, 380); // F列の幅を380に設定

  // マイドライブのルートフォルダを取得
  const rootFolder = DriveApp.getRootFolder();
  let row = 2;

  // マイドライブ内のファイルとフォルダを取得
  row = listFolderContents(rootFolder, sheet, row, 'マイドライブ', true, 0); 
}

// フォルダ内の内容をリスト
function listFolderContents(folder, sheet, row, folderName, isRoot = false, depth = 0) {
  const files = [];
  const folders = [];

  const folderIterator = folder.getFolders();
  const fileIterator = folder.getFiles();

  while (folderIterator.hasNext()) folders.push(folderIterator.next());
  while (fileIterator.hasNext()) files.push(fileIterator.next());

  folders.sort((a, b) => b.getLastUpdated() - a.getLastUpdated());
  files.sort((a, b) => b.getLastUpdated() - a.getLastUpdated());

  // ルートフォルダの場合は、フォルダ情報
  if (isRoot) {
    const range = sheet.getRange(row, 1, 1, 6);
    range.setValues([[
      formatDate(folder.getDateCreated()),
      formatDate(folder.getLastUpdated()),
      folderName,
      "", "", folder.getId()
    ]]);
    range.setBackground(getFolderColor(depth));

    // 名前にハイパーリンクを追加
    const nameRange = sheet.getRange(row, 3);
    nameRange.setValue(`=HYPERLINK("${folder.getUrl()}", "${folderName}")`);
    row += 1;
  }

  // ルートフォルダ内のファイル
  files.forEach(file => {
    const range = sheet.getRange(row, 1, 1, 6);
    range.setValues([[
      formatDate(file.getDateCreated()),
      formatDate(file.getLastUpdated()),
      file.getName(),
      file.getMimeType(),
      file.getSize(),
      file.getId()
    ]]);

    // ファイルの背景色を白
    range.setBackground("#FFFFFF");

    // 名前にハイパーリンク
    const nameRange = sheet.getRange(row, 3);
    nameRange.setValue(`=HYPERLINK("${file.getUrl()}", "${file.getName()}")`);
    row += 1;
  });

  // サブフォルダとその内容
  folders.forEach(subFolder => {
    const range = sheet.getRange(row, 1, 1, 6);
    range.setValues([[
      formatDate(subFolder.getDateCreated()),
      formatDate(subFolder.getLastUpdated()),
      subFolder.getName(),
      "", "", subFolder.getId()
    ]]);
    range.setBackground(getFolderColor(depth + 1)); // 子フォルダの深さを1増やして色を取得

    // 名前にハイパーリンク
    const nameRange = sheet.getRange(row, 3);
    nameRange.setValue(`=HYPERLINK("${subFolder.getUrl()}", "${subFolder.getName()}")`);
    row += 1;

    // サブフォルダ内のファイルを先に書き込み、次にサブフォルダ
    row = listFolderContents(subFolder, sheet, row, subFolder.getName(), false, depth + 1); 
  });

  return row;
}

// 日付を指定した形式でフォーマット
function formatDate(date) {
  return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm:ss');
}

// フォルダの深さに応じた色
function getFolderColor(depth) {
  switch (depth) {
    case 0: return "#FF6600"; // マイドライブ	
    case 1: return "#FF9966"; // 1つ下のフォルダ	
    case 2: return "#FFFF99"; // 2つ下のフォルダ	
    case 3: return "#FFEE66"; // 3つ下のフォルダ	
    case 4: return "#FFDD33"; // 4つ下のフォルダ	
    default: return "#FFCC00"; // 5つ以上下のフォルダ	
  }
}

GASの基本から

Dドライブにアクセスして、スプレッドシートを開きます。
拡張機能からAppScriptを選択します。

下のような画面が出てきたら、function myfunctionと書かれている部分をすべて消します。

次に上記のコードをすべて選択して貼り付けます。
保存を押し、実行を押します。

以下、赤印で囲んだところを選択

実行ログに実行完了と表示されたら、スプレッドシートを見て下さい。
完成です。

備考

最大5層下までのフォルダを色付けする設定です。

いいなと思ったら応援しよう!