2022/05/28に更新

【GASで監視】指定フォルダのアクティビティ記録を出力する

ドライブスプレッドシート

Drive Activity APIを利用して、指定フォルダの操作ログを取得するGoogle Apps Scriptです。サボりの監視やセキュリティインシデント発生時の調査などにどうぞ。

こんな悩みを解決します


  • リモートワークだけどみんなちゃんと仕事してるのかなー調べたいなー
  • 情報漏えいが発生した!犯人がどんなファイルを閲覧していたのか調査したい!

用意するもの


特にありません。GASの設置および出力先としてスプレッドシートを使用します。

このスクリプトで出来ること


  • 指定したGoogleドライブの、操作履歴を出力することができます。

使い方


1.スクリプトの実行

上のメニューにある「スクリプト実行」から「指定フォルダの操作ログを取得する」を実行します。

2.フォルダURLの入力

ログを取得したいフォルダのURLを入力してください。
Googleドライブを開いたときに、アドレスバーに表示される「https://drive.google.com/drive/folders/」で始まるURLです。

3.結果の確認

すこし待つと、「シートNを作成し、アクティビティログを出力しました!」と完了メッセージが表示されます。

書き出されたデータを見てみます。
下記項目が出力されます。

  • 日時(JSTに変換済み)
  • 実行者
  • アクション(edit(編集)、rename(ファイル名変更)、create(新規作成)など)
  • ファイル名
  • MIMETYPE
  • ファイルID

「実行者」が謎のIDで出力されますが、People APIを使うことでメールアドレスや名前に変換することが可能です。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00094/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('指定フォルダの操作ログを取得する', 'get_activities');

  // メニューを画面に追加する
  menu.addToUi();
}

function get_activities() {

  // ############### 事前設定エリア ココから ###############

  // アクティビティの取得期間を指定します。年月日時分秒の順番で指定してください。
  // ただし「月」は0〜11で表現しますので、実際の月より-1した値を入力してください。
  const date_from = new Date(2022, 4, 20, 0, 0, 0).getTime();
  const date_to = new Date(2022, 4, 30, 23, 59, 59).getTime();

  // ############### 事前設定エリア ココまで ###############


  // 画面にアラートを表示するためにUIオブジェクトを取得
  const ui = SpreadsheetApp.getUi();

  // 実行の確認メッセージを表示する
  const prompt = ui.prompt('アクティビティを出力したいフォルダのURLを入力してください', '例:https://drive.google.com/drive/folders/******************', ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたらスクリプトを終了する
  if (prompt.getResponseText() == ui.Button.CANCEL) {
    return;
  }

  // 入力されたURLからIDを部分だけを取得する
  const folder_id = prompt.getResponseText().match(/^.*folders\/(.*)/)[1];

  // 検索条件を指定する
  const request = {
    ancestor_name: 'items/' + folder_id, // 検索する場所の指定
    pageSize: 1000, // 取得件数を指定(最大1000件らしい?)
    filter: 'time >= ' + date_from + ' time <= ' + date_to // 取得する期間を指定
  };

  // アクティビティを取得
  const response = DriveActivity.Activity.query(request);
  const activities = response['activities'];

  // シートに書き込むデータを格納する配列
  const result = [];

  // アクティビティ1件ずつ、必要なデータだけ取得する
  for (let i = 0; i < activities.length; i++) {

    // 見やすくするため、入れ直す
    let activity = activities[i];

    // 変数を定義
    let action, mimetype, file_id, file_title, actor, timestamp;

    // 「ファイルそのものに対する操作」と、「コメントの操作」でオブジェクトの構造が異なるため条件分岐する
    if (typeof activity['targets'][0]['driveItem'] === 'undefined') {

      // コメントに関する各項目を取得する
      mimetype = activity['targets'][0]['fileComment']['parent']['mimeType']; // MIMETYPE
      file_id = activity['targets'][0]['fileComment']['parent']['name']; // ファイルのID
      file_title = activity['targets'][0]['fileComment']['parent']['title']; // ファイル名

    } else {

      // ファイルに対する操作を取得する
      mimetype = activity['targets'][0]['driveItem']['mimeType']; // MIMETYPE
      file_id = activity['targets'][0]['driveItem']['name']; // ファイルのID
      file_title = activity['targets'][0]['driveItem']['title']; // ファイル名

    }

    action = activity['actions'][0]['detail']; // アクティビティの種類(editやrenameなど)
    actor = activity['actors'][0]['user']['knownUser']['personName']; // 操作を実行した人のID
   
    // 操作が行われた日時を取得。JSTに変換する。
    timestamp = Utilities.formatDate(new Date(activity['timestamp']), 'JST', 'yyyy-MM-dd HH:mm:ss');

    // シート書き込み用の配列に追加する
    result.push([timestamp, actor, action, file_title, mimetype, file_id]);

  }

  // アクティブなスプレッドシートオブジェクトを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // 書き込み用のシートを追加する
  const sheet = ss.insertSheet();

  // 項目名を追加する
  result.unshift(['日時', '実行者', 'アクション', 'ファイル名', 'MIMETYPE', 'ファイルID']);

  // 結果の配列を元に、書き込み範囲を取得する
  const range = sheet.getRange(1, 1, result.length, result[0].length);

  // シートへ書き込み
  range.setValues(result);

  // 完了メッセージを表示
  ui.alert(sheet.getName() + 'を作成し、アクティビティログを出力しました!')

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

myfunc.jp