49
62

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 5 years have passed since last update.

Google Drive上の指定のフォルダ以下のファイル一覧をSpreadSheetに書き出す

Last updated at Posted at 2018-09-25

はじめに

前回、 Google Driveにpythonでデータを登録する & Siderを使ってチェックしてみる というメモを書きました。

なんとか手元のファイル一式をGoogleDrive側にアップロードすることができましたが、実際数が多かったので、本当に全部アップロードできたのか確認したい...。

ということで、GoogleDriveのとあるフォルダにアップロードしたファイル一覧を、GoogleSpreadSheetに書き出す、ということをして、件数をチェックすることにします。

すでにたくさんの方がもっと詳しく、同様の内容を書いてくださっていますので、特段目新しいことはないのですが、また自分自身が必要になった時のために書き残しておきます。

今回やること

このような流れでチェックします。

  • 書き出すGoogleSpreadSheetを作成する
  • Google Apps Scriptを使って、特定のフォルダに入っているファイルを書き出す

シートを作って実行してみる

まずは書き出すためのスプレッドシートを作成します。
次に、メニューから「スクリプトエディタ」を選択し、Google Apps Scriptの編集画面を表示します。

script-editor.png

エディタには以下のようなコードを書きました。


function getFileListInFolder() {
  var folder_id = 対象のフォルダのID';
  var url = 'https://drive.google.com/drive/folders/' + folder_id,  // URL of Google Drive folder.
      paths = url.split('/'), // Separate URL into an array of strings by separating the string into substrings. 
      folderId = paths[paths.length - 1], // Get a last element of paths array.
      folder = DriveApp.getFolderById(folderId),
      files = folder.getFiles(),
      list = [],
      rowIndex = 1, // The starting row of a range.
      colIndex = 1, // The starting row of a column.
      ss, sheet,range,
      sheetName = 'シート1';
  
  // Creating a data array from a files iterator.
  // Note: Latest file is the first.
  while(files.hasNext()) {
    var buff = files.next();
    list.push([buff.getName(), buff.getUrl()]);
  };
  
  // folder.getFiles()では、ファイルは新しいものが最初に来ます
  // 登録された順にしたいので、reverse() で調整します
  list = list.reverse()
  
  ss = SpreadsheetApp.getActive();
  sheet = ss.getSheetByName(sheetName);
  range = sheet.getRange(rowIndex, colIndex, list.length, list[0].length);

  // 対象の範囲にまとめて書き出します
  range.setValues(list);
}

出来上がったら、三角のボタンを押して実行します。
(初回は、実行権限や認証のダイアログがでます)

GAS.png

結果、このように「シート1」に抽出結果が表示されました。

実行結果.png

Scriptについての補足

さて、これだけでは簡単なので、もう少し補足してみます。

書き出すシートの特定

今回は ss.getSheetByName(‘シート1'); という形で対象のシートを特定しました。
ここでは、SpreadSheetクラスのオブジェクトに対してメソッドを発行しています。

名前が分かっている場合はいいのですが、最初のシートや最後のシートを対象にする場合は、getSheets() を利用します。

例えば、SpreadSheet.getSheets()[0] で最初のシートとなります。

ファイルの一覧を取得する

フォルダの中のファイル一覧を取得するのは、この箇所です。

      folder = DriveApp.getFolderById(folderId),
      files = folder.getFiles(),

フォルダのIDからフォルダのオブジェクトを取得します。
次に、getFiles()メソッドで、一覧そのものではなくiteratorを取得します。

コメントで触れている通り、getFiles()を利用してループでファイルを抽出する場合、作成日時の新しいものから先に取り出されます。

もしSpreadSheetには登録したものを最初に書き出したい場合、一覧を逆順にします。

データを書き出す

書き出すシートを特定したら、セルの位置を特定してデータを登録する流れになります。
setValue(value) の場合は、セル1つに対して値を設定となりますが、今回は、setValues(Object) を使って、起点のセルから範囲選択をして、そこにデータの配列(二次元配列)をまとめて渡して書き込んでいます。

  range = sheet.getRange(rowIndex, colIndex, list.length, list[0].length);

  // 対象の範囲にまとめて書き出します
  range.setValues(list);

作成の時に気づいた点

Apps Scriptでもデバッグはできますが、できるだけ小さい処理に分割して、こまかく実行して動作チェックをするのがいいなというのは、ここでも感じました。
(なんにしても同じですね!)

参考情報

まとめ

今回は特に解説もなく、これだけです...。

もし対象のフォルダは定期的にデータがアップされるような性質のものでしたら、Apps Scriptを定期実行させて一覧を更新し、Slackに通知したりもいろいろできるかな、と思います。

49
62
3

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
49
62

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?