2018年3月11日日曜日

Googleドライブでフォルダに属していないファイルを集める

Googleドライブを使用していると、どのフォルダにも属していないファイルが見つかることがある。 ドライブ内を検索したり、ストレージ容量消費が多い順にファイルを並べたりしたとき目にすることがある。
  • フォルダに属しているファイルの情報には”パス”という項目がある。

  • フォルダに属していないファイルの情報には本来あるべき”パス”という項目がない。
見えないファイルがあるのは気持ち悪いので、行方不明ファイルを一か所のフォルダに集めちゃおうというのが今回の内容。

手順
  1. GoogleドライブにGoogle Apps Scriptをインストールし、新規のスクリプトを作成する。詳細はここを参照。
  2. 下記のスクリプトを張り付ける。
  3. スクリプト内のMain関数を実行する。(メニュー>実行>関数を実行>Main)
  4. ドライブで管理しているファイル数が少ないときは一回の実行で完了するが、ファイル数が多くなると時間がかかり、Google Apps Scriptの制限の一つである6分以内という制限に引っかかってしまうため、繰り返し実行することですべてのファイルをスキャンする。処理が完了したらメールで通知を行う。
スクリプト

  • 本スクリプトはフォルダに属していないファイルをマイドライブ直下のLostFilesフォルダにまとめる。
  • Main関数を一回実行すると処理が終了するまで定期的にスクリプトが実行される。
  • 処理が完了するとメールが送られてくる。

// http://blog.hikozaru.com/2018/03/google.html
// メニュー>実行>関数を実行>Main を選択して実行してください
function Main(){
  PropertiesService.getUserProperties().deleteAllProperties();
  FindLostFiles();
}

function FindLostFiles(){
  var StartTime   = new Date();

  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  trigger = ScriptApp.newTrigger("FindLostFiles")
  .timeBased()
  .everyMinutes(5)
  .create();
    
  var UserProperties = PropertiesService.getUserProperties();
  var ContinuationToken = UserProperties.getProperty("ContinuationToken");

  if(ContinuationToken) {
    var files = DriveApp.continueFileIterator(ContinuationToken);
  } else {
    var files = DriveApp.getFiles();
  }
  
  var Folder = getSubFolder( DriveApp.getRootFolder(),'LostFiles');
  while(files.hasNext()) {
    var CurrentTime = new Date();
    if( (CurrentTime - StartTime) > 4*60*1000 ){
      UserProperties.setProperty("ContinuationToken", files.getContinuationToken());
      return;
    }
    
    var file = files.next();
    if( !file.getParents().hasNext() )
    {
      Folder.addFile(file);
    }
  }
  // トークンを削除
  ScriptApp.deleteTrigger(trigger);
  UserProperties.deleteAllProperties();
  SendResult("処理終了\n" + Folder.getUrl());
}

function getSubFolder( baseFolder, subFolderName ) {
  var subFolders = baseFolder.getFoldersByName(subFolderName);
  if( subFolders.hasNext() )
  {
    return subFolders.next();
  }
  return baseFolder.createFolder(subFolderName);
}

function SendResult(MailBody){
  var address = Session.getActiveUser().getEmail();
  GmailApp.sendEmail(Session.getActiveUser().getEmail(), "フォルダに属していないファイルを探す", MailBody);
}

スクリプトの説明

  • Main関数はスタート用の関数。
  • FindLostFilesが時間主導トリガとして実行される。
  • スクリプト起動から4分程度でスクリプトを中断する。
  • 再開用のトリガはスクリプト起動時に設定するので中断時には設定不要。
  • 終了時にはファイルを集めたフォルダのURIと主にスクリプトの終了をメールで通知する。

参考にした情報




0 件のコメント:

コメントを投稿