2020年7月26日日曜日

Google Driveで共有しているファイルやフォルダの一覧を表示する。

Googleドライブで共有しているものを探す方法を知りたい人がいたので、簡単にコードだけを張っておきます。(見てもらえそうなヒントだけ張っておきましたが、見てもらえるか、、、、)
といっても15,000程度のファイルを処理できるか検証途中です。

①GoogleのSpreadsheetでスクリプトエディタを開く
②以下のコードを張り付けて保存する
③メニューの「実行」>「関数を実行」>「start」を行う
④「ContinuationToken」というシートが追加され途中経過が保存される。
 6分間で処理しきれないので、処理を中断するためのトークンが保存されている
 A1セルおよびA2セルがFinishになったら処理終了
⑤結果は「SharedFolders」シートと「sharedFiles」シートに出力される。

  // メールに対する処理
function start()
{
  // ファイルとフォルダを並行して処理する
  // フォルダの処理は1分後にトリガ指定
  ScriptApp.newTrigger("CreateFolderList")
  .timeBased()
  .everyMinutes(5)
  .create();
  
  CreateFilesList();
  return;
}

function CreateFilesList() {
  
  // スクリプト実行開始時間を取得(6分制限用)
  var StartTime   = new Date();

  // トリガを削除する
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if( triggers[i].getHandlerFunction() == arguments.callee.name )
    {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  // 出力シート
  var resultSheet = getSheet('SharedFiles');

  // ContinuationTokenを保存するセルを取得
  var ContinuationTokenRange = getSheet('ContinuationToken').getRange("A1");

  // ContinuationTokenを取得
  var ContinuationToken = ContinuationTokenRange.getValue();
  if( ContinuationToken == "" ){
    // ContinuationTokenが空の時は全ファイルを取得
    var targets = DriveApp.getFiles();
  }else if( ContinuationToken == "Finish" ){
    // 処理が終了している場合は実行しない。
    return;
  }else{
    // ContinuationTokenを取得できた場合はイテレータにセット
    var targets = DriveApp.continueFileIterator(ContinuationToken);
  }

  while( targets.hasNext() )
  {
    // 5分間実行したら処理を止めて、次のトリガーを設定する。
    var CurrentTime = new Date();
    if( (CurrentTime - StartTime) > 5*60*1000 ){
      var trigger = ScriptApp.newTrigger(arguments.callee.name)
      .timeBased()
      .everyMinutes(5)
      .create();
      ContinuationTokenRange.setValue(targets.getContinuationToken());
      return;
    }

    // 処理対象を取得
    var target = targets.next();
    
    // 共有モードを取得
    var access = target.getSharingAccess();
    
    if( DriveApp.Access.PRIVATE != access )
    {
      // 共有している場合は出力用のデータを取得
      var path = createPathString(target);
      var owner = target.getOwner().getEmail();
      var id = target.getId();
      resultSheet.getRange(resultSheet.getLastRow()+1,1,1,4).setValues([[path,owner,access,id]]);
    }
  }
  ContinuationTokenRange.setValue("Finish");
  return;
}

function CreateFolderList() {
  
  // スクリプト実行開始時間を取得(6分制限用)
  var StartTime   = new Date();

  // トリガを削除する
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if( triggers[i].getHandlerFunction() == arguments.callee.name )
    {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  // 出力シート
  var resultSheet = getSheet('SharedFolders');

  // ContinuationTokenを保存するセルを取得
  var ContinuationTokenRange = getSheet('ContinuationToken').getRange("A2");

  // ContinuationTokenを取得
  var ContinuationToken = ContinuationTokenRange.getValue();
  if( ContinuationToken == "" ){
    // ContinuationTokenが空の時は全フォルダを取得
    var targets = DriveApp.getFolders();
  }else if( ContinuationToken == "Finish" ){
    // 処理が終了している場合は実行しない。
    return;
  }else{
    // ContinuationTokenを取得できた場合はイテレータにセット
    var targets = DriveApp.continueFolderIterator(ContinuationToken);
  }

  while( targets.hasNext() )
  {
    // 5分間実行したら処理を止めて、次のトリガーを設定する。
    var CurrentTime = new Date();
    if( (CurrentTime - StartTime) > 5*60*1000 ){
      var trigger = ScriptApp.newTrigger(arguments.callee.name)
      .timeBased()
      .everyMinutes(5)
      .create();
      ContinuationTokenRange.setValue(targets.getContinuationToken());
      return;
    }

    // 処理対象を取得
    var target = targets.next();
    
    // 共有モードを取得
    var access = target.getSharingAccess();
    
    if( DriveApp.Access.PRIVATE != access )
    {
      // 共有している場合は出力用のデータを取得
      var path = createPathString(target) + "/";
      var owner = target.getOwner().getEmail();
      var id = target.getId();
      resultSheet.getRange(resultSheet.getLastRow()+1,1,1,4).setValues([[path,owner,access,id]]);
    }
  }
  ContinuationTokenRange.setValue("Finish");
  return;
}

// targetファイル/フォルダの親フォルダをループしてパスを生成する
function createPathString(target)
{
  var path = target.getName();
  var cur = target;
  while( cur.getParents().hasNext() ){
    cur = cur.getParents().next();
    path = cur.getName() + "/" + path;
  }
  return path;
}

// 名前を指定してシートを取得、シートがないときは新規に作成する
function getSheet(sheetName)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  if( sheet === null )
  {
    sheet = ss.insertSheet(sheetName)
  }
  return sheet;
}

0 件のコメント:

コメントを投稿

質問、要望、指摘など書いていただいてもよいですが、対応できるとは限りませんのでご了承ください。私に対するものも含め他の人を嫌な気分になるようなコメントは避けてください。