Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

akiko-pusu
コツコツと学習しながらのメモを書いています。Redmineのプラグイン開発に関連するものが多めです。記事にご興味を持っていただけたら嬉しいです!
https://daily-postit.hatenablog.com
crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした