見出し画像

GAS - Google ドライブ のフォルダ内データ一覧取得 / 引き継ぎに備えて

Google ドライブ に保存しているデータ一覧を取得する方法をまとめました!

ドライブで共有している学校の資料や教材もたくさんあるかと思います。

そして、

それらのデータを引き継がない

といけないという、処理が待っていますね。
これまで、適切にデータ管理をされてきた方は不要なものだと思いますけど笑

学校の先生って、自治体によって違うと思うけど、

異動が決まって(公表されて)ちゃんと引き継ぎができる時間で、ほぼなくないですか?笑

自分は、ちゃんと引き継ぎをされた覚えがありません!🤣笑

荷物の整理だけでほとんど終わって、ドサッと資料を渡されて終わり…なんてこともザラですよね笑

そして、コロナ禍で突っ走ってくると、

いろんなデータが整理されずに自分のマイドライブに入ってる…

なんてこともありますよね!笑

これを機に、データ整理をしていけたらいいですね!🤣

また、どのデータを誰と共有しているのかとか、忘れがちですよね。

それも確認できたりしますね!
前置きが長かったですね笑

[1] Google スプレッドシート の準備

こちらからコピーを作成してください!

[2] スクリプトの確認

拡張機能Apps Script をクリックしてスクリプトを確認しましょう!

[2-1] コードは2つに分けています。

  • マイドライブ.gs

  • 子.gs

左側のファイルをクリックすると切り替えることができます。

[2-2] [2-3] で解説をしていますが、不要な人は飛ばしてください!!

[2-2] マイドライブ.gs

この中に、Google ドライブ で、マイドライブのルートフォルダ(いわゆる一番上のフォルダ)のファイルとフォルダを取得するスクリプトを入れてあります。

function delRows2() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = spreadsheet.getSheetByName('マイドライブファイル一覧');
  var ss2 = spreadsheet.getSheetByName('マイドライブフォルダ一覧');
  //clearContentメソッドで複数行を削除
  var lastRow1 = ss1.getLastRow();
  var lastRow2 = ss2.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告','マイドライブ用のシートをクリアしていいですか?',ui.ButtonSet.YES_NO);
  if(res == ui.Button.YES){
  ss1.getRange(2,1,lastRow1,9).clearContent();
  ss2.getRange(2,1,lastRow2,6).clearContent();
  }
}


function myDriveFile(){
// Google ドライブを取得する
var drive = DriveApp.getRootFolder();

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = drive.searchFiles(query);

// スプレッドシートを取得する
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var ss = sheet.getSheetByName('マイドライブファイル一覧');//アドレス氏名一覧のシート

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var editors= file.getEditors();
  var viewers = file.getViewers();
  var editor = [];
  var viewer = [];
  // 共有されているユーザーの一覧を出力する
  
  for (var i = 0; i < editors.length; i++) {
   editor.push(editors[i].getEmail());
    }
  for (var i = 0; i < viewers.length; i++) {
   viewer.push(viewers[i].getEmail());
    }
  ss.appendRow([file.getDateCreated(),file.getLastUpdated(),file.getName(),file.getUrl(),file.getMimeType(),file.getSharingAccess(),editor.join(),viewer.join()]);
}
}

function myDriveFolder(){
// Google ドライブを取得する
var drive = DriveApp.getRootFolder();

var query = "'me' in owners and trashed = false";

// 自分がオーナーのフォルダを検索する
var folders = drive.searchFolders(query);

// スプレッドシートを取得する
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var ss = sheet.getSheetByName('マイドライブフォルダ一覧');//アドレス氏名一覧のシート

// フォルダの一覧を出力する
while (folders.hasNext()){
  var folder = folders.next();
  ss.appendRow([folder.getDateCreated(),folder.getLastUpdated(),folder.getName(),folder.getUrl(),folder.getId(),folder.getSharingAccess()]);
}
}

少しだけ解説すると、

function delRows2() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = spreadsheet.getSheetByName('マイドライブファイル一覧');
  var ss2 = spreadsheet.getSheetByName('マイドライブフォルダ一覧');
  //clearContentメソッドで複数行を削除
  var lastRow1 = ss1.getLastRow();
  var lastRow2 = ss2.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告','マイドライブ用のシートをクリアしていいですか?',ui.ButtonSet.YES_NO);
  if(res == ui.Button.YES){
  ss1.getRange(2,1,lastRow1,9).clearContent();
  ss2.getRange(2,1,lastRow2,6).clearContent();
  }
}

で行っているのは、スプレッドシートをクリアする命令と警告の表示をする命令が入っています。

この警告の命令は↓で解説しています。

↓この命令で、マイドライブの一番上にあるフォルダ取得する、みたいな感じになっています。

var drive = DriveApp.getRootFolder();

そして、次に、ファイルやフォルダを検索する時の条件の設定です。
検索条件として、「ゴミ箱に入っていない」「自分がオーナーである」という条件を指定しています。

このように、searchFiles( ) の第一引数として、検索条件を指定するクエリを指定します。

初めての方には難しいと思うので、スルーしてもらっても構いません!

Google ドライブのクエリ構文は、以下のようになります。

プロパティ名 演算子 値
  • プロパティ名には、Google ドライブのファイルやフォルダに対して指定できるプロパティを指定します。

  • 演算子には、比較演算子や論理演算子を指定します。

  • 値には、プロパティに対する値を指定します。

↓は、自分がオーナーのファイルを検索するようになっています。

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = drive.searchFiles(query);

そして、この while 文で一つずつ抽出していきます。

while (files.hasNext()){
  var file = files.next();
  var editors= file.getEditors();
  var viewers = file.getViewers();
  var editor = [];
  var viewer = [];

hasNext( ) は↓を参考にしてください。

また、

// ファイルの一覧を出力する
while (folders.hasNext()){
  var folder = folders.next();
  ss.appendRow([folder.getDateCreated(),folder.getLastUpdated(),folder.getName(),folder.getUrl(),folder.getId(),folder.getSharingAccess()]);
}
}

の部分でも使っている getなんとか というところですが。

Google ドライブ内のファイルを表す File オブジェクト のパラメータであり、下記のような種類があります。

  1. getBlob(): ファイルを表す Blob オブジェクトを取得する。

  2. getContentType(): ファイルの MIME タイプを取得する。

  3. getDateCreated(): ファイルが作成された日時を表す Date オブジェクトを取得する。

  4. getDescription(): ファイルの説明を取得する。

  5. getId(): ファイルの ID を取得する。

  6. getLastUpdated(): ファイルが最後に更新された日時を表す Date オブジェクトを取得する。

  7. getMimeType(): ファイルの MIME タイプを取得する。

  8. getName(): ファイル名を取得する。

  9. getOwner(): ファイルのオーナーを表す User オブジェクトを取得する。

  10. getUrl(): ファイルの URL を取得する。

今回は、3,5,6,7,8,10 を使っています。

また、↓の部分でそのファイルの編集者、閲覧者に誰が設定されているのかも取得するようにしています。

  var editors= file.getEditors();
  var viewers = file.getViewers();

そして、↓の部分でフォルダを検索するようにしています。

// 自分がオーナーのフォルダを検索する
var folders = drive.searchFolders(query);

フォルダの場合も、パラメータを指定しています。
こんな感じに。

// フォルダの一覧を出力する
while (folders.hasNext()){
  var folder = folders.next();
  ss.appendRow([folder.getDateCreated(),folder.getLastUpdated(),folder.getName(),folder.getUrl(),folder.getId(),folder.getSharingAccess()]);
}
}

このパラメータは、

  1. getId(): フォルダの ID を取得する

  2. getName(): フォルダ名を取得する

  3. getDateCreated(): フォルダが作成された日時を取得する

  4. getLastUpdated(): フォルダが最後に更新された日時を取得する

  5. getUrl(): フォルダの URL を取得する

  6. getParent(): フォルダの親フォルダを取得する

  7. getFiles(): フォルダ内のファイルの一覧を取得する

  8. getFolders(): フォルダ内のサブフォルダの一覧を取得する

  9. getSharingAccess(): フォルダの共有状態を取得する

のように、Folder オブジェクトには、フォルダの ID、名前、作成日時、最終更新日時、URL、親フォルダ、内部のファイルやサブフォルダ、共有状態などを取得するためのメソッドが用意されています。

今回は、1,2,3,4,5,9 を使っています。

[2-3] 子.gs

ここでは、特定のフォルダのIDを指定して、そのフォルダの中にある、ファイルとフォルダを取得するスクリプトになっています。

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('取得メニュー', [
      {name: 'マイドライブのファイル一覧', functionName: 'myDriveFile'},
      {name: 'マイドライブのフォルダ一覧', functionName: 'myDriveFolder'},
      {name: 'マイドライブの一覧クリア', functionName: 'delRows2'},
      {name: 'フォルダのファイル一覧', functionName: 'driveFile'},
      {name: 'フォルダのフォルダ一覧', functionName: 'driveFolder'},
      {name: 'クリア', functionName: 'delRows'},
    ]);
}

