LoginSignup
3
8

More than 1 year has passed since last update.

GASでGoogleドライブのフォルダ・ファイル構造をスプレッドシートに一覧化する

Last updated at Posted at 2021-06-22

はじめに

こんにちは。人差し指の詰めが割れ欠けてて、でも皮膚はくっついているので困っています、筆者です:innocent:

さて、今回はGoogleドライブのフォルダ構造とそのフォルダに属しているファイルたちをスプレッドシートで見れるようにGASを書いていこうと思います。
参考になれば幸いです:pray:

方針

  1. Googleドライブのルートフォルダから所属するフォルダがある場合再帰的に掘っていく.
  2. フォルダ掘ると同時にファイルがあれば配列に追加していく.
  3. 配列の長さを調整
  4. ヘッダー追加
  5. スプレッドシート書き込み

Googleドライブのフォルダ・ファイル構造をスプレッドシートで一覧化する

スクリプトはこちらです。

const sheet = SpreadsheetApp.getActiveSheet()
const headers = ['No.', 'id', 'size', 'mimeType', 'url']

const main = () => {
  let folder = DriveApp.getRootFolder(),
    folder_name = folder.getName(),
    data = []

  data = seek(data, folder, [folder_name])
  data = convert(data)

  // スプレッドシートに書き込み.
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data)
}

const seek = (data, folder, ancestors) => {
  const files = folder.getFiles()
  let file
  while (files.hasNext()) {
    file = files.next()

    // ファイル数やフォルダ数が少ない場合はここで直接スプレッドシートに書き込んでもいいけど処理遅いからおすすめしないよ.
    data.push([
      '=row() - 1',
      file.getId(),
      file.getSize(),
      file.getMimeType(),
      file.getUrl(),
      ...ancestors,
      file.getName()
    ])
  }

  const folders = folder.getFolders()
  let folder_descendant
  while (folders.hasNext()) {
    folder_descendant = folders.next()
    seek(data, folder_descendant, [...ancestors, folder_descendant.getName()])
  }

  return data
}

const convert = data => {
  // 深さの最大値を取得.
  const depth_max = data.map(e => e.length).reduce((a, b) => a > b ? a : b)

  // 深さを基に配列の長さを統一する.
  // 配列の長さが異なると後続でスプレッドシートに値を書き込む際に怒られる...
  for (let i in data) {
    if (data[i].length < depth_max) {
      data[i] = [
        ...data[i],
        ...[...Array(depth_max - data[i].length).keys()].map(i => '')
      ]
    }
  }

  // header追加.
  data = [
    [
      ...headers,
      ...[...Array(depth_max - headers.length).keys()].map(i => `Layer${i + 1}`)
    ],
    ...data
  ]

  return data
}

実行結果

1.png

所感

convert関数で処理している最後にスプレッドシートに渡す配列の長さを調整する処理ですが、内部的にかなりfor文が回っています... :sob:

ただ、data配列にpushせずそのタイミングでスプレッドシートに1行ずつ書き込むとAPIのリクエストがその数発生し、書き込み速度が遅くなるのでそれはもっとおすすめしないです。

そのため、スマートではないですが、GAS側で少し負荷掛かってますが、ご留意を:pray:
総じてこっちの方が高速処理できますので:pray:

おわりに

意外と600ファイルくらいあってビビりました。
いらないファイル消していこうと思います:pray:

それでは!

3
8
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
3
8