Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
57
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

はじめに

前回、 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に通知したりもいろいろできるかな、と思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
57
Help us understand the problem. What are the problem?