function delRows() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = spreadsheet.getSheetByName('ファイル一覧');
  var sheet2 = spreadsheet.getSheetByName('フォルダ一覧');
  //deleteRowsメソッドで複数行を削除
  var lastRow1 = sheet1.getLastRow();
  var lastRow2 = sheet2.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告','このシートをクリアしていいですか?',ui.ButtonSet.YES_NO);
  if(res == ui.Button.YES){
  sheet1.deleteRows(3,lastRow1);
  sheet1.getRange(1,2).clearContent();
  sheet2.deleteRows(3,lastRow2);
  sheet2.getRange(1,2).clearContent();
  }
}


function driveFile(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('ファイル一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = folder.searchFiles(query);

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var editors= file.getEditors();
  var viewers = file.getViewers();
  var editor = [];
  var viewer = [];
  // 共有されているユーザーの一覧を出力する
  
  for (var i = 0; i < editors.length; i++) {
   editor.push(editors[i].getEmail());
    }
  for (var i = 0; i < viewers.length; i++) {
   viewer.push(viewers[i].getEmail());
    }
  sheet.appendRow([file.getDateCreated(),file.getLastUpdated(),file.getName(),file.getUrl(),file.getMimeType(),file.getSharingAccess(),editor.join(),viewer.join()]);
}
}

function driveFolder(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('フォルダ一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";
// 自分がオーナーのファイルを検索する
var folfers = folder.searchFolders(query);

// ファイルの一覧を出力する
while (folfers.hasNext()){
  var folfer = folfers.next();
  sheet.appendRow([folfer.getDateCreated(),folfer.getLastUpdated(),folfer.getName(),folfer.getUrl(),folfer.getId(),folder.getSharingAccess()]);
}
}

ルートフォルダの時と違って、

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

↑のように、IDが入っているセルと取得して、その値を使っています。

また、メニューも作ってあるので、必要に応じて使ってください!

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('取得メニュー', [
      {name: 'マイドライブのファイル一覧', functionName: 'myDriveFile'},
      {name: 'マイドライブのフォルダ一覧', functionName: 'myDriveFolder'},
      {name: 'マイドライブの一覧クリア', functionName: 'delRows2'},
      {name: 'フォルダのファイル一覧', functionName: 'driveFile'},
      {name: 'フォルダのフォルダ一覧', functionName: 'driveFolder'},
      {name: 'クリア', functionName: 'delRows'},
    ]);
}

[3] 実行

せっかくなので、メニューからやってみてください。
最初は、権限の承認があります。

わからない方は、こちらを参考にしてください!

権限を承認したら、もう一度実行して初めて動きます。

  • マイドライブのファイル一覧

  • マイドライブのフォルダ一覧

は、特に設定する必要がなく実行します。

これらのシートを削除する場合は、マイドライブの一覧が表示されているシートを開いた状態で、一覧のクリアをクリックしてください。

  • フォルダのファイル一覧

  • フォルダのフォルダ一覧

は、中身を取得したい Google ドライブ のフォルダのIDをコピーして、ファイル一覧またはフォルダ一覧のシートで、B1 のセルに貼り付けてください。

[4] 取得したいフォルダのIDの準備

フォルダのIDは、画像を保存してある Google ドライブ のフォルダを開いた時のURLからコピーします。

↑の上部にあります。(隠してあるところです)

https://drive.google.com//drive/folders/フォルダのID

このIDをコピーして、B1 のセルに貼り付けてください!

その上で、メニューから実行してください。

一覧が取得されます。

ここで、注意してほしいのが、実行時間の制限です。

無料アカウント (  @gmail.com )では、6分間しか実行してくれないという制限があります。

よって、大量のファイルがあるフォルダだとエラーが出てしまいますので、注意が必要です。

今回は、ドライブのデータの情報を取得するプログラムです。

解説動画は、できましたら追記します!


最後に

私個人が皆さんが実行されたときにデータを取得するような内容は、一切含んでおりません。
また、データを故意に削除等をする内容も入っておりませんが、プログラムの実行に際するデータの破損や損失等は自己責任で行なってください。
(そのまま使って貰えば問題ないんですが、念の為。)


Twitter

Facebook

ポートフォリオ

YouTube チャンネル

いちばんやさしい Google Apps Script



何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